最新要闻
- 艾斯死的那一集是多少集?艾斯复活是哪一集?
- 世界最新:马斯克做出重要“交易”:开放北美全部特斯拉超充桩 换取补贴
- 【全球独家】5月上映!迪士尼《小美人鱼》真人电影新预告发布:特效惊艳
- 突破事业线
- 环球观天下!3000元以下唯一的16G内存手机!真我GT Neo5获得天猫京东销量冠军
- 死磕竞争对手ChatGPT!谷歌要求员工每天花2至4小时测试自家Bard AI
- 全球球精选!房地产市场支持政策需更精准
- 世界信息:男子借朋友12万 1小时后借条变成白纸!网友:防不胜防
- 顶级富豪果然都惜命 扎克伯格个人安保费一年超1亿元
- 环球要闻:今起可提前预约个税办税:每天6-22点可在App预约
- 要闻:接棒年销26万台扫地机器人爆款单品!石头G10S Pure即将正式亮相
- 天天通讯!吉利中高端新能源系列定名“吉利银河”:每个人都仰望
- 诺如病毒进入高发期 学校、家庭如何做好预防?一文了解
- 你怕失业吗?马斯克炮轰人工智能:比核弹头更危险
- 巴菲特“黄金搭档”芒格盛赞:比亚迪在中国遥遥领先于特斯拉
- 40岁男子报复10岁小孩连划7车引围观:结局舒适了 网友点赞
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Vue 组件之间传递参数
一、Vue 2
【资料图】
- 1、父组件向子组件传值,使用 props:可以通过在子组件上绑定 props,然后在父组件中通过 v-bind 绑定相应的数据来传递数据。
父组件中的代码:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent, }, data() { return { dataA: "data from parent", }; },};</script>
子组件中的代码:
{{ propA }} <script>export default { props: { propA: String, },};</script>
- 2、子组件向父组件传值,使用 $emit:可以通过在子组件中使用 $emit 触发自定义事件,并在父组件中使用 v-on 监听相应的事件来传递数据。
子组件中的代码:
<script>export default { data() { return { dataB: "data from child", }; }, methods: { sendDataToParent() { this.$emit("send-data", this.dataB); }, },};</script>
父组件中的代码:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent, }, methods: { receiveDataFromChild(dataB) { console.log(dataB); }, },};</script>
- 3、兄弟组件之间传值:可以通过使用一个共同的父组件,然后将需要共享的数据放在父组件的 data 中,再通过 props 将数据传递给各自的子组件。
父组件中的代码:
<script>import ChildA from "./ChildA.vue";import ChildB from "./ChildB.vue";export default { components: { ChildA, ChildB, }, data() { return { dataA: "data from parent to child a", dataB: "data from parent to child b", }; },};</script>
子组件 A 中的代码:
{{ propA }} <script>export default { props: { propA: String, },};</script>
子组件 B 中的代码:
{{ propB }} <script>export default { props: { propB: String, },};</script>
- 4、跨级组件传值,使用 provide 和 inject(该方法也可用于父子组件传值):provide 可以在祖先组件中定义一个值或者方法,然后在子孙组件中使用 inject 来注入这个值或者方法。
祖先组件中的代码:
<script>import ChildA from "./ChildA.vue";export default { components: { ChildA, }, provide() { return { sharedData: "data from ancestor", }; },};</script>
子孙组件 A 中的代码:
{{ sharedData }} <script>export default { inject: ["sharedData"],};</script>
- 5、使用全局事件总线:可以使用 Vue 的事件机制,通过在 Vue 实例上使用 $on 来监听事件,然后在其他组件中使用 $emit 触发相应的事件来传递数据。这种方式可以在任意组件之间传递数据。
在 main.js 中定义一个空的 Vue 实例作为事件总线:
import Vue from "vue";export const bus = new Vue();
子组件 A 中的代码:
<script>import { bus } from "./main";export default { methods: { sendDataToSibling() { bus.$emit("send-data", "data from child a"); }, },};</script>
子组件 B 中的代码:
{{ dataFromSibling }} <script>import { bus } from "./main";export default { data() { return { dataFromSibling: "", }; }, mounted() { bus.$on("send-data", (data) => { this.dataFromSibling = data; }); },};</script>
- 6、使用 Vuex:当应用的数据状态比较复杂或者需要在多个组件之间共享时,可以使用 Vuex,它是一个专为 Vue.js 应用程序开发的状态管理模式。可以在任何组件中访问和修改 Vuex 存储的数据,通过 mutations 来修改状态,通过 actions 来触发 mutations。这种方式可以方便地在不同的组件中进行状态管理和数据共享。
在 store.js 中定义一个 Vuex store:
import Vue from "vue";import Vuex from "vuex";Vue.use(Vuex);const store = new Vuex.Store({ state: { dataC: "data from Vuex", }, mutations: { updateDataC(state, payload) { state.dataC = payload; }, },});export default store;
子组件 A 中的代码:
<script>import { mapMutations } from "vuex";export default { methods: { ...mapMutations(["updateDataC"]), sendDataToSibling() { this.updateDataC("data from child a"); }, },};</script>
子组件 B 中的代码:
{{ dataC }} <script>import { mapState } from "vuex";export default { computed: { ...mapState(["dataC"]), },};</script>
- 7、子组件向父组件传值,使用 $attrs 和 $listeners:
父组件中的代码:
<script>import ChildComponent from "./ChildComponent";export default { components: { ChildComponent, },};</script>
子组件中的代码:
这种方式可以将父组件传递给子组件的属性和事件自动传递给子组件的根元素,从而达到父子组件传值的目的。
- 8、使用 $refs:可以使用 Vue 提供的 $refs 属性来获取组件实例,然后通过调用组件的方法来进行数据传递。这种方式不推荐使用,因为不易维护和调试。
9、使用事件总线库:可以使用 Vue.js 的第三方库如 Event Bus、Tiny-Emmiter 等来传递数据。这些库提供了一种方便、简单的方式来在不同的组件之间进行事件传递。但是需要注意,使用第三方库可能会增加项目的复杂性和维护成本。
二、Vue 3
- 1、Props
Props 是一种在组件之间传递数据的方式,通过在组件标签上使用属性绑定,父组件可以向子组件传递数据。在子组件中,通过在 props 中定义对应的属性名,可以获取到父组件传递过来的数据。
例如,父组件中的模板:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent }, data() { return { hello: "Hello from parent!" }; }};</script>
子组件中的模板:
{{ message }}<script>export default { props: { message: String }};</script>
- 2、Emit
Emit 是一种在子组件中触发事件的方式,通过在子组件中使用 $emit
方法,可以向父组件发送数据。在父组件中,通过在子组件标签上使用 v-on
或 @
语法,可以监听子组件触发的事件,并获取子组件发送的数据。
例如,子组件中的模板:
<script>export default { methods: { sendMessage() { this.$emit("message-sent", "Hello from child!"); } }};</script>
父组件中的模板:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent }, methods: { receiveMessage(message) { console.log(message); } }};</script>
- 3、Provide/Inject
Provide/Inject 是一种在祖先组件和后代组件之间共享数据的方式。通过在祖先组件中使用 provide
方法提供数据,在后代组件中使用 inject
方法获取数据。
例如,祖先组件中的模板:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent }, provide() { return { message: "Hello from ancestor!" }; }};</script>
后代组件中的模板:
{{ message }}<script>export default { inject: ["message"]};</script>
- 4、$attrs 和 $listeners
$attrs 和 $listeners 是在 Vue 2 中引入的特性,但在 Vue 3 中也得到了支持。
$attrs 是一个包含了父组件传递给子组件的所有属性的对象,可以在子组件中通过访问 $attrs
来获取这些属性。如果不希望某些属性传递到子组件中,可以在子组件中使用 v-bind="$attrs"
并指定排除的属性名称,或者在父组件中使用 .sync
修饰符,将属性绑定到子组件的一个名为 $attrs
的属性上。
$listeners 是一个包含了父组件传递给子组件的所有事件监听器的对象,可以在子组件中通过访问 $listeners
来获取这些事件监听器。如果需要在子组件中监听某个事件,可以使用 v-on="$listeners"
将所有的事件监听器绑定到子组件上。
例如,父组件中的模板:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent }, methods: { handleClick() { console.log("Clicked!"); } }};</script>
子组件中的模板:
{{ message }}<script>export default { props: { message: String }};</script>
- 5、provide/inject 与 props 的结合使用
在 Vue 3 中,provide 和 inject 可以与 props 结合使用,从而实现一种高级的数据传递方式。具体做法是,在祖先组件中使用 provide 方法提供数据,并在后代组件中使用 inject 方法获取数据;同时,在后代组件中,可以在 props 中声明和接收数据,从而实现数据的类型检查和默认值设定。
例如,祖先组件中的模板:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent }, provide() { return { message: "Hello from ancestor!" }; }};</script>
后代组件中的模板:
{{ message }}<script>export default { inject: ["message"], props: { message: { type: String, default: "Hello from default!" } }};</script>
在上面的例子中,子组件会首先从祖先组件中获取名为 message
的数据,如果没有提供,则使用默认值 Hello from default!
。在子组件中,props 会覆盖 provide/inject,因此如果父组件和子组件都提供了同一个属性,子组件中的 props 值会覆盖 provide/inject 中的值。
- 6、$emit
$emit 是一种常见的从子组件向父组件传递数据的方式。在子组件中,使用 $emit 方法触发一个自定义事件,并将需要传递的数据作为参数传递给事件处理函数。在父组件中,使用 v-on 指令监听子组件的自定义事件,并在事件处理函数中获取子组件传递过来的数据。
例如,子组件中的模板:
<script>export default { methods: { handleClick() { this.$emit("button-click", "Hello from child!"); } }};</script>
父组件中的模板:
<script>import ChildComponent from "./ChildComponent.vue";export default { components: { ChildComponent }, methods: { handleButtonClick(message) { console.log(message); } }};</script>
在这个例子中,子组件中的 $emit 方法触发了一个名为 button-click
的自定义事件,并将字符串 "Hello from child!"
作为参数传递给了父组件中的事件处理函数 handleButtonClick。
- 7、Vuex
Vuex 是一种专门用于管理应用程序状态的库,可以用于跨组件传递数据。在 Vuex 中,可以定义一个全局的状态管理器,所有的组件都可以通过 getter 和 setter 方法访问和修改这个状态管理器中的数据。
例如,定义一个 Vuex store:
import { createStore } from "vuex";const store = createStore({ state: { message: "Hello from store!" }, mutations: { updateMessage(state, message) { state.message = message; } }, getters: { getMessage(state) { return state.message; } }});export default store;
在组件中使用 Vuex:
{{ message }} <script>import { mapGetters, mapMutations } from "vuex";export default { computed: { ...mapGetters(["getMessage"]) }, methods: { ...mapMutations(["updateMessage"]) }};</script>
在这个例子中,组件通过 mapGetters
方法将 Vuex store 中的 getMessage
方法映射为组件中的计算属性,从而获取 Vuex store 中的数据;同时,通过 mapMutations
方法将 Vuex store 中的 updateMessage
方法映射为组件中的方法,从而修改 Vuex store 中的数据。
- 8、EventBus
EventBus 是一种自定义事件总线,可以用于在任意组件之间传递数据。在 EventBus 中,可以定义一个全局的事件中心,所有的组件都可以通过 $on 和 $emit 方法监听和触发自定义事件。
例如,定义一个 EventBus:
import mitt from "mitt";const bus = mitt();export default bus;
在组件中使用 EventBus:
{{ message }} <script>import bus from "./event-bus";export default { data() { return { message: "Hello from component!" }; }, methods: { updateMessage() { this.message = "New message!"; bus.emit("message-updated", this.message); } }, created() { bus.on("message-updated", message => { console.log(message); }); }};</script>
在这个例子中,组件中的 updateMessage
方法通过 EventBus 的 emit
方法触发了一个名为 message-updated
的自定义事件,并将修改后的消息作为参数传递给事件处理函数;同时,在组件的 created
生命周期钩子中,通过 EventBus 的 on
方法监听名为 message-updated
的自定义事件,并在事件处理函数中打印接收到的消息。
总之,Vue 3 中组件之间传值的方式很多,可以根据具体的场景选择最适合的方式。使用 props 和 $emit 可以实现父子组件之间的传值,使用 provide 和 inject 可以实现祖先组件向后代组件的传值,使用 Vuex 和 EventBus 可以实现任意组件之间的传值。在选择组件传值方式时,还应该考虑数据的安全性、可维护性和性能等因素。
Vue 组件之间传递参数
【世界聚看点】关于 layui 弹出一个 DOM 表单的问题
艾斯死的那一集是多少集?艾斯复活是哪一集?
世界最新:马斯克做出重要“交易”:开放北美全部特斯拉超充桩 换取补贴
【全球独家】5月上映!迪士尼《小美人鱼》真人电影新预告发布:特效惊艳
突破事业线
环球观天下!3000元以下唯一的16G内存手机!真我GT Neo5获得天猫京东销量冠军
死磕竞争对手ChatGPT!谷歌要求员工每天花2至4小时测试自家Bard AI
全球球精选!房地产市场支持政策需更精准
安卓导出已安装app的apk
模型预处理层介绍(2) - Hashing
世界信息:男子借朋友12万 1小时后借条变成白纸!网友:防不胜防
顶级富豪果然都惜命 扎克伯格个人安保费一年超1亿元
环球要闻:今起可提前预约个税办税:每天6-22点可在App预约
要闻:接棒年销26万台扫地机器人爆款单品!石头G10S Pure即将正式亮相
天天通讯!吉利中高端新能源系列定名“吉利银河”:每个人都仰望
全球信息:快速搭建一个网关服务,动态路由、鉴权,一网打尽!(含流程图)
全球播报:再有人问你抽象工厂设计模式,把这篇文章丢给他
环球观天下!时间是什么?时间同步是什么?GPS北斗卫星授时又是什么?
世界要闻:《分布式技术原理与算法解析》学习笔记Day13
诺如病毒进入高发期 学校、家庭如何做好预防?一文了解
你怕失业吗?马斯克炮轰人工智能:比核弹头更危险
巴菲特“黄金搭档”芒格盛赞:比亚迪在中国遥遥领先于特斯拉
40岁男子报复10岁小孩连划7车引围观:结局舒适了 网友点赞
《霍格沃茨之遗》更新后PC优化更差!玩家:游戏卡顿问题解决一下
快资讯丨再下一城!百度地图红绿灯倒计时上线兰州:实时读秒
最资讯丨下行5000兆 跟上行同速!谷歌美国推5Gbps光纤:每月850元
全球要闻:读Java实战(第二版)笔记11_语言特性和类库更新
片仔癀珍珠霜的功效
天天热头条丨HEU KMS Activator 28.0.0全能系统数字许可激活工具
CentOS7.9安装K8S高可用集群(三主三从)
Android JetPack~ LiveData (一) 介绍与使用
环球观热点:SDK多项目开发与联调
全球快看:期末复习——线程
环球热点评!5年前就已杀青 周星驰《美人鱼2》进入后期制作
谨慎升级 等了2个月的AMD新驱动疑似翻车:系统崩了
世界热议:央广网:“暴雪式”傲慢引众怒 或终将致其失去中国市场
要闻速递:中国移动:加速千兆网络全面普及 建成全球最大规模光网络
中国快递卷了15年:死死困住了一个50岁的老快递员
纽约黄金期货周三收跌1.1% 创五周来最低收盘价
1998年属虎的人2012年运程
今日聚焦!qq情侣网名 〈談情》**/|(說爰)ⅱ,
80年代的零食大全怀旧辣条_80年代的零食大全怀旧
【保姆级】Python最新版3.11.1开发环境搭建,看这一篇就够了(适用于Python3.11.2安装)
【天天新要闻】day10-1-中文乱码处理
实时焦点:一次学俩Vue&Blazor:1.4基础-响应式数据
数论模板
世界微速讯:2023年春运收官:40天发送旅客近16亿人次 大涨50%
【环球报资讯】数据结构刷题2023.02.15小记
给我两分钟的时间:微博风格九宫格:UICollectionView实现
《分布式技术原理与算法解析》学习笔记Day12
【算法训练营day45】LeetCode70. 爬楼梯(进阶) LeetCode322. 零钱兑换 LeetCode279. 完全平方数
香港2022年暴力罪案同比下降7.9%
观天下!探险的好处辩论赛,正方_探险的好处
全球播报:AMD RX 7600S游戏本显卡首测:远不如RTX 3060!高端弃疗了
世界速讯:10道恋爱送命题灵魂拷问ChatGPT:它的回答让我陷入沉思
马斯克向往每周只工作80小时!网友:驴都不敢这么用
每日速读!中国内地特供!Intel i5-13490F处理器图赏
天天快看:002. html篇之《表格》
当前视讯!力扣---3. 无重复字符的最长子串
今日热文:轻薄长续航!小新Air14超极本2023发布:标配13代酷睿+1TB SSD
普及1TB 联想小新2023笔记本、一体机价格汇总:最贵才8999元
每日资讯:8999元 联想小新Pro 27一体机发布:13代酷睿i9搭配Arc独显
环球微头条丨4199元起 小新14/16轻薄本2023发布:酷睿i5-1340P、高配1TB SSD
播报:三星Galaxy S23 Ultra发布 老外怒赞:安卓阵营老大
最资讯丨【LeetCode栈与队列#05】滑动窗口最大值
如何优雅的在 Word 中添加漂亮的代码?
今日热文:2023.02.15.差分
热头条丨公积金月汇缴额是什么意思
当前热讯:用微信传播盗版电影被查:向两百多人分享《流浪地球2》《满江红》链接
新资讯:日本独居雌长臂猿突然产崽!孩子的父亲竟还是自己的“爷爷”
环球最新:Lady Gaga《小丑2》剧照首曝:疯狂的小丑女登场!
环球速讯:联想小新官宣接入百度“文心一言”:可在桌面一键直达
当前通讯!新能源车企现最大跌幅背后:涨价、营销、刺激消费的“国补退坡游戏”
【环球速看料】数据类型之字符串、数据类型之列表、数据类型之字典、数据类型之布尔值、数据类型之元组、数据类型之集合、与用户交互、格式化输出、基本运算符
每日热讯!数字化开采|AIRIOT智慧矿山自动化生产解决方案
全球视讯!wagger也不好用了!API文档还得是Apipost
世界信息:Web 页面之间传递参数
Java开发工具IntelliJ IDEA 2020.2完整授权流程
观速讯丨一加显示器E 24上市:24寸IPS屏、18W PD输出
环球最新:网易代理《迷室3》《迷室:往逝》经典手游宣布停运:数据全清空
硬蹭名气?《中国式相亲2》非《中国式家长》团队作品
热议:桂格燕麦诞生于俄亥俄引网友关注 客服:产品与俄亥俄无关
环球微动态丨电量低于20%赶快充电!雅迪电动车保养攻略来了:关乎安全 车主必看
前沿热点:M值如何兑换话费
焦点观察:记录--『uni-app、小程序』蓝牙连接、读写数据全过程
全球速看:PostgreSQL重要参数解析及优化
天天新动态:openeuler加载dpdk驱动模块
【全球报资讯】(数据库系统概论|王珊)第三章关系数据库标准语言SQL-第六、七节:视图
环球热头条丨【算法训练营day44】完全背包基础 LeetCode518. 零钱兑换II LeetCode377. 组合总和IV
天天看热讯:想要模仿LPL,DRX赛后发漫画,却被Gen官方拉黑了?
焦点速读:Win11下月喜迎更新大礼包:10GB补丁 重启次数更少
【环球播资讯】员工发现老板娘偷看同事微信:火速离职
天天精选!车标成伤人凶器 日产召回超40万辆汽车
索尼降噪耳机新秀!WH-CH720N意外偷跑:升级蓝牙5.2
大国重器 首台国产HA级重型燃机下线:未来将100%零排放
焦点!字体查看小工具 -- (采用wpf开发)
【算法训练营day43】LeetCode1049. 最后一块石头的重量II LeetCode494. 目标和 LeetCode474. 一和零
每日看点!独立包装:大牌N95口罩25片9.9元到手
环球观速讯丨贾跃亭名下已无财产可执行:无车辆、不动产