vue组件通信

Posted 嘿起屁儿整

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue组件通信相关的知识,希望对你有一定的参考价值。

props跟$emit(只能用于父子组件)

  1. props:父组件向子组件传递信息
父组件中:引用子组件。然后在其引用的子组件中绑定传递信息
<template>
  <div>
    <Son :myprop="mypropdata"></Son>
  </div>
</template>
<script>
import Son from '@/components/Son.vue';
export default {
  data(){
    return {
      mypropdata:"父级里的数据"
    }
  },
  components: {
    Son
  }
};
</script>
子组件中:用props:["绑定信息"] 直接获取
<template>
  <div>
   子组件数据:{{myprop}}
  </div>
</template>
<script>
export default {
 	props: ["myprop"],
};
</script>

最终浏览器显示内容: 子组件数据:父级里的数据
  1. $emit:子组件触发父组件的自定义事件,来向父组件传递信息
子组件中:触发父级自定义事件,并传入数据
<template>
  <div>
    <button @click="toparent">点击改变父组件</button>
  </div>
</template>
<script>
export default {
  methods: {
    toparent() {
      this.$emit("changeparent","子组件的数据") //“子组件的数据“作为值传递到父组件的自定义方法中
    },
  },
};
父组件中:通过定义的自定义事件,获取子组件传递的数据
<template>
  <div>
    <Son @changeparent="daddatashow"></Son>
    获取的子组件数据:{{getdata}}
  </div>
</template>
<script>
import Son from '@/components/Son.vue';
export default {
  data(){
    return {
      getdata:""
    }
  },
  components: {
    Son
  },
  methods:{
  	 daddatashow(data) {
      this.getdata = data;
    }
  }
};
</script>

最终浏览器显示: 获取的子组件数据:子组件的数据
  1. 注意:props接收父组件参数,父组件的值发生变化,在created或mounted阶段都是初始值。只有利用watch监听数据变化(如果发现没打印,那么肯定是watch写重了,检查一下)
watch:{
 good_id: {
   handler(newval) {
     if (newval) {
       console.log("newgood_id---", newval)
     }
   },
   immediate: true
 }
}

provide 跟 inject(祖先等有层级组件)

provide/inject 绑定默认并不是响应式的,但是如果provide传入可监听的对象也可以是响应式的。
可以理解为react的context上下文,目的就是provide向后续组件传值,inject接受数据

这种写死的,他就不是响应式的。只能接受一个固定的值

// 父级组件提供 'foo'
var Provider = {
  provide: {
    foo: 'bar'
  },
}

// 子组件注入 'foo'
var Child = {
  inject: ['foo'],
  created () {
    console.log(this.foo) // => "bar"
  }
}
以下就是响应式的。可用于接口数据获取后的子组件处理

祖先组件
 data(){
 	return {
		natureObj:{nature:""}
	}
 },
 provide() {
    return {
      //provide实现响应式。这里必须是响应式对象
      natureSon: this.natureObj,
    }
  },
 methods:{
 	//如果调用此自定义方法,那么子组件会响应式的改变(场景:请求接口后返回的)
 	getinfo(){
 		this.natureObj.nature= "111111"
 	}
 }
子组件

inject: ["natureSon"],
created(){
	console.log(this.natureSon)  //111111
}

$emit 跟 $on(非父子任意组件)

  1. 先在main.js中把eventBus设置为全局变量(这样各个层级就没有限制了)
Vue.prototype.$bus = new Vue();   //这个$bus随意命名,反正意思是添加到vue原型中。因为$emit跟$on的this指向需要是同一个vue实例
  1. $emit:通过触发事件,发送数据
<template>
  <div>
   <button @click="toothers">点击向其他组件传递信息</button>
  </div>
</template>
<script>
export default {
	methods:{
		toothers(){
		    //这个事件名随意定义,只要统一就行。 “发送的数据”作为值传递到接收方法中
			this.$bus.$emit("sendandget","发送的数据") 
		}
	}
}
</script>
  1. $on:通过接收事件,接收数据
<template>
  <div>
    接收到的数据:{{getdata}}
  </div>
</template>
<script>
export default {
	data() {
    	return {
     	getdata:""
    };  
   created() {
    this.$bus.$on("sendandget",res=>{
      this.getdata = res;
    })
  },
}
</script>

最终浏览器显示: 接收到的数据:发送的数据

ref 和 $refs

  1. 标签通过ref来命名
  2. 使用通过this.$refs.命名 获取ref对应标签及内部内容
<template>
  <div>
    <div ref="mydiv">我是div</div>
    <Son ref="sonCom"></Son>
    <button @click="getSon">点击获取children</button>
  </div>
</template>
<script>
import Son from "@/components/Son.vue";
export default {
	methods: {
     getSon(){
           console.log(this.$refs.mydiv);        //打印:<div ref="mydiv">我是div</div>
           console.log(this.$refs.sonCom);       //打印:Son这个组件的全部
           console.log(this.$refs.sonCom.myname); //打印:子组件我的名字 。
       }
    }
}
</script>


子组件Son.vue
<template>
  <div>我是子组件 </div>
</template>
<script>
export default {
   data () {
     return {
         myname:"子组件我的名字"
     }
   },
}
</script>

其他方式

  1. 个人水平有限,感觉上面几个就可以了。复杂的用vuex处理
  2. $children 和 $parent
  3. $attrs 和 $listeners

以上是关于vue组件通信的主要内容,如果未能解决你的问题,请参考以下文章

Android 调用组件 w/listener 或让 viewmodel 调用组件与片段通信

vue_cli组件通信个人总结--完整代码

vscode代码片段生成vue模板

Vue 组件通信方案

Vue兄弟组件通信

vue组件通信