Поднятие состояния в React

Скажи, что у меня есть этот класс реагирования. Это НЕ мой основной компонент, который я рендеринг. как я могу передать состояние, которое я установил здесь, вверх в родительский компонент.

class Player extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          playerOneName: ''
        }
        this.selectPlayerOne = this.selectPlayerOne.bind(this);
      }

      selectPlayerOne(e, data) {
        this.setState({playerOneName: data.value})
      }

      render() {
        let players = [];
        this.props.players.map((player) => {
          players.push({text: player.name, value: player.name})
        })

        return (
          <div className="playersContainer">
            <div className="players">
              <Dropdown onChange={this.selectPlayerOne} placeholder='Select Player One' fluid selection options={players} />
            </div>
          </div>
        )
      }
    }

когда я говорю родительский компонент, я имею в виду класс, который будет отображать плеер следующим образом:

<Player />  

Т.е. как я могу сделать this.state.playerOneName доступным для родителя?

3 ответа

Эй, суть в том, что вы в основном передаете из родительского компонента в дочерний компонент реквизит, который является функцией.

В родительском:

handler(newValue){ 
    this.setState({key: newValue}) 
}
render() {
    return(
        <Child propName={handler.bind(this)}>
    )
}

Когда в вашем дочернем компоненте происходит изменение, вы вызываете функцию и передаете новое значение в качестве ввода. Таким образом, вы вызываете функцию в своем дочернем компоненте и вносите изменения в состояние родительского компонента.

В вашем случае вы хотите вместо установки состояния playerOneName передать функцию от родителя этого класса и сделать что-то вроде this.props.functionFromParent(playerOneName) в вашей функции "selectPlayOne".

Это правда, что структура потока является однонаправленной, однако, когда вы имеете дело со "умными" и "немыми" компонентами, вы увидите, что таким образом данные передаются из "тупого" компонента в "умный" компонент. Это совершенно приемлемая форма React!

"Поднятие состояния вверх" для React означает, что вы должны заменить данные из вашего дочернего компонента в состояние родительского компонента и передать данные для представления дочернему компоненту с помощью реквизита.

Вы можете сделать что-то подобное, чтобы достичь своей цели. Создайте родительский компонент, который содержит playerOneName как его состояние. Передайте его в качестве опоры дочернему компоненту, а также функцию, которая изменяет playerOneName всякий раз, когда это изменяется в дочернем компоненте.

class Parent extends Component {
  constructor(props){
     this.state = {
      playerOneName: ''
     }
  }
  render() {
      return(
          <Child 
              playerOneName={this.state.playerOneName}
              onPlayerOneNameChange={(playerOneName) => this.setState({playerOneName})}
         />
      );
  }
}

Используйте эту функцию в дочернем компоненте, чтобы изменить имя playerOneName в родительском компоненте, как этот, ваш дочерний компонент отображает только значение playerOneName Все изменения сделаны только в родительском компоненте.

class Child = props => {
  const { playerOneName, onPlayerOneNameChange } = props;
  return (
     <TextInput 
       value={playerOneName}
       onChangeText={(playerOneName) => onPlayerOneNameChange(playerOneName)}
     />
  );
}

По этому вы можете использовать обновленный playerOneName в вашем родительском компоненте, когда вы хотите с помощью this.state.playerOneName

Другие вопросы по тегам