关于 react 方面的一个问题

2020-04-15 11:29:54 +08:00
 kxy
大佬们,不吝赐教,手动抱拳了。内容有点长……

有一个形如这样的 state:
state={
属性:{...obj}或者是一个对象组数
}

react 组件传递参数是复制该对象还是直接传引用?

①就比如父组件 state 里有一个对象(也就是上面的属性),然后把这个对象用 props 的方式传给子组件,然后子组件对这个参数的某个属性做了修改,会不会导致父组件的状态变了(或者是 react 根本意识不到 state 里的某个属性的内容发生了变化?),而导致渲染?还是说推荐不修改属性只是访问它而避免该问题?
就像 antd 中的 input,这个 input 应该是受控组件,它的值存在 form 里,传给 input,修改 input 属性,导致 form 状态值发生变化,而后触发渲染,让 input 的值发生变化,当然这个过程是我猜的,新手玩家看不懂人家的源码。

我猜应该是传递的引用,复制该对象传给子组件不现实,该从哪些地方学习一下 react 关于这方面的知识。

②还有一个问题:当 setState 或者是 return 返回一个 state 的属性去合并状态值时,是会替换原 state 对象的对应属性,还是会新开一个 state 对象把旧的属性和新的属性合并起来?我猜应该是新开 state 对象,这样 react 会很容易意识到状态发生了变化。合并的时候又有问题了:是直接把传的属性合并进去还是复制了一份传的属性。

③又出现个问题,如果是直接把传的属性合并进去了,当这个属性和原本状态值里的属性是同一个对象时(假设由父组件引用传值给子组件),react 是如何判断状态值发生了变化的,因为此时属性引用的对象是没变化的,只是引用对象的属性发生了变化(或者是判断该属性本身的内存地址和原来的 state 该属性的内存地址是否发生变化,如果变化了,说明这个属性肯定是新合并进来的,至于值变没变就不考虑了,直接渲染使用该属性的页面元素)。如果是新开一个 state 对象,那么 react 可能认为全部的状态值都发生了变化而触发渲染。或者是 react 维护之前旧的 state,和新的 state 作对比,如果 state 的某个属性的对象地址变了(也可能不变),就认为这个值发生了变化从而只是重新渲染对应该值的页面元素。而如果像前面说的,如果是 state 的对象地址并没有变化,那么 react 是如何判断要重新渲染的,还是说无脑渲染,不管变没变?

该从哪方面学习上面这一部分关于如何合并状态和判断状态发生了改变这一方面的知识?

抱拳了,大佬们。
601 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662576

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX