state.id为什么要和action.id作比较,这个地方不太明白
state.id为什么要和action.id作比较,这个地方不太明白
state.id为什么要和action.id作比较,这个地方不太明白
2017-01-02
不知道你懂不懂数组的map方法,如果懂可能会更好理解。
这里的reducer拆分成了todo函数与todos函数
对于todo函数来说,它希望返回一个小对象,结构大概是这样的
{ id : 1, text : learn1111, completed : false }
而对于todos函数来说,它希望返回一个数组,里面包含着像上面差不多的一个一个小对象
[{}, {}, {}, {}]
只不过返回的这个数组跟传进来的数组的相比肯定有了些变动,比如这里我们点击其中的一个todo,肯定希望这个todo的complete从false变成true
所以下面的todos函数里面就用了map方法,
state.map((t) => todo(t, action) )
这里的state其实是传进来的数组,t是传进来数组中的每一个小对象,这样每个小对象都会传进todo函数执行一遍,todo函数中如果发现action.id !== state.id 说明这个小对象不是我们点击的,那这个小对象就应该不变,原样返回,如果相等,则说明这是我们点击的那个小对象,则这个对象中的completed属性就应该取反,再把这个对象返回。
比如原先是这样的一个数组
[ {id:1,text:1,completed:false}, {id:2,text:2,completed:false}, {id:3,text:3,completed:false} ]
我们点击了第二项,
这个数组被传进todos函数的state中,调用state.map((t) => todo(t, action))
然后第一个对象 {id:1,text:1,completed:false} 被当作参数 t 传入 todo(t, action)中,发现点击的不是这个对象,则将 {id:1,text:1,completed:false} 原样返回,
然后第二个对象被传入todo函数中,发现是被点击的对象所以改变其compted属性然后返回
{id:2,text:2,completed:true},
第三个同样,
这样被返回的新数组就是下面这样的
[ {id:1,text:1,completed:false}, {id:2,text:2,completed:true}, {id:3,text:3,completed:false} ]
啰啰嗦嗦写一大堆,不知道你能不能看得懂,顺便一提,这老师讲成这样,理解不了才是正常的。。。
举报