Vue 组件通信的几种方式

embedded/2024/9/23 14:26:11/

vue通信方式简介

在Vue.js中,组件间通信可以通过props、$emit、事件总线、Vuex以及Provide/Inject等方式来实现,总的来说,组件通信是现代前端开发中不可或缺的一部分,它可以帮助开发者构建更加模块化、可维护和可扩展的应用。

  1. Props / $emit:

    • Props:通过props属性将数据从父组件传递给子组件。
    • $emit:在子组件中通过$emit方法触发自定义事件,父组件可以监听这些事件来接收子组件传递的数据。
  2. 事件总线(Event Bus):

    • 创建一个空的Vue实例作为事件总线,在需要通信的组件中都可以通过该实例进行事件的触发和监听。
    • 可以使用$on方法监听事件,使用$emit方法触发事件。
  3. Vuex复杂的单页应用数据管理

    • Vuex是Vue.js的官方状态管理工具,适用于大型应用中组件间的状态共享和通信。
    • 它通过一个全局的store来管理应用的状态,并提供了一系列的API来实现状态的读取、修改和监听。
  4. Provide / Inject

    • 父组件通过provide选项提供数据,子组件通过inject选项来注入这些数据。
    • 这种方式可以实现跨层级组件间的通信,但要注意不要滥用,以免造成组件间的耦合度过高。

以上具体使用哪种方式取决于你的项目需求和组件之间的关系。对于简单的通信,可以使用props / $emit;对于较复杂的状态管理和多组件之间的通信,可以考虑使用Vuex;对于跨层级的通信或者跨多个组件的通信,可以考虑使用Provide / Inject或事件总线。 

一、props

方法一:props

使用props,父组件可以使用props向子组件传递数据。

父组件vue模板father.vue

javascript"><template><child :msg="message"></child>
</template><script>import child from './child.vue';export default {components: {child},data () {return {message: 'father message';}}
}
</script>

子组件vue模板child.vue 

javascript"><template><div>{{msg}}</div>
</template><script>
export default {props: {msg: {type: String,required: true}}
}
</script>

方法二 使用$children 【使用$children可以在父组件中访问子组件。】

二、子组件向父组件通信 

 方法一:使用vue事件

父组件向子组件传递事件方法,子组件通过$emit触发事件,回调给父组件。

父组件vue模板father.vue

javascript"><template><child @msgFunc="func"></child>
</template><script>import child from './child.vue';export default {components: {child},methods: {func (msg) {console.log(msg);}}
}
</script>

子组件vue模板child.vue 

javascript"><template><button @click="handleClick">点我</button>
</template><script>
export default {props: {msg: {type: String,required: true}},methods () {handleClick () {//........this.$emit('msgFunc');}}
}
</script>

方法二: 通过修改父组件传递的props来修改父组件数据 

这种方法只能在父组件传递一个引用变量时可以使用,字面变量无法达到相应效果。因为饮用变量最终无论是父组件中的数据还是子组件得到的props中的数据都是指向同一块内存地址,所以修改了子组件中props的数据即修改了父组件的数据。【不建议】 

方法三:使用$parent使用--->$parent可以访问父组件的数据。

 三、非父子组件、兄弟组件之间的数据传递

非父子组件通信,Vue官方推荐使用一个Vue实例作为中央事件总线。

Vue内部有一个事件机制,可以参考源码。

$on方法用来监听一个事件。

$emit用来触发一个事件。

javascript">/*新建一个Vue实例作为中央事件总嫌*/
let event = new Vue();/*监听事件*/
event.$on('eventName', (val) => {//......do something
});/*触发事件*/
event.$emit('eventName', 'this is a message.');

四、多层级父子组件通信: 

在Vue1.0中实现了$broadcast与$dispatch两个方法用来向子组件(或父组件)广播(或派发),当子组件(或父组件)上监听了事件并返回true的时候会向爷孙级组件继续广播(或派发)事件。但是这个方法在Vue2.0里面已经被移除了。

其实这两个方法内部实现还是用到的还是$parent以及$children,用以遍历子节点或是逐级向上查询父节点,访问到指定组件名的时候,调用$emit触发指定事件。 


http://www.ppmy.cn/embedded/9066.html

相关文章

java的单元测试和反射

单元测试 就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试 Junit单元测试框架&#xff1a; 可以用来对方法进行测试 有点&#xff1a; 可以灵活的编写测试代码&#xff0c;可以针对某个方法进行测试&#xff0c;也支持一键完成对全部方法的自动发测试&a…

运气变好的几个小妙招

首先不要总是说一些丧气话&#xff0c;因为老天爷是听不到主语的&#xff0c;即使你当时说的是”谁谁谁好烦人啊“类似的句式&#xff0c;但传到上帝耳朵的时候会失去主语&#xff0c;也就会潜移默化的带到自己身上。 那我们应该怎么做呐&#xff1f; 1. 避免消极语言 首先&…

Linux中进程和计划任务管理(2)

一.进程命令 1.lsof lsof 命令&#xff0c;“list opened files”的缩写&#xff0c;直译过来&#xff0c;就是列举系统中已经被打开的文件。通过 lsof 命令&#xff0c;我们就可以根据文件找到对应的进程信息&#xff0c;也可以根据进程信息找到进程打开的文件。 格式&…

Uipath用计划任务启动 bat脚本语句

方法一 cd C:\Program Files\UiPath\Studio UiRobot execute --file "Uipath路径\project.json" 这种是用UiRobot.exe来启动任务的 方法二 "C:\Progra~1\UiPath\Studio\UiRobot.exe" -file "C:\Users\Documents\UiPath\se_Windows.1.0.3.nupkg&q…

MAC上如何将某个目录制作成iso格式磁盘文件,iso文件本质是什么?以及挂载到ParallelDesktop中?(hdiutil makehybrid )

背景 ParallelsDesktop没有安装ParallelsTools的无法共享目录&#xff0c;可以通过ParallelsDesktop提供CD磁盘的方式共享进去 命令 # 准备文档 mkdir mytestdir cp xxx mytestdir# 生成iso hdiutil makehybrid -o output.iso mytestdir -iso -joliethdiutil是MAC提供的磁盘…

【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)

目录 一、前言 二、explicit关键字是什么&#xff1f; 三、构造函数还具有类型转换的作用 &#x1f34e;单参构造函数 ✨引出 explicit 关键字 &#x1f34d;多参构造函数 ✨为什么需要explicit关键字&#xff1f; ✨怎么使用explicit关键字&#xff1f; 四、总结 五…

​LeetCode解法汇总377. 组合总和 Ⅳ

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 动态规划。dp[i]代表target为i时的类型数…

会议室预约小程序开源版开发

会议室预约小程序开源版开发 支持设置免费预约和付费预约、积分兑换商城、积分签到等 会议室类目&#xff0c;提供多种类型和设施的会议室选择&#xff0c;满足不同会议需求。 预约日历&#xff0c;展示会议室预约情况&#xff0c;方便用户选择空闲时段。 预约记录&#xff0…