反应 - 状态不一致

时间:2016-05-21 14:52:44

标签: javascript meteor reactjs

我想要实现的目标:将数据从子级传递给父级。

我是如何努力实现的:如上所述使用this.state here

不确定如何标题:当我在修改状态的函数中console.log(this.state)时,会打印出this.state中的正确值。但是,当我尝试在另一个函数中读取状态时,this.state显然仍然是空值。

constructor(props) {
    super(props);
    this.state = {
      titleInputValue: "",
    };
}

<form onSubmit={this.handleSubmit.bind(this)}>
    <TextInput
        val={this.state.titleInputValue}
        changeHandler={this.textInputChangeHandler} />
</form>


// This is the function which can apparently only get the initial state
// title and body are empty strings, they should have values
handleSubmit(event) {
    event.preventDefault();
    const title = this.state.titleInputValue;
    const body = this.state.bodyInputValue;
    console.log(this.state);
    Meteor.call('stories.insert',title,body);
}

// However, here the state is retrieved just fine.
// This is the function the child calls to update the state.
textInputChangeHandler(event) {
    // This console.log call shows the correct state!
    console.log(this.state);
    this.setState({
      titleInputValue: event.target.value,
    });
}

TextInput具有属性onChange={this.props.changeHandler.bind(this)}

例如:

enter image description here

我写了asd,状态已在textInputChangeHandler中成功检索,这是前两个console.log次调用,但在handleSubmit中它是空的。

1 个答案:

答案 0 :(得分:2)

这是因为事件处理程序范围不是Component类级别。当组件处理事件时,它的上下文是组件(在您的情况下为TextInput)而不是父组件。

您必须将该函数绑定到Component类范围:

<TextInput
        val={this.state.titleInputValue}
        changeHandler={this.textInputChangeHandler.bind(this) } />

使用JavaScript绑定也可以指定函数上下文。