1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Vue组件通信(父传子 子传父 兄弟通信)

Vue组件通信(父传子 子传父 兄弟通信)

时间:2022-01-05 21:06:34

相关推荐

Vue组件通信(父传子 子传父 兄弟通信)

一.父组件传到子组件

父组件是通过props属性给子组件通信的

数据是单向流动 父—>子 (子组件中修改props数据,是无效的,会有一个红色警告)

1 . 父组件parent.vue代码如下:

<template><div class="parent"><h2>{{msg }}</h2><son :fa-msg="msg"></son> <!-- 子组件绑定faMsg变量,注意驼峰--></div></template><script>import son from './Son' //引入子组件export default {name: 'HelloWorld',data () {return {msg: '父组件',}},components:{son},}</script>

2 . 子组件son代码如下:

<template><div class="son"><p>{{sonMsg }}</p><p>子组件接收到内容:{{faMsg }}</p></div></template><script>export default {name: "son",data(){return {sonMsg:'子组件',}},props:['faMsg'],//接收psMsg值}</script>

子组件通过props来接受数据

第一种方法

props: ['childCom']

第二种方法

props: {childCom: String //这里指定了字符串类型,如果类型不一致会警告的哦}

第三种方法

props: {childCom: {type: String,default: 'sichaoyun' }}

二.子组件向父组件传值

通过绑定事件然后及$emit传值

vue2.0只允许单向数据传递,我们通过出发事件来改变组件的数据

1.父组件parent代码如下:

父组件通过绑定自定义事件,接受子组件传递过来的参数

<template><div class="parent"><h2>{{msg }}</h2><p>父组件接手到的内容:{{username }}</p><son psMsg="我是你爸爸" @transfer="getUser"></son> <!-- 监听子组件触发的transfer事件,然后调用getUser方法 --></div></template><script>import son from './Son'export default {name: 'HelloWorld',data () {return {msg: '父组件',username:'',}},components:{son},methods:{getUser(msg){this.username= msg}}}</script>

2.子组件son代码如下:

子组件通过$emit触发父组件上的自定义事件,发送参数

<template><div class="son"><p>{{sonMsg }}</p><p>子组件接收到内容:{{psMsg }}</p><!--<input type="text" v-model="user" @change="setUser">--><button @click="setUser">传值</button></div></template><script>export default {name: "son",data(){return {sonMsg:'子组件',user:'子传父的内容'}},props:['psMsg'],methods:{setUser:function(){this.$emit('transfer',this.user)//触发transfer方法,this.user 为向父组件传递的数据}}}</script>

3. 非父子传参 (事件总线)

假设你有两个Vue组件需要通信: A 和 B ,A组件按钮上面绑定了点击事件,发送一则消息,B组件接收。

1. 初始化,全局创建$bus

直接在项目中的 main.js 初始化 $bus :

// main.jswindow.$bus=new Vue();

注意,这种方式初始化一个全局的事件总线

2. 发送事件

$bus.$emit("aMsg", '来自A页面的消息');

<!-- A.vue --><template><button @click="sendMsg()">-</button></template><script> //import $bus from "../bus.js";export default {methods: {sendMsg() {$bus.$emit("aMsg", '来自A页面的消息');}}}; </script>

接下来,我们需要在 B页面 中接收这则消息。

4. 接收事件

$bus.$on("事件名",callback)

<!-- IncrementCount.vue --><template><p>{{msg}}</p></template><script> //import $bus from "../bus.js";export default {data(){return {msg: ''}},mounted() {$bus.$on("aMsg", (msg) => {// A发送来的消息this.msg = msg;});}};</script>

<<<<<<<<<<<<<<下方是拓展,面试不必说>>>>>>>>>>>

事件总线推荐下面写法:

集中式的事件中间件就是 Bus。我习惯将bus定义到全局:

app.js

var eventBus = {install(Vue,options) {Vue.prototype.$bus = vue}};Vue.use(eventBus);

然后在组件中,可以使用$emit, $on, $off分别来分发、监听、取消监听事件

分发事件的组件

// ...methods: {todo: function () {this.$bus.$emit('todoSth', params); //params是传递的参数//...}}

监听的组件

// ...created() {this.$bus.$on('todoSth', (params) => {//获取传递的参数并进行操作//todo something})},// 最好在组件销毁前// 清除事件监听beforeDestroy () {this.$bus.$off('todoSth');}

如果需要监听多个组件,只需要更改 bus 的 eventName:

// ...created() {this.$bus.$on('firstTodo', this.firstTodo);this.$bus.$on('secondTodo', this.secondTodo);},// 清除事件监听beforeDestroy () {this.$bus.$off('firstTodo', this.firstTodo);this.$bus.$off('secondTodo', this.secondTodo);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。