为了账号安全,请及时绑定邮箱和手机立即绑定

state.id为什么要和action.id作比较,这个地方不太明白

state.id为什么要和action.id作比较,这个地方不太明白

正在回答

3 回答

不知道你懂不懂数组的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}
]

啰啰嗦嗦写一大堆,不知道你能不能看得懂,顺便一提,这老师讲成这样,理解不了才是正常的。。。



2 回复 有任何疑惑可以回复我~

我想问一下,你对react了解的多吗,我有个问题想请教下

0 回复 有任何疑惑可以回复我~

state.id 表示reducer里面的id, 而action.id 表示操作的那条todo的id。如果不相同,则不操作,相同则是要操作的那条todo,做取反操作。   不知道说没说错!

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
在React中使用Redux数据流
  • 参与学习       27808    人
  • 解答问题       40    个

在react中使用redux数据流,通过一个样例工程的开发了解具体原理

进入课程

state.id为什么要和action.id作比较,这个地方不太明白

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信