为什么React / Redux重置所有事件处理程序,即使`state`没有改变

时间:2016-01-26 15:14:15

标签: javascript reactjs redux

要创建记录组件ID的onClick事件,我使用此函数:

const onClick = (e) => {
  console.log(e);
};

const Bar = ({id, text}) => (<div onClick={onClick.bind(null,id)}>{id}: {text}</div>);  

这已经正常运行,它会记录我点击的项目的id

但是,根据Perf.printDOM(),React显然会触及每个节点,并在更新state时创建一个新节点,即使它未更改。

这是设计中的设计还是设计中的错误?我误解了发生了什么吗?找到跳过这个的方法是不成熟的优化?

Here is a Jsbin for demonstration

1 个答案:

答案 0 :(得分:1)

每次渲染组件时都会创建一个新的事件处理程序(每次处理事件或状态更改时都会发生这种情况)。仅仅因为这个原因,我建议不要在功能组件中调用bind(),并使用使用React.createClass定义的标准组件或使用从Component继承的ES6类。

基本上你应该设计你的组件,假设render()将被多次调用,并避免在该方法中尽可能多地分配或绑定。

React也拥有自己的事件处理系统,模仿原生DOM,但在幕后工作方式略有不同。它处理根组件级别的所有事件,并根据事件源确定要触发的组件处理程序。 official docs是了解这个系统如何运作的好地方,当然总是有source code