从无状态子组件更改父组件的状态

时间:2020-03-17 15:32:04

标签: javascript reactjs react-native state

我想从无状态组件PaymentScreen更改组件OverlayAddAddress的状态

OverlayAddAddress里面,我有这个:

 isOverlayVisible,
 onBackdropPress,
 address,
 city,
 zipCode,
 phoneNumber,
}) => {
 return (
   <Overlay
     overlayBackgroundColor="#f2f2f2"
     isVisible={isOverlayVisible}
     onBackdropPress={onBackdropPress}>
     <TextInput
       style={styles.input}
       placeholder="Adresse"
       onChangeText={address => address}
       value={address}
     />
     <TextInput
       style={styles.input}
       placeholder="Ville"
       onChangeText={city => city}
       value={city}
     />
     <TextInput
       style={styles.input}
       placeholder="Code postal"
       onChangeText={zipCode => zipCode}
       value={zipCode}
     />
     <TextInput
       style={styles.input}
       keyboardType="decimal-pad"
       placeholder="Numéro de téléphone"
       onChangeText={phoneNumber => phoneNumber}
       value={phoneNumber}
     />
     <TouchableOpacity style={styles.buttonSave}>
       <Text style={styles.buttonSaveText}>Enregister</Text>
     </TouchableOpacity>
   </Overlay>
 )
}

在父组件中,我有这个:

<OverlayAddAddress
          isOverlayVisible={this.state.overlayAddAdress}
          onBackdropPress={() => this.setState({overlayAddAdress: false})}
          address={this.state.address}
          city={this.state.city}
          zipCode={this.state.zipCode}
          phoneNumber={this.state.phoneNumber}
  />

我的问题是,何时要从OverlayAddAddress内的textInput更改状态,我可以将道具从父项转移到子项,但是我不知道如何获取用于更新父项中状态的值。

2 个答案:

答案 0 :(得分:1)

在PaymentScreen中,创建一个更改所需字段的函数。例如:

const changeText = (text) => { setText(text) }

然后,将此函数作为道具传递给OverlayAddAddress。然后,在您的OverlayAddAddress组件中使用它来更改父值。例如:

<TextInput
   style={styles.input}
   keyboardType="decimal-pad"
   placeholder="Numéro de téléphone"
   onChangeText={phoneNumber => setText(phoneNumber)}
   value={phoneNumber}
 />

答案 1 :(得分:0)

对于那些要从无状态的compnnet内部更新父状态的情况,您需要传递一个函数来更新父类中的状态

在您的情况下,您可以使用onChange来更改道具(即状态的副本)

     <TextInput
       style={styles.input}
       placeholder="Adresse"
       onChangeText={address => address} // this line should be passed from the parent 
       value={address}
     />

所以解决方案是使onChangeText成为道具,以使父母可以像这样传递该功能,

 <TextInput
       style={styles.input}
       placeholder="Adresse"
       onChangeText={props.onAddressChange}
       value={address}
     />

并在父组件中执行此操作

<OverlayAddAddress
          isOverlayVisible={this.state.overlayAddAdress}
          onBackdropPress={() => this.setState({overlayAddAdress: false})}
          address={this.state.address}
          onAddressChange={(value) => setState({address: value})} // will do the trick for you
          city={this.state.city}
          zipCode={this.state.zipCode}
          phoneNumber={this.state.phoneNumber}
  />
相关问题