- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
详解如何在React中优雅的使用addEventListener
目录使用addEventListener代替第三方库的事件方法一:state变化,卸载/绑定事件方法二:使用闭包的方式卸载事件方法三:使用ref保存状态优化state手动维护在ReactHooks中使用第三方库的事件时,很多人会写成这样(指的就是我):
const[count,setCount]=useState(0);
useEffect(()={
constlibrary=newLibrary();
library.on(click,()={
console.log(count);//拿不到最新的count
},[]);
这样写会有问题:
它只会在这个组件加载时,绑定事件,如果这个事件中用到了其他的state,那么这个状态发生变化时事件中是拿不到最新的state
你会想到,我把state放到依赖项中:
const[count,setCount]=useState(0);
useEffect(()={
constlibrary=newLibrary();
//click事件会重复绑定
library.on(click,()={
console.log(count);
},[count]);
这样做又会有新问题:click事件会重复绑定
这时候你说那我先卸载click事件,在绑定事件:
const[count,setCount]=useState(0);
useEffect(()={
constlibrary=newLibrary();
library.on(click,handleClick);
return()={
//卸载不掉事件,还是会重复绑定
handleClicklibrary.un(click,handleClick);
},[count]);
consthandleClick=()={
console.log(count);
};
你惊奇的发现,居然卸载不掉之前的事件,还是会重复绑定事件。
如何解决这个问题呢?
使用addEventListener代替第三方库的事件
这里使用addEventListener代替第三方库的事件,初始代码
constTest=(props)={
constref=useRef();
const[count,setCount]=useState(0);
useEffect(()={
consthandleClick=(event)={
console.log(clicked);
console.log(count,count);
constelement=ref.current;
element.addEventListener(click,handleClick);
return()={
element.removeEventListener(click,handleClick);
},[]);
constonClickIncrement=()={
setCount(count+1);
return(
h2Test/h2
buttononClickIncrement}点击+1/button
divcount:{count}/div
buttonref={ref}ClickTestButton/button
};
方法一:state变化,卸载/绑定事件
将state放在依赖项中,就要解决state变化时,事件重复绑定的问题
解决事件重复绑定问题,首先想到的是事件卸载
你很容易就会想到这样写
useEffect(()={
handleClickref.current.removeEventListener(click,handleClick);
ref.current.addEventListener(click,handleClick);
},[count]);
consthandleClick=()={
console.log(count);
};
这在ReactHooks中是一个坑,state变化后会handleClick事件
您可能关注的文档
最近下载
- 《民法典》合同编实务培训课件.ppt VIP
- TD/T1008-2007《土地勘测定界规程》.pdf VIP
- 体例格式8:工学一体化课程《windows服务器基础配置与局域网组建》任务2学习任务考核方案.docx VIP
- 邮政储汇业务员(中级)练习题.docx VIP
- 苏x5数据包随文件一起拷贝3f格式安装文件flexcolor v4cam ch.pdf
- 生产排程生产排程.ppt VIP
- YZ_T 0104-2004国内邮政包裹详情单.pdf
- 《装配式建筑混凝土预制构件生产与管理》教学课件—01构件预制工厂规划与建设.pptx VIP
- 基于学习任务群的初中语文新闻单元教学研究.pptx VIP
- 2024四川交通职业技术学院招聘笔试真题带答案详解.docx VIP
文档评论(0)