Redux连续多次dispatch会触发多次render吗?

#1

如题,我在一个方法里面多次dispatch action:

onChange = (  value1 , value2  ){
    dispatch( { action: 'action1' , value1 } )
   dispatch( { action: 'action2' , value2 } )
}

render会触发两次吗?
我实际实验了一下,发现是一次render,请问下是react-redux做了优化吗?还是setState的机制?

1 Like
#2

一个dispatch触发一次reducer。你可以去redux官网直接把它的例子跑起来看看。你只贴这一部分代码看不出来问题在哪。

#3

嗯嗯,就是思想方法吧,也不是具体的业务代码。
就是一次dispatch,view更新一次,继续dispatch,view继续更新。两次dispatch,会不会view就更新一次,把两次dispatch的结果合并到一次,一次性更新view,提高性能?

#4

你可以把2个action放到一个reducer中更新。。

#5

嗯嗯,但是放两次dispatch,也只有一次render,所以应该没关系的。我问这个问题,只是这个细节不太确定,找资料貌似没有这方面的。谢谢回答

#6

一次dispatch,一次reducer,这两个是严格对应的关系。但是不一定会触发view的更新。你是使用的react-redux来链接reduxreact的吗?在react-reduxconnect组件里,是判定了shouldComponentUpdate的。对应的props如果没有变化,是不会触发view的更新的。

你可以简单的理解为,使用了redux,react-redux后,只有你组件用到的props有了变化,组件的view才会更新。

你上边的两个action都改变了同一个数据吗?或者说你的action都会导致组件用到的props有变化吗?

#7

是的,我是用redux和react-redux的connec连接的。
代码里,productValueresponsorValue是两个input的value值,两次dispatch,确实render了一次。而且我用immutablejs的,每次返回的都是新的state,可以确定,每次dispatch,都是不一样的state的。

#8

render的触发是取决于 store 的变化(换一个直接点在说法,reducer 里面的有return新的state就会触发render ),而不是有触发action就触发render。
同问关于react-redux关于多次render在招式。

#9

render触发一次。是setState的机制,批处理。Connect中重新render组件的方式就是setState。

2 Likes
#10

抱歉之前不了解在react-redux下组件的更新机制。我之前以为是检测到prop改变后,直接调用render方法。像 @wlt说的,重新render组件的方式是通过setState的话,就有可能造成只渲染一次。setsTate方法是异步的,而且会累积更新,不会每次都更新。如果你的两个value,其中一个会被马上被另一个覆盖掉。你可以试一下,取最终的一个值,然后dispatch。

#11

soga。谢谢

#12

嗯,setState确实会积累更新,最后合并,一次render。connect原来也是setState的