React事件代理

本文探讨了React中的事件绑定机制,并对比了直接绑定与事件代理两种方式。通过实验验证了React内部实现了事件代理,使得开发者无需担心性能问题。

review代码的时候 老大看到了这样的代码

list.map((item,index) => {
    <p onClick={() => this.clickHandler(item.name)} key={index}>{item}</p>
})

于是乎提出了问题:这样绑事件,如果list里有100条,会绑100次事件,形成100个函数,性能消耗略大,推荐尝试使用事件代理

然后,想了下,事件代理,如果想传name,好像还需要在代理的容器上取到当前元素再取它的name,然后好像就要在p上再加一个data-xxx来保存这个name,恍惚看到了JQuery的影子

然后,又想到似乎听哪位前辈说过react有对事件做处理,于是这样绑事件,在chrome里试了下


dom结构长这样,点击两个按钮,会分别出现弹层显示对应内容

dom结构长这样

事件

事件展开

然后发现,按照原来onclick的绑法,button上的事件不应该是空啊,于是乎把button上的click事件方法remove,像这样:

删除button的click

再去点击button,还是可以显示弹层

再接再厉,把button上的事件留下,删掉document上的事件,像这样:

删除document的click

果然点击button时没有弹层了

然后,在网上查了下原理,找到这样一段,

和原生HTML定义事件的唯一区别就是JSX采用驼峰写法来描述事件名称,大括号中仍然是标准的JavaScript表达式,返回一个事件处理函数。在JSX中你不需要关心什么时机去移除事件绑定,因为React会在对应的真实DOM节点移除时就自动解除了事件绑定。

React并不会真正的绑定事件到每一个具体的元素上,而是采用事件代理的模式:在根节点document上为每种事件添加唯一的Listener,然后通过事件的target找到真实的触发元素。这样从触发元素到顶层节点之间的所有节点如果有绑定这个事件,React都会触发对应的事件处理函数。这就是所谓的React模拟事件系统。

附上原文链接http://www.infoq.com/cn/articles/react-jsx-and-component/

终于可以放心大胆的写onClick了~


以上,有想到再补充,新人 如果文章中有不成熟不正确的想法 敬请拍砖~

React Native 并不像传统的 Web 开发那样直接支持事件委托机制。在 Web 开发中,事件委托利用了事件冒泡的特性,允许将事件监听器绑定在父元素上,从而处理子元素事件[^1]。 然而,React Native 的事件系统是基于 JavaScript 的,并且其事件处理机制是直接附加到具体的组件上。这意味着事件委托在 React Native 中不是原生支持的功能,但可以通过一些策略来模拟类似的行为。 ### 模拟事件委托的方式 尽管 React Native 没有直接的事件委托机制,但可以通过以下方法模拟类似的效果: 1. **将事件处理逻辑集中到父组件中**: 父组件可以包含多个子组件,并为每个子组件绑定事件处理函数。虽然事件处理程序仍然绑定在子组件上,但可以将实际的处理逻辑交给父组件完成。 ```javascript const ParentComponent = () => { const handlePress = (childName) => { console.log(`${childName} was pressed`); }; return ( <View> <ChildComponent name="Button 1" onPress={() => handlePress("Button 1")} /> <ChildComponent name="Button 2" onPress={() => handlePress("Button 2")} /> </View> ); }; ``` 2. **使用上下文(Context)或状态管理工具**: 如果事件处理逻辑需要跨多个组件共享,可以使用 React 的 `Context` 或者状态管理工具如 Redux 来集中处理事件。 3. **自定义事件系统**: 可以通过事件总线(如 `EventEmitter`)来实现跨组件通信,从而模拟事件委托的效果。这种方法允许一个组件触发事件,而另一个组件监听并处理该事件。 ```javascript import EventEmitter from 'events'; const eventEmitter = new EventEmitter(); // 在某个组件中触发事件 eventEmitter.emit('customEvent', { data: 'Hello' }); // 在另一个组件中监听事件 eventEmitter.on('customEvent', (payload) => { console.log(payload.data); }); ``` ### 总结 React Native 不直接支持事件委托机制,但可以通过上述方法模拟类似的行为。这些方法虽然不能完全替代传统的事件委托,但可以在一定程度上实现类似的逻辑和效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值