比如有一个某个操作dispatch
了一个action
,返回新的state
的代码如下:
const globals = {...state.globals, showModal: true};
return { ...state, globals };
通过对比,发现showMenu
还是原来的showMenu
(因为都是true
,发现相等),而且user
也是原来的user
,所以,不会重新渲染!
注意,这里的state.globals
已经不是原来的state.globals
了,但是函数返回的对象中:key是showMenu
的value没变,所以不会重新渲染。
思考1:如果组件中用到的是某个state
的某个部分的值,mapStateToProps
函数一定要尽可能细化到它,这有助于优化!
思考2:写reducer更新state
时,浅拷贝就够了,千万不要深拷贝!
// 如果有这样的状态
state = {
articles: {size: 'big', list: ['1', '2', '3', '4']},
// 想更新state.articles.size这样写,好!
const articles = { ...state.articles, size: 'small'};
return { ...state, articles };
// 这样写会导致与list有关的组件而与size无关的组件也被重新渲染,不好!而且深拷贝性能损耗更多!
const articles = {size: 'small', list: [...state.articles.list]};
return { ...state, articles };
案例3,错误示范
比如有一个某个操作dispatch
了一个action
,返回新的state
的代码如下:
const user = state.user;
user.username = 'foo';
user.name = 'bar';
return { ...state, user };
通过对比,发现showMenu
还是原来的showMenu
,而user
也是原来的user
(强调:state.user
依然是原来的,并没有创建或复制一个新的对象,const user = state.user;
只是复制了引用,不算浅拷贝;不过还是要注意返回的state
跟之前的state
已经不是同一个了),所以,不会重新渲染!
怎么修改?答案如下:
const user = {
...state.user,
username: 'foo',
name: 'bar',
return { ...state, user };
案例4,更错误的示范
比如有一个某个操作dispatch
了一个action
,返回新的state
的代码如下:
state.user = {username: '', name: ''};
return state;
这个时候mapStateToProps
函数都懒得理你,它不会执行的。因为state
根本没变。
原文链接:https://blog.csdn.net/kd_2015/article/details/105277509