反应本机获取更新状态以保存

时间:2019-02-04 11:13:47

标签: reactjs react-native

我对本机作出反应还很陌生,我还没有找到解决问题的方法,所以我现在在这里问。我试图在单选按钮的onPress事件上更新值的状态,然后再保存。问题是保存正在获取未更新的值。我知道setState是异步调用,forceUpdate不是推荐的解决方案(出于某种原因我不起作用)

这是一个示例:

import RadioForm, { 
  RadioButton, 
  RadioButtonInput, 
  RadioButtonLabel
} from 'react-native-simple-radio-button'

class SomeClass extends Component {
  constructor(props) {
    super(props)
    this.state = {
      buttonValues: [{label: "someValue1", value: 0}, {label: "someValue2", value: 1}],
      someString: "someStringValue_false"
    }

    this.handleOnPress = this.handleOnPress.bind(this),
    this.saveValue = this.saveValue.bind(this)
  }

  handleOnPress(value) {
    if( value === 1 ){
      this.setState({
        someString: "someStringValue_true"
      })
    } else {
      this.setState({
        someString: "someStringValue_false"
      })
    }
  }

   saveValue() {
    //no problem in this function tested already in other cases
   }

  render() {
    return( 
      <View>
        <RadioForm
          radio_props={this.state.buttonValues}
          initial={0}
          formHorizontal={true}
          labelHorizontal={true}
          radioStyle={{paddingRight: 20}}
          buttonColor={"red"}
          selectedButtonColor = {"green"}
          animation={true}
          onPress={(value) => this.handleOnPress(value)}
        />
        <Button
          title={"save"}
          onPress={()=> this.saveValue()}
        />
      </View> 
    )
  }
}

行为:状态仅在第二次通话时更新

3 个答案:

答案 0 :(得分:2)

您可以尝试使用setState回调

setState({ name: "Michael" }, () => console.log(this.state));

// => { name: "Michael" }

确保状态更改。

答案 1 :(得分:0)

您没有在构造函数中正确地将处理器与this绑定在一起。应该是

constructor(props) {

/* --- code --- */

this.handleOnPress = this.handleOnPress.bind(this),
this.saveValue = this.saveValue.bind(this)

}

答案 2 :(得分:0)

执行下一个。

this.setState({
 meter_reading_unit: "someStringValue_false"
}, () => {
 console.log('meter_reading_unit ==> ', this.state.meter_reading_unit); // should be `someStringValue_false`
});

在下一次渲染更新中,值someStringValue_false应该在任何地方都可用。