总结Vue3的11种传参通信方式, 非常齐全

程序员他爱做梦2024-04-16 11:42:36  128

前言:vue3出来很久了,也非常成熟了,平时项目只管用也没多想,直至今天想写一编关于vue3传参,然后我总结一下竟然总结出来11种方式那么多,11种我分别列了出来,由于vue3有两种setup写法,下面我将用最简洁的代码例子针对主流的 子组件代码: const props = defineProps({})接收后直接在标签使用 {{ props.name }} 二、子传父思路:子组件用 const emits = defineEmits(['触发的方法']) 注册某个在父组件的事件,然后通过emits('触发的事件', 参数) 触发父组件事件并且带上参数。 子组件代码: 注册 addEvent 事件后, 用 emits('addEvent', name.value) 触发父组件的 addEvent事件

父组件代码: 触发addEvent事件后,在对应的方法里面直接能拿到传过来的参数 三、兄弟组件传参(mitt)以前vue2是用EventBus事件总线跨组件实现兄弟组件通信的。但vue3中没有,所以vue3目前主流使用mitt.js插件来进行替代实现兄弟通信。

1、npm包引入 npm install --save mitt

2、在main.js文件进行全局挂载, $bus是自定义属性名import mitt from "mitt"const app = createApp(App)app.config.globalProperties.$bus = new mitt

3、传参出去的兄弟组件代码

4、接收参数的兄弟组件代码

四、$attrs注意: 以前在在vue2里面中除了$attrs,还有$listeners; 但vue3直接把$listeners合并到 $attrs 里面了。

简要说明:$attrs主要作用是接收没在props里面定义,但父组件又传了过来的属性。看下面代码例子就好懂多了 父组件代码: 传两个属性过去,一个在子组件props中,一个不在 子组件代码: $attrs接收到props以外的内容,所以用useAttrs打印出来没有name只有data {{ props.name }} // '天天鸭' 五、refs传参简单说明:父组件通过在子组件上定义 ref='ref名称',然后const ref名称 = ref(null),就能通过ref名称操控子组件的属性和方法(子组件用defineExpose对外暴露才能被操控),具体看下面例子。 父组件代码:子组件代码: 用defineExpose对外暴露才能被操控 六、v-model简单讲解: v-model其实语法糖,如下两行代码作用是一样, 上面是下面的简写。 父组件代码: 直接使用v-model传参 子组件代码: 通过 defineEmits获取到然后用emit("update:修改的属性", 修改的内容)进行修改父组件的内容,,注意:update:是固定写法。 v-model扩展:defineModel:defineModel宏的简单说明:父子组件的数据双向绑定,不用emit和props的繁重代码

版本要求:必须要3.4+

示例场景:父组件引入一个子组件弹窗,点击就父传子(props)弹出子组件弹窗,子组件里面有个按钮点击就子传父(emit)关闭 父组件代码: 用v-model在子组件身上绑定showDevice属性,该属性用于通知子组件是否打开弹窗。 子组件代码: 如下的handleClickCancel方法,通过defineModel宏声明一个model,点击按钮能直接通知父组件修改属性。 上面例子通过defineModel宏,直接不需要props和emit就实现了父子通信效果,非常简洁好用。

七、provide/inject简单讲解:provide和inject叫依赖注入,是vue官方提供的API,它们可以实现多层组件传递数据,无论层级有多深,都可以通过这API实现。 假设这是太老爷组件: provide('名称', 传递的参数)向后代组件提供数据, 只要是后代都能接收 最深层的孙组件: 无论层级多深,用 inject(接收什么参数) 进行接收即可 {{ name }} 八、路由传参简单讲解: 路由跳转事上参数也是传参的一种,而且传参方式还不止一种呢,下面细说。 1、query传参 // 传递方const query = { id: 9527, name: '天天鸭' }router.push({ path: '/user', query })// 接收方import { useRoute} from 'vue-router'const route = useRouteconsole.log(route.query) 2、params传参 注意:4.1.4 (2022-08-22) 删除了param这种方式

// 发送方router.push({ name: 'test', params: { name: '天天鸭' }}) // 接收方import { useRoute} from 'vue-router'const route = useRouteconsole.log(route.params) // { name: '天天鸭' } 3、state传参 // 发送方const state= { name: '天天鸭' }router.push({ path: '/user', state }) // 接收方直接使用console.log(history?.state?.name)

九、vuex传参写过对应的文章,可以直接细看:对比vuex和pinia用法

十、pinia写过对应的文章,可以直接细看:对比vuex和pinia用法

十一、浏览器缓存localStorage 和sessionStorage: 这算是用的不多,但也是必用的一种通信方式了,下面看看区别:

sessionStorage(临时存储):为每一个数据源维持一个存储区域,在浏览器打开期间存在,包括页面重新加载

localStorage(长期存储):与 sessionStorage 一样,但是浏览器关闭后,数据依然会一直存在

下面直接上使用的语法。

// 存储数据localStorage.setItem('key', 'value');sessionStorage.setItem('key', 'value');// 获取数据const valueFromLocalStorage = localStorage.getItem('key');const valueFromSessionStorage = sessionStorage.getItem('key');// 删除数据localStorage.removeItem('key');sessionStorage.removeItem('key');// 清空所有数据localStorage.clear;sessionStorage.clear;

总结:空闲想总结一下,纯人工肝了一天终于写好了,我尽量用最简洁易懂的方式写了,如果有什么写错了或者不够明细都欢迎大家指出。这也当笔记用了,以后忘记用法回来看一眼。创作不易,如果有幸能让你看到这里,希望给个点赞哦。

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/240527.html
0
随机主题
米兰旧将: 德比六连败不可接受, 我在目前这支米兰能够踢上比赛央视《法治在线》主播经蓓工作着装生活化, 背后原因用心良苦美国14岁少年挑战最辣玉米片, 一命归西, 辣死人是真的存在一国有行官宣,聘任新行长地球班往事: 苏联解体时, 俄罗斯继承了1000亿债权, 要回来多少?冠军信赖真靠谱 捷途X70 PLUS冠军版正式上市13万一口气跌至6万, 标配8个气囊, 从月销1台到销量过万, 比亚迪不香了多名炫富网红被封, 向不良价值观亮剑 | 新京报社论亚特兰大3-0打脸阿根廷队: 欧联冠军门神, 被阿超老将挤出国家队一种很浪的打法DNF: 新副本传奇页游风, 记录室钥匙千万留好! 每周7次奖励拉满苹果倒在手机AI时代?如果你现在连五千块都拿不出,一定要看这条视频记者: 在瓜帅之后, 加斯佩里尼是第一个真正为足球带来改变的教练大批澳洲华人不知道: 回国花的钱, 居然可以找回来!他是公安部第三任部长, 59岁自杀, 两位公安部副部长受牵连被审查欧冠经典!16年欧冠马竞再遇死敌皇马,西蒙尼又一次痛失冠军新趋势!北青:伊万征调多名跑动能力和身体条件俱佳的国脚!贪财又贪色! 德不配位的4位老戏骨, “晚节不保”真的一点都不冤向佐回应参加披荆斩棘,称帮郭碧婷一起赚奶粉钱#向佐彻底卖不动了? iPhone在中国跌出前五, 华为成最大赢家
最新回复(0)