要创建记录组件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
时创建一个新节点,即使它未更改。
这是设计中的设计还是设计中的错误?我误解了发生了什么吗?找到跳过这个的方法是不成熟的优化?
答案 0 :(得分:1)
每次渲染组件时都会创建一个新的事件处理程序(每次处理事件或状态更改时都会发生这种情况)。仅仅因为这个原因,我建议不要在功能组件中调用bind()
,并使用使用React.createClass
定义的标准组件或使用从Component
继承的ES6类。
基本上你应该设计你的组件,假设render()
将被多次调用,并避免在该方法中尽可能多地分配或绑定。
React也拥有自己的事件处理系统,模仿原生DOM,但在幕后工作方式略有不同。它处理根组件级别的所有事件,并根据事件源确定要触发的组件处理程序。 official docs是了解这个系统如何运作的好地方,当然总是有source code。