React中使用setState的备忘

当state是object的时候。例如

1
2
3
4
5
6
7
8
9
10
11
class MyContainer extends Component {
state = {
title: "my blog",
content: "my blog content",
tags: ["tag1", "tag2"],
actions: {like: 1, repost: 2}
}
render() {
//....
}
}

当我们使用setState改变state的时候,并不去要把整个state复制一份。

比如需要把title变成”my blog 2”, 则只需调用

1
this.setState({title: "my blog 2"});

就可以了。

以前的误解是,setState就相当于把新的object作为新的state,所以当执行上述代码之后,
错以为新的state会变为

1
2
3
{
title: "my blog 2"
}

而其他property会消失不见。

其实以上也仅仅是一个误解而已了。

当然,由于setState不能处理nested的object,所以如果要变更比如actions里面的like,而保持repost的值不变,则得copy整个actions, 然后讲对应的property变更,然后再使用setState更新actions。