在父组件中获取子状态组件值

时间:2017-10-07 06:47:06

标签: javascript reactjs react-native

我有kidsDetail组件它有自己的状态,在parent kidsDetail组件使用for循环渲染多次。我想获取点击保存按钮的详细信息listDetail信息列表。

Bellow是父组件代码

     renderKidsDetails(totalkids) {
      /*If user selects 'yes' for kids, then this function is called 'n' 
      times; n = no. of kids */
      const kids= [];
      if (this.state.addKidsDetails === true) {
       for (let i = 0; i < totalkids; i++) {
      kids.push(
      <RenderChildDetails key={i} ivalue={i + 1} />
      );
      }

     }
     return (
        <View style={{ marginLeft: 20 }}>
         {kids}
        </View>
      );
      }

KidsDetail.js它有两个州的孩子年龄和性别所以需要这个值在父组件中获取

class RenderChildDetails extends Component {
 state={
   kidsAge: 0,
   kidsGender: '',
 }
constructor(props) {
   super(props);
   onClicked=this.onClicked;
 //Call function when the back button is pressed in the page header.
  }

onClicked=()=>{
 console.log(" kid Age  "+this.state.kidsAge);
}
render()
   {
    return(
     <View style={{flexDirection:'row',flex:1}}>
  <View style={{backgroundColor:'black',height:20,width:20,borderRadius:10,margin:5,alignItems:'center', padding: 1}}>
   <Text style={{color:'white'}}>{this.props.ivalue}</Text>
 </View>
 <TouchableOpacity onPress={() =>{

                         ActionSheet.show(
                           {
                             options: AGE,
                             cancelButtonIndex: CANCEL_INDEX,
                             destructiveButtonIndex: DESTRUCTIVE_INDEX,
                             title: "Select Age"
                           },
                           buttonIndex => {
                             this.setState({ kidsAge: AGE[buttonIndex] });
                           }
                         )

                       }
                       }>

  <View style={{flex:1,margin:5,flexDirection:'row'}} >
    <Text>Age: {this.state.kidsAge}</Text>
    <Image source={require('../../../Assets/Icons/Settings/Black_down.png')}
           style={{height:11,width:11,margin:5}} />
  </View>
  </TouchableOpacity>
  <TouchableOpacity onPress={() =>
      ActionSheet.show(
                        {
                          options: GENDER,
                          cancelButtonIndex: CANCEL_INDEX,
                          destructiveButtonIndex: DESTRUCTIVE_INDEX,
                          title: "Gender"
                        },
                        buttonIndex => {
                                        this.setState({ kidsGender: GENDER[buttonIndex] });
                                      }
                      )}>
  <View style={{flex:1,margin:5,flexDirection:'row'}}>
    <Text>Gender: {this.state.kidsGender}</Text>
    <Image source={require('../../../Assets/Icons/Settings/Black_down.png')}
           style={{height:11,width:11,margin:5}} />
  </View>
  </TouchableOpacity>
 </View>


 );

 }
 }

 export default RenderChildDetails;

1 个答案:

答案 0 :(得分:0)

在React中,只要更新子组件状态,就可以将处理程序传递给要调用的子组件,然后将子组件状态存储在父组件状态中。

检查以下代码:

 class Parent extends Component {
     constructor(props) {
      super(props)
      this.state = {};
      this.handleChildUpdate = this.handleChildUpdate.bind(this);
      this.getChildState = this.getChildState.bind(this);
     }


     //handler to update current parent state when child state is updated
     handleChildUpdate(updatedState){
      this.setState({
        childState:updatedState
      });
     }

     //log updated child state on button click
     getChildState(){
      console.log(this.state.childState.age);
     }

     render(){
      <View >
        <Child handleUpdate={this.handleChildUpdate} />
        <Button onPress={this.getChildState}>
      </View>
     }
 }


 class Child extends Component {
     constructor(props) {
      super(props)
      this.updateAge = this.updateAge.bind(this);
      this.state = {
          age:"10"
      };
     }


     updateAge(text){
      this.setState({
        age:text
      } , () => {
        //this handler is passed as a prop from parent component
        //this is how we update the parent state when any change happens to child state
        this.props.handleUpdate(this.state);
      });
     }


     render(){
      <View >
        <TextInput onChange={(text) => { this.updateAge(text) } } />
      </View>
     }
 }