обновление переменной с помощью onClick для prop

#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, чтобы оно работало в компоненте класса.