Вы можете добавить состояние к этому компоненту, которое является логическим значением, которое переключает себя
class Card extends Component {
constructor(props) {
this.state = {
showFront: true
}
}...
И затем использовать ваш метод handleClick для переключения состояния назад и вперед
handleClick = (e) => {
this.setState({showFront: !this.state.showFront})
}
И в вашей функции рендеринга вы можете добавить условное отображение
render() {
return (
{
this.state.showFront
? {this.props.front}
: {this.props.back}
}
);
}
Комментарий к этому ответу был сделан, но удален - я думаю, что этот вопрос стоит затронуть.
В комментарии сказано, что вы должны использовать setState(updater())
и не передавать объект. Это правда, что когда приложение становится более сложным, у вас есть несколько обновлений состояния вместе, и состояния данных могут не соответствовать вашим ожиданиям, функция updater
является подходящей (setState является асинхронной и может выполнять пакетные вызовы, поэтому мы имеем функция, которая сбрасывает все и помогает нам поддерживать целостность состояний, сравнивая старые состояния с новыми.
, но для этого ответа и сложности вопроса обновление не требуется, и код должен работать просто отлично (и это доходит до точки использования состояния и переключения, что является правильным способом выполнения того, что было задано).
вы можете использовать функцию обновления в любое время, даже когда вам угодно - даже для самого простого изменения состояния. И, как сказано здесь , может быть, лучше всего всегда использовать его :)
для дополнительной информации React.Compoment setState & amp; Функция обновления
Вам не нужны две строки:
scale <- data[1]
serial <- data[2]
как scale и serial уже установлены из заголовков в read.table
.
Также scale <- data [1]
создает элемент из data.frame
data[1]
1 5
2 10
3 12
4 15
, тогда как scale
из read.table
является векторным
5 10 12 15
, а функция plot (scale, serial)
ожидает вектор, а не data.frame , поэтому вам просто нужно выполнить
plot(scale, serial)
Один подход к нанесению других столбцов данных на ось Y:
plot(scale,serial, ylab="")
par(new=TRUE)
plot(scale,spawn,axes=F, ylab="", type="b")
par(new=TRUE)
plot(scale,for., axes=F, ylab="", type="b")
par(new=TRUE)
plot(scale,worker,axes=F, ylab="", type="b")
Вероятно, есть способы сделать это лучше, но это выходит за рамки моих нынешних знаний о R ....
Я далеко не специалист по R, но думаю, вам нужен data.frame:
plot(data.frame(data[1],data[2]))
Это действительно хотя бы нарисуйте что-нибудь в моей настройке R!
Следуя совету в ответе luapyad, я придумал это. Я переименовал заголовок в «масштаб»:
scaling, serial, spawn, for, worker
5, 0.000178, 0.000288, 0.000292, 0.000300
10, 0.156986, 0.297926, 0.064509, 0.066297
12, 2.658998, 6.059502, 0.912733, 0.923606
15, 188.023411, 719.463264, 164.111459, 161.687982
, затем:
foo <- read.table("foo.csv", header=T,sep=",")
attach(foo)
plot( scaling, serial );
Попробуйте следующее:
data <- read.csv('foo.csv')
plot(serial ~ scale, data)
dev.new()
plot(spawn ~ scale, data)
dev.new()
plot(for. ~ scale, data)
dev.new()
plot(worker ~ scale, data)
Уже упомянутые атрибуты DebuggerDisplay и DebuggerBrowsable управляют видимостью элементов и отображаемым текстовым значением. Простое переопределение ToString () заставит отладчик использовать вывод этого метода.
Если вам нужен более сложный вывод, вы можете использовать / создать Debugger Visualizer , несколько примеров доступны здесь .
Microsoft предоставляет расширение отладчика, известное как SOS . Это чрезвычайно мощное (хотя и часто сбивающее с толку) расширение, которое является отличным способом диагностики «утечек», точнее, нежелательных ссылок на объекты, которые больше не требуются.
Следуя этим инструкциям позволит вам пройти через исходный код некоторых частей инфраструктуры.
В Visual Studio 2010 есть несколько улучшений и новых функций:
В вашем примере
plot(scale, serial)
не будет работать, потому что масштаб
и последовательный
оба являются фреймами данных, например
class(scale)
[1] "data.frame"
Вы можете попробовать следуя и используйте points ()
, как только график был создан, чтобы построить оставшиеся столбцы. Обратите внимание, что я использовал параметр ylim
на графике
, чтобы учесть диапазон в третьем столбце.
data <- read.csv('foo.csv', header=T)
plot(data$scale, data$serial, ylim=c(0,750))
points(data$scale, data$spawn, col='red')
points(data$scale, data$for., col='green')
points(data$scale, data$worker, col='blue')