我的组件中有一些状态,我想传递给一个动作 在React.js中。我怎么能这样做?
mycomponent.js
cityHandleUpdateInput() {
this.setState({
city: this.refs.city.refs.searchTextField.input.value
})
const { city } = this.state;
this.props.fetchResCity(city)
}
myaction.js
export const fetchResCity = (city) => (dispatch, getState) => {
if (!getState().resCity.isFetching) {
console.log(getState().city)
console.log(city)
const endpoint = 'rescity?city=${city}';
dispatch({
[CALL_API]: {
types: [ RES_CITY_REQUEST, RES_CITY_SUCCESS, RES_CITY_FAILURE ],
endpoint: endpoint
}
})
}
}
它无法正常工作。我的代码中有什么问题吗?
当我在我的操作中记录该城市变量时,它只是undefined
。
答案 0 :(得分:1)
setState
无法立即更新this.state
。以下是React docs:
setState()
不会立即改变this.state
,但会创建待处理状态转换。在调用此方法后访问this.state
可能会返回现有值。无法保证对
setState
的调用进行同步操作,并且可以对调用进行批处理以获得性能提升。
这意味着您需要将传递给setState
的值存储起来,并将其传递给您的操作创建者。这样的事情(我没有运行这段代码,请确保你测试它)应该有效:
cityHandleUpdateInput() {
const city = this.refs.city.refs.searchTextField.input.value;
this.setState({ city });
this.props.fetchResCity(city);
}
答案 1 :(得分:0)
您应该使用setState
回调,即处理状态突变的正确方法,因为setState
需要时间来改变状态,因此在更新状态后立即使用状态可能导致更旧价值,而不是更新的价值。
使用像
这样的回调cityHandleUpdateInput() {
this.setState({
city: this.refs.city.refs.searchTextField.input.value
}, () => {
const { city } = this.state;
this.props.fetchResCity(city)
})
}
确保您绑定了cityHandleUpdateInput
中的constructor
函数或其被调用的位置,否则它本身将无法使用{{1}访问setState
}}