位置: IT常识 - 正文

Vue 组件之间传值(vue组件之间传值几种方法)

编辑:rootadmin
Vue 组件之间传值

推荐整理分享Vue 组件之间传值(vue组件之间传值几种方法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue组件之间传递数据,vue组件之间传递方法,vue组件之间传参数,vue组件之间传值详解,vue组件之间传值几种方法,vue 组件之间传值几种方式,vue组件之间传值详解,vue组件之间传值几种方法,内容如对您有帮助,希望把文章链接给更多的朋友!

一、Vue 组件之间传值的主要方法

Vue 3 对于组件之间传递值的基本思想与 Vue 2 相似,但是有一些语法和 API 上的改变,主要的传值方法有以下几种:

1、父组件向子组件传值,使用 props:可以通过在子组件上绑定 props,然后在父组件中通过 v-bind 绑定相应的数据来传递数据。

2、子组件向父组件传值,使用 $emit:可以通过在子组件中使用 $emit 触发自定义事件,并在父组件中使用 v-on 监听相应的事件来传递数据。

3、兄弟组件之间传值:可以通过使用一个共同的父组件,然后将需要共享的数据放在父组件的 data 中,再通过 props 将数据传递给各自的子组件。

4、跨级组件传值,使用 provide 和 inject(同样适用于父子组件传值):provide 可以在祖先组件中定义一个值或者方法,然后在子孙组件中使用 inject 来注入这个值或者方法。

5、使用全局事件总线:可以使用 Vue 的事件机制,通过在 Vue 实例上使用 $on 来监听事件,然后在其他组件中使用 $emit 触发相应的事件来传递数据。这种方式可以在任意组件之间传递数据。

6、使用 Vuex:当应用的数据状态比较复杂或者需要在多个组件之间共享时,可以使用 Vuex,它是一个专为 Vue.js 应用程序开发的状态管理模式。可以在任何组件中访问和修改 Vuex 存储的数据,通过 mutations 来修改状态,通过 actions 来触发 mutations。这种方式可以方便地在不同的组件中进行状态管理和数据共享。

7、使用 $attrs 和 $listeners,$attrs 和 $listeners 是常用的两个特殊属性,它们可以用来向组件传递属性和事件监听器。

8、使用 $refs:可以使用 Vue 提供的 $refs 属性来获取组件实例,然后通过调用组件的方法来进行数据传递。这种方式不推荐使用,因为不易维护和调试。

9、使用事件总线库:可以使用 Vue.js 的第三方库如 Event Bus、Tiny-Emmiter 等来传递数据。这些库提供了一种方便、简单的方式来在不同的组件之间进行事件传递。但是需要注意,使用第三方库可能会增加项目的复杂性和维护成本。

二、Vue 2 组件之间传值示例代码

1、父组件向子组件传值,使用 props:可以通过在子组件上绑定 props,然后在父组件中通过 v-bind 绑定相应的数据来传递数据。

父组件中的代码:

<template> <div> <child-component :prop-a="dataA"></child-component> </div></template><script>import ChildComponent from './ChildComponent.vue';export default { components: { ChildComponent, }, data() { return { dataA: 'data from parent', }; },};</script>

 子组件中的代码:

<template> <div> {{ propA }} </div></template><script>export default { props: { propA: String, },};</script>2、子组件向父组件传值,使用 $emit:可以通过在子组件中使用 $emit 触发自定义事件,并在父组件中使用 v-on 监听相应的事件来传递数据。

子组件中的代码:

<template> <div> <button @click="sendDataToParent">Send Data To Parent</button> </div></template><script>export default { data() { return { dataB: 'data from child', }; }, methods: { sendDataToParent() { this.$emit('send-data', this.dataB); }, },};</script>

 父组件中的代码:

<template> <div> <child-component @send-data="receiveDataFromChild"></child-component> </div></template><script>import ChildComponent from './ChildComponent.vue';export default { components: { ChildComponent, }, methods: { receiveDataFromChild(dataB) { console.log(dataB); }, },};</script>3、兄弟组件之间传值:可以通过使用一个共同的父组件,然后将需要共享的数据放在父组件的 data 中,再通过 props 将数据传递给各自的子组件。

父组件中的代码:

<template> <div> <child-a :prop-a="dataA"></child-a> <child-b :prop-b="dataB"></child-b> </div></template><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 中的代码:

<template> <div> {{ propA }} </div></template><script>export default { props: { propA: String, },};</script>

 子组件 B 中的代码:

<template> <div> {{ propB }} </div></template><script>export default { props: { propB: String, },};</script>4、跨级组件传值,使用 provide 和 inject(该方法也可用于父子组件传值):provide 可以在祖先组件中定义一个值或者方法,然后在子孙组件中使用 inject 来注入这个值或者方法。

祖先组件中的代码:

<template> <div> <child-a></child-a> </div></template><script>import ChildA from './ChildA.vue';export default { components: { ChildA, }, provide() { return { sharedData: 'data from ancestor', }; },};</script>

 子孙组件 A 中的代码:

<template> <div> {{ sharedData }} </div></template><script>export default { inject: ['sharedData'],};</script>5、使用全局事件总线:可以使用 Vue 的事件机制,通过在 Vue 实例上使用 $on 来监听事件,然后在其他组件中使用 $emit 触发相应的事件来传递数据。这种方式可以在任意组件之间传递数据。

在 main.js 中定义一个空的 Vue 实例作为事件总线:

import Vue from 'vue';export const bus = new Vue();

 子组件 A 中的代码:

<template> <div> <button @click="sendDataToSibling">Send Data To Sibling</button> </div></template><script>import { bus } from './main';export default { methods: { sendDataToSibling() { bus.$emit('send-data', 'data from child a'); }, },};</script>Vue 组件之间传值(vue组件之间传值几种方法)

 子组件 B 中的代码:

<template> <div> {{ dataFromSibling }} </div></template><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 中的代码:

<template> <div> <button @click="sendDataToSibling">Send Data To Sibling</button> </div></template><script>import { mapMutations } from 'vuex';export default { methods: { ...mapMutations(['updateDataC']), sendDataToSibling() { this.updateDataC('data from child a'); }, },};</script>

 子组件 B 中的代码:

<template> <div> {{ dataC }} </div></template><script>import { mapState } from 'vuex';export default { computed: { ...mapState(['dataC']), },};</script>7、父子组件传值,使用 $attrs 和 $listeners:

$attrs 是一个包含了父组件传递给子组件的所有属性的对象,可以在子组件中通过访问 $attrs 来获取这些属性。如果不希望某些属性传递到子组件中,可以在子组件中使用 v-bind="$attrs" 并指定排除的属性名称,或者在父组件中使用 .sync 修饰符,将属性绑定到子组件的一个名为 $attrs 的属性上。

$listeners 是一个包含了父组件传递给子组件的所有事件监听器的对象,可以在子组件中通过访问 $listeners 来获取这些事件监听器。如果需要在子组件中监听某个事件,可以使用 v-on="$listeners" 将所有的事件监听器绑定到子组件上。

$attrs 和 $listeners 是常用的两个特殊属性,它们可以用来向组件传递属性和事件监听器。假设我们有一个父组件和一个子组件,子组件需要接收父组件的一些属性和事件监听器,同时还需要把这些属性和事件传递给子组件的某个子元素。

父组件中的代码:

<template> <div> <child-component :title="title" v-on:click="handleClick" /> </div></template><script>import ChildComponent from './ChildComponent.vue';export default { components: { ChildComponent }, data() { return { title: 'Hello World', }; }, methods: { handleClick() { console.log('Button Clicked'); }, },};</script>

 子组件中的代码:

<template> <div> <button @click="$emit('click')">Click me</button> <div v-bind="$attrs"> <slot /> </div> </div></template><script>export default { inheritAttrs: false, props: { title: { type: String, default: '', }, }, mounted() { console.log(this.$attrs); console.log(this.$listeners); },};</script>

在子组件中,我们使用 v-bind="$attrs" 把所有父组件传递过来的属性绑定到子元素上。同时,我们使用 $emit('click') 来触发父组件传递过来的点击事件。

在子组件 中,需要设置 inheritAttrs: false,来禁止自动将父组件传递的属性绑定到子组件的根元素上。这样,我们就可以使用 v-bind="$attrs" 把所有属性绑定到子元素上。

在 mounted 钩子中,我们可以通过 this.$attrs 和 this.$listeners 来分别访问所有属性和事件监听器。这样,我们就可以在子组件中使用这些属性和事件了。

8、使用 $refs:可以使用 Vue 提供的 $refs 属性来获取组件实例,然后通过调用组件的方法来进行数据传递。这种方式不推荐使用,因为不易维护和调试。

9、使用事件总线库:可以使用 Vue.js 的第三方库如 Event Bus、Tiny-Emmiter 等来传递数据。这些库提供了一种方便、简单的方式来在不同的组件之间进行事件传递。但是需要注意,使用第三方库可能会增加项目的复杂性和维护成本。

三、Vue 3 组件之间传值示例代码

1、Props

Props 是一种在组件之间传递数据的方式,通过在组件标签上使用属性绑定,父组件可以向子组件传递数据。在子组件中,通过在 props 中定义对应的属性名,可以获取到父组件传递过来的数据。

例如,父组件中的模板:

<template> <child-component :message="hello"></child-component></template><script>import ChildComponent from './ChildComponent.vue';export default { components: { ChildComponent }, data() { return { hello: 'Hello from parent!' }; }};</script>

 子组件中的模板:

<template> <div>{{ message }}</div></template><script>export default { props: { message: String }};</script>2、$emit 

$emit  是一种在子组件中触发事件的方式,通过在子组件中使用 $emit 方法,可以向父组件发送数据。在父组件中,通过在子组件标签上使用 v-on 或 @ 语法,可以监听子组件触发的事件,并获取子组件发送的数据。

例如,子组件中的模板:

<template> <button @click="sendMessage">Send Message</button></template><script>export default { methods: { sendMessage() { this.$emit('message-sent', 'Hello from child!'); } }};</script>

 父组件中的模板:

<template> <child-component @message-sent="receiveMessage"></child-component></template><script>import ChildComponent from './ChildComponent.vue';export default { components: { ChildComponent }, methods: { receiveMessage(message) { console.log(message); } }};</script>3、Provide/Inject

Provide/Inject 是一种在祖先组件和后代组件之间共享数据的方式。通过在祖先组件中使用 provide 方法提供数据,在后代组件中使用 inject 方法获取数据。

例如,祖先组件中的模板:

<template> <child-component></child-component></template><script>import ChildComponent from './ChildComponent.vue';export default { components: { ChildComponent }, provide() { return { message: 'Hello from ancestor!' }; }};</script>

 后代组件中的模板:

<template> <div>{{ message }}</div></template><script>export default { inject: ['message']};</script>4、$attrs 和 $listeners

$attrs 和 $listeners 是在 Vue 2 中引入的特性,但在 Vue 3 中也得到了支持。

例如,父组件中的模板:

<template> <child-component message="Hello from parent!" @click="handleClick"></child-component></template><script>import ChildComponent from './ChildComponent.vue';export default { components: { ChildComponent }, methods: { handleClick() { console.log('Clicked!'); } }};</script>

 子组件中的模板:

<template> <div v-bind="$attrs" v-on="$listeners">{{ message }}</div></template><script>export default { props: { message: String }};</script>5、provide/inject 与 props 的结合使用

在 Vue 3 中,provide 和 inject 可以与 props 结合使用,从而实现一种高级的数据传递方式。具体做法是,在祖先组件中使用 provide 方法提供数据,并在后代组件中使用 inject 方法获取数据;同时,在后代组件中,可以在 props 中

本文链接地址:https://www.jiuchutong.com/zhishi/300598.html 转载请保留说明!

上一篇:【chatgpt】chatgpt APi使用 GPT3(chattra)

下一篇:你的应用太慢了,给我司带来了巨额损失,该怎么办(应用加载慢)

  • 广州11月30日发布优化疫情防控管理措施后,多个区宣布解除临时管控区的管理措施

    广州11月30日发布优化疫情防控管理措施后,多个区宣布解除临时管控区的管理措施

  • 三类团购营销16种经典方法大集锦!(团购营销方案)

    三类团购营销16种经典方法大集锦!(团购营销方案)

  • excel表格筛选怎么添加选项(excel表格筛选怎么操作)

    excel表格筛选怎么添加选项(excel表格筛选怎么操作)

  • 西安一码通如何查看家庭成员健康嘛(西安一码通如何切换用户)

    西安一码通如何查看家庭成员健康嘛(西安一码通如何切换用户)

  • 苹果volte开关在哪(苹果volte开关在哪里关闭)

    苹果volte开关在哪(苹果volte开关在哪里关闭)

  • 手机需要关机休息吗(手机适当关机休息几天好吗)

    手机需要关机休息吗(手机适当关机休息几天好吗)

  • 抖音如何得抖音钻卡(抖音如何抖音号登陆)

    抖音如何得抖音钻卡(抖音如何抖音号登陆)

  • 微信群聊超过200人怎么扫码进群(微信群聊超过200人不能扫码进群)

    微信群聊超过200人怎么扫码进群(微信群聊超过200人不能扫码进群)

  • 电感性负载和电阻性负载的区别(电感性负载和电阻性负载哪个电流大)

    电感性负载和电阻性负载的区别(电感性负载和电阻性负载哪个电流大)

  • 4k显示器对显卡的要求(4k显示器对显卡配置的要求)

    4k显示器对显卡的要求(4k显示器对显卡配置的要求)

  • 500g内存的手机有哪些(500g内存的手机最低多少钱)

    500g内存的手机有哪些(500g内存的手机最低多少钱)

  • 二维码扫描不了怎么办(pdf文件二维码扫描不了)

    二维码扫描不了怎么办(pdf文件二维码扫描不了)

  • iphone双重认证有什么用(苹果双重认证会透露隐私吗)

    iphone双重认证有什么用(苹果双重认证会透露隐私吗)

  • 淘宝小黑盒新品是什么意思(淘宝小黑盒新品质量怎么样)

    淘宝小黑盒新品是什么意思(淘宝小黑盒新品质量怎么样)

  • 苹果11双卡怎么切换打电话(苹果11双卡怎么打电话自由选卡)

    苹果11双卡怎么切换打电话(苹果11双卡怎么打电话自由选卡)

  • 华为share一碰传怎么用(华为share一碰传怎么传照片)

    华为share一碰传怎么用(华为share一碰传怎么传照片)

  • iphonexr怎么关机(iphonexr怎么关机开机)

    iphonexr怎么关机(iphonexr怎么关机开机)

  • iphone x屏幕到2k了么(iphone x是2k分辨率么)

    iphone x屏幕到2k了么(iphone x是2k分辨率么)

  • 视频渲染是指什么(视频渲染是啥意思)

    视频渲染是指什么(视频渲染是啥意思)

  • 最具性价比的手机(最具性价比的手表品牌)

    最具性价比的手机(最具性价比的手表品牌)

  • 苹果a1278是哪一年出的(苹果a1287是哪年的)

    苹果a1278是哪一年出的(苹果a1287是哪年的)

  • 千牛怎么设置类目(手机千牛怎么设置类目)

    千牛怎么设置类目(手机千牛怎么设置类目)

  • vivoz3和y97的区别(vivo z3和y97哪个好)

    vivoz3和y97的区别(vivo z3和y97哪个好)

  • 如何制作mp4视频(怎样制作mp4视频短片)

    如何制作mp4视频(怎样制作mp4视频短片)

  • 滴滴麦克风在哪里开启(滴滴麦克风待授权怎么打开)

    滴滴麦克风在哪里开启(滴滴麦克风待授权怎么打开)

  • 苹果鼠标一代和二代的区别(苹果鼠标一代和二代的触摸排线一样吗)

    苹果鼠标一代和二代的区别(苹果鼠标一代和二代的触摸排线一样吗)

  • 在edge浏览器中使某网站始终使用IE模式打开(在edge浏览器中打开农行K宝)

    在edge浏览器中使某网站始终使用IE模式打开(在edge浏览器中打开农行K宝)

  • 剑灵怎么双开?有没有什么解决办法?(剑灵怎么双开2023)

    剑灵怎么双开?有没有什么解决办法?(剑灵怎么双开2023)

  • file命令  识别文件类型(file读取文件内容)

    file命令 识别文件类型(file读取文件内容)

  • 子公司之间股权转让
  • 债券的利益
  • 一般纳税人附加税优惠政策2023
  • 房地产老项目简易计税方法备案
  • 外国公司开发古镇
  • 消费税为什么要计入成本
  • 税控盘抵减税额填在主表哪里
  • 电子发票作废了还能恢复吗
  • 员工食堂餐费可以报销吗
  • 劳务报酬所得如何计税
  • 捐赠和赞助业务的税务处理怎么做?
  • 工程施工的保障措施
  • 个人股东转让股权印花税税率
  • 民间非营利组织会计制度
  • 增值税专用发票和普通发票的区别
  • 银票和承兑的区别
  • 车间扫帚存放架子
  • 分配现金股利是什么活动
  • 国际工程物资采购网
  • 实际销售金额是含税还是不含税
  • 增值税进项税额抵扣期限最新
  • 小企业原材料包括
  • pavmail.exe - pavmail进程是什么文件 有什么用
  • 销项负数发票怎么报税
  • 工商年检需准备什么资料
  • 商品购进核算
  • 日出的时候是圣诞节
  • 企业的组织形式共5种
  • 学习笔记:深度学习(2)——BP神经网络
  • php date()
  • 以前年度亏损现在不亏了
  • stat命令的作用
  • 工程公司项目管理部管理制度
  • 解决掉发的有效方法
  • 生产成本设置二级科目
  • 计算业务招待费扣除限额的基础包括营业外收入
  • 预包装销售是什么意思
  • 公对公转账在手机上怎么操作
  • 进项发票的作用
  • 公司员工入职的心得体会
  • 收到科技局补贴金费怎么入账
  • 化妆品消费税纳税标准
  • 营改增后增值税税率的调整
  • 预缴增值税可以抵扣销项税吗
  • 母公司和子公司是两个完全独立的法人
  • 参展企业收到展览费用
  • 自创商誉是否需要纳税
  • 没有到位的注资公司
  • 关于合同履约成本的表述错误的有
  • 资产负债表里包括应付利息吗
  • 小规模申请专票,税率是多少?
  • 开业前的装修费怎么做账
  • 管理会计的职能作用是
  • sqlserver全文索引
  • 醒狗音乐免费下载歌曲2017最新版
  • u盘安装win7系统鼠标键盘没反应
  • 修改windows host文件
  • ubuntu15.10中文版
  • win8默认输入法设置
  • win8.1快捷键
  • windows10cortana搜索框
  • window怎么操作
  • windows开始按钮点了没用
  • linux特殊权限命令
  • win7运行老游戏方法
  • cocos2djs
  • unity 移动应用开发
  • opengl es2.0
  • css布局的经典网站
  • html标签自动换行
  • shell脚本用法
  • VectorField2D
  • mongodb python
  • android 显示图片
  • 税收征收管理与实践
  • 河北省国家税务局长简介
  • 北京国家税务局官网
  • 广西税务局发票查验平台
  • 青岛税务局局长是什么级别?
  • 一般贸易和非一切贸易
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设