【发布时间】:2018-08-12 20:17:24
【问题描述】:
我有简单的组件
class App extends Component {
handleClick() {
let banana = {message: 'banana triggered'};
this.setState({banana});
console.log(this); // banana is set in state!!!!
console.log(this.state); // state is null :O
setTimeout(() => {
console.log(this.state); // banana is set!
}, 5)
}
render() {
const {state, actions} = this.props;
return (
<div>
{this.state && this.state.banana.message} <br />
<button onClick={() => this.handleClick()}>Test</button>
{state.alert.message && <p>{state.alert.message}</p>}
<p onClick={() => actions.alert.success("This is not")}>
This is magic
</p>
</div>
)
};
}
export default connect(
state => (
{
state: {...state}
}
),
dispatch => (
{
actions: {
dispatch: dispatch,
alert: {
success: text => dispatch(alert.success(text))
}
}
}
)
)(App);
问题是我需要在我的 JSX 渲染中添加 this.state && 以检查 this.state 是否存在,我知道在 JavaScript 中这是正常的,但在 React.js 中不正常?他应该立即对状态变化做出反应吗?同样让我感到困惑的是,来自两个 console.logs 的内容,第一个(这个)设置了香蕉状态,第二个是空的。如何?
下图:
附言。 Redux 没有这个问题,只有本地组件状态
【问题讨论】:
-
setState 是异步的。我们不能在同一生命周期钩子中的状态中存在值
-
您在控制台上获得 2 个不同值的原因是,当您打开
this对象时,它会显示当前值。您在行尾看到一个小图标吗?将鼠标悬停在其上即可查看。原因可能是在您的console.logs 期间都没有设置状态,但是当您打开对象时,它已经设置了 -
问题不是两个不同的值,问题是当你输出整个对象时,设置了键,然后在你输出这个键之后,从这个对象中,键是空的。
标签: javascript reactjs