React中events的踩坑指南
创始人
2024-06-03 21:06:13
0

本文介绍react项目中如何创建events来进行跨组件事件触发
重点讲解自定义参数传递,和如何拿到最新的state值🌟

创建和触发 events

// 创建event
const addEvent = (type, listener) => {window.addEventListener(type, listener);
};// 清除event
const removeEvent = (type, listener) => {window.removeEventListener(type, listener);
};// 触发event
const dispatch = (type, value?) => {// 触发事件,不传递数据// const event = new Event(type);// 触发事件,并可以传递参数const customEvent = new CustomEvent(type, { detail: value });window.dispatchEvent(customEvent);
};

注意⚠️
● 事件type不区分大小写,就是绑定’click’事件,派发’CLICK’或者’Click’,都会引起listener的执行
● new Event(type),触发事件,不能传递额外参数
● new CustomEvent(type),触发事件,可以传递额外value,我们这里把value放在了e.detail属性上,属性名可以自定义

🪤如何传递参数

点击按钮,打印出传递的参数

// 事件名称是不区分大小写
const EventName = 'myClick';function MyEvent() {// 2 点击按钮,触发事件const handleClick = () => {dispatch(EventName, { name: 'Jack', age: '18' });};// 1/3 执行回调函数const showData = (e) => {// 测试传递数据const data = e?.detail;console.log('传递的参数是', data);};// 1 绑定发布订阅关系useEffect(() => {addEvent(EventName, showData);return () => {removeEvent(EventName, showData);};}, []);return (
测试发布订阅模式加参数:
); } export default MyEvent;

🪤坑2 如何获取上下文state

逻辑:点击触发事件:打印上下文中的变量v1 和 state值

但是第一次点击按钮结果:
v1 is 变量1
state is
第二次点击按钮结果:
v1 is 变量2
state is
问题:拿不到最新的state值!!!

// 事件名称是不区分大小写
const EventName = 'myClick';function MyEvent() {const [state, setState] = useState('');let v1 = '变量1';const handleClick = () => {dispatch(EventName);};const showData = useCallback(() => {// 测试能否获取上下文console.log('v1 is ', v1);console.log('state is ', state); setState('11111');v1 = '变量2';}, [state]);
useEffect(() => {addEvent(EventName, showData);return () => {removeEvent(EventName, showData);};}, []);return (
测试发布订阅模式加参数:
); }export default MyEvent;

但是showData中为什么拿不到最新的state值呢?更准确的说,是回调函数showData中拿不到最新的值。
● 检查一下代码第27行,绑定回调函数是在页面第一次渲染时,
● 之后虽然state变化,但是之前绑定的回调函数不会变化
● 触发事件时,执行的还是页面第一次渲染时绑定的showData,里面的state还是页面第一次渲染时的state
正确代码

// 事件名称是不区分大小写
const EventName = 'myClick';function MyEvent() {const [state, setState] = useState('');let v1 = '变量1';const showData = useCallback(() => {// 测试能否获取上下文console.log('v1 is ', v1);console.log('state is ', state);setState('11111');v1 = '变量2';}, [state]);const handleClick = () => {dispatch(EventName);};useEffect(() => {addEvent(EventName, showData);return () => {removeEvent(EventName, showData);};}, [showData]); return (
测试发布订阅模式加参数:





{state}
); }export default MyEvent;

关于以上代码,可能又同学要问:
● 是state变化引起的showData的变化,那么27行useEffect的依赖项写state可以吗?
可以,但不建议。如果showData函数依赖很多state,每次都一个一个写,容易遗漏,也不直观
● useEffect的依赖项是个函数,导致重复渲染怎么办
useEffect对于依赖项是直接对值进行的比较。也就是意味着函数对比的话,就是地址进行比较,显然,每次创建的函数地址都是不同的。不仅仅是state变化,每一次值的改变,都会导致函数改变,所以需要给showData加缓存,如第8行,用useCallback包了一层

相关内容

热门资讯

诗词的由来? 诗词的由来?几年前?为啥来?诗歌概念起源 诗歌是一种主情的文学体裁,它以抒情的方式,高度凝练,集中地...
陈梦佳是好人吗? 陈梦佳是好人吗?我不了解TA
关于鹏的成语典故? 关于鹏的成语典故?据一个叫庄周的说这货在水里是鱼名鲲,上了天变成鸟叫鹏,纵横几千里,如垂天之云。据西...
上夜班很困怎么办, 上夜班很困怎么办, 白天多休息。注意饮食营养。晚上上班的时候可以听听节奏比较快的歌,或者听自己一向...
男生不主动找聊天就是没戏吧? 男生不主动找聊天就是没戏吧?你分情况,不同性格的人不一样。比如说处女男,因为天性原因希望女孩子主动一...
说人守时回家的成语 说人守时回家的成语 分秒必争 [fēn miǎo bì zhēng] 生词本基本释义一分一秒也一...
大航海探险物语要在什么辅助脚本... 大航海探险物语要在什么辅助脚本玩呢?大航海探险物语要在鸟人助手上玩呀,这款辅助脚本不用root一样可...
怎样锻炼孩子注意力集中? 怎样锻炼孩子注意力集中?第一,多训练孩子听力,在孩子听某些声音或语言,能听懂其中的细节和主旨。第二,...
本来可爱的小家伙,变成了难管教... 本来可爱的小家伙,变成了难管教的熊孩子,孩子太难管教了怎么办呢?多跟孩子沟通,走进孩子的内心,了解她...
孩子跳舞发圈简单句子 孩子跳舞发圈简单句子1、爸爸妈妈会为你在赛场上的努力而感到骄傲。我们爱你。2、感觉女儿特别的用心,在...
我女朋友和我说她只是喜欢我而不... 我女朋友和我说她只是喜欢我而不爱我,我还怎么办?就是因为你平时对她的宠爱,,让她变成了理所当然,,她...
关于通缉令的问题! 关于通缉令的问题!分级别的。A级才能公布大众的。如果你想曝光此事,可以找当地媒体。。。。
湖南涉外经济学院教师车祸造成 ... 湖南涉外经济学院教师车祸造成 2 人受伤,事故原因是什么?这是因为他们的心情不好的原因,所以,这样的...
微电影创作过程中,工作思路怎么... 微电影创作过程中,工作思路怎么写请问你说的是剧本创作还是拍摄工作,还是整个流程?
求类似异形大战铁血战士这样的把... 求类似异形大战铁血战士这样的把两部不同电影里的人物放到一起对打的电影弗莱迪大战杰森
喜欢看小说的进来 喜欢看小说的进来小说里面都有那些 剑法 轻功 剑名(倚天剑 )门派(专收女弟子的名字要好听的)风云也...
顾瑶周夜深小说叫什么名字? 顾瑶周夜深小说叫什么名字?不是冤家不成婚场景一:“贺尧谦你会有报应的!”某女手握拳头信誓旦旦。“放心...
永恒之塔各种达人(6种),前期... 永恒之塔各种达人(6种),前期中期后期分别做什么东西好卖?永恒之塔各种达人(6种),前期中期后期分别...
用精字组成不同的词语填空 用精字组成不同的词语填空节目( ) 制作( ) 装备( ) 包装( ) ( ...
什么是白富美?什么是高富帅? 什么是白富美?什么是高富帅?白富美就是长得白净、有钱、美丽漂亮,一般形容女的,高富帅是长得个子高,又...