#javascript #reactjs
#javascript #reactjs
Вопрос:
Я пытаюсь обновить приведенное ниже «число» внутри моего метода рендеринга с помощью кнопки толкателя. Я добавил функцию onClick к кнопке, нацеленной на мою переменную «num», но она ее не запускает? Я также попытался превратить ее в функцию со стрелкой, но это не сработало. Я что-то делаю? Константа «num» будет выполняться и циклически перебирать число, сгенерированное методом RandomPerson .. это всего лишь тест, но я хочу знать, что я делаю неправильно.
class App extends Component {
state = {
persons: [
{ name: 'test1', num: randomNum()},
{ name: 'test2', num: randomNum()}
]
}
randomPerson =() =>{
return Math.floor(Math.random()* this.state.persons.length)
}
render(){
const num = this.randomPerson()
return (
<React.Fragment>
<button onClick={this.num}>Switch Person</button>
<div>
<Person name={this.state.persons[num].name} randomNum={this.state.persons[num].num} />
</div>
</React.Fragment>
);
}
}
export default App;
Комментарии:
1. Работает ли вывод
name
prop?2. В
<button onClick={this.num}>Switch Person</button>
onClick
ничего не делает… Вам нужно передать функцию, чтобы заставить ее что-то делать
Ответ №1:
onClick
В React ожидается функция. в вашем коде вы передали возвращаемое значение this.randomPerson
, которое не является функцией.
Попробуйте это:
class App extends Component {
state = {
persons: [
{ name: 'test1', num: randomNum()},
{ name: 'test2', num: randomNum()}
]
}
randomPerson =() =>{
return Math.floor(Math.random()* this.state.persons.length)
}
render(){
return (
<React.Fragment>
<button onClick={this.randomPerson}>Switch Person</button>
{/* ^-- I changed this and removed the num declaration */}
<div>
<Person name={this.state.persons[num].name} randomNum={this.state.persons[num].num} />
</div>
</React.Fragment>
);
}
}
export default App;
Но я не уверен, что вы пытаетесь сделать с сгенерированным новым случайным числом randomPerson
. Я предполагаю, что вы можете использовать это число для выбора случайного пользователя. Для этого вам нужно будет добавить сгенерированное случайное число из randomPerson
состояния into. К сожалению, я полностью забыл, как это сделать в компонентах класса… Итак, я сделал это для вас с помощью функционального компонента ниже:
function App() {
const randomPerson = () => Math.floor(Math.random() * this.state.persons.length);
const [person, setPerson] = useState([
{ name: 'test1', num: randomNum()},
{ name: 'test2', num: randomNum()}
]);
const [currentPerson, setCurrentPerson] = useState(randomPerson());
const switchPerson = () => {
setCurrentPerson(randomPerson());
};
return (
<React.Fragment>
<button onClick={switchPerson}>Switch Person</button>
<div>
<Person name={person[currentPerson].name} randomNum={person[currentPerson].num} />
</div>
</React.Fragment>
);
}
Комментарии:
1. Я считаю, что вы правильно продумали функциональный компонент. Я все еще новичок в этом, но я думал, что константа num будет обновляться, потому что она связана с методом this.RandomPerson(), который возвращает случайное число, основанное на длине массива persons в состоянии. Я думаю, что это вернет число в this.state.persons[num].name в качестве реквизита. При нажатии кнопки с помощью onClick я ожидал, что каждый щелчок обновит const num, и это запустит метод RandomPerson в режиме реального времени.. думаю, нет. все еще пытаюсь!
2. Функциональный компонент должен работать для вас как есть. Вы можете использовать как функциональные, так и классовые компоненты вместе
3. Спасибо, Доминик! Я буду использовать это в настоящее время, пока я выясняю, как реализовать этот способ с помощью компонента класса. Я считаю, что для обновления приложения в окне мне нужно каким-то образом изменить состояние / prop, чтобы оно работало в компоненте класса.