vue组件间通信方式
Posted web-gmy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue组件间通信方式相关的知识,希望对你有一定的参考价值。
- props
-
Home.vue <template> <div class="home"> <!-- 父子组件 --> <Son v-model="lala" /> <!-- 同步改变值 --> <Son :lala.sync='lala' /> </div> </template> <script> import Son from "./Son"; export default name: "home", components: Son , data() return lala: 100 ; , created() // 异步请求 不需要被监控的数据 初始化数据 , mounted() // dom挂载完成 this.$el 替换el , // beforeUpdate、updated两个合起来相当于watch beforeUpdate() , updated() ; </script> Son.vue <template> <div>这是儿子组件 <!-- value --> lala <button @click="change">点击改变</button> </div> </template> <script> export default props: // value: // type: Number // // 同步改变值 lala: type: Number , methods: // change() // this.$emit("input", 200); // // 同步改变值 change() this.$emit("update:lala", 200); ; </script>
- $emit 和 $on
- eventbus
-
main.js // 创建一个vue实例 Vue.prototype.$bus = new Vue(); Home.vue <script> export default mounted() // dom更新完成 this.$nextTick(() => this.$bus.$on("bus", data => console.log(data); ); ); , ; </script> Son.vue <template> <div> 这是儿子组件 </div> </template> <script> export default mounted() console.log(1); this.$bus.$emit("bus", 1000); ; </script> About.vue <template> <div class="about"> <h1>This is an about page</h1> </div> </template> <script> export default mounted() // dom更新完成 this.$nextTick(() => this.$bus.$on("bus", data => console.log(data); ); ); ; </script>
- vuex
- refs
- provide 和 inject
-
Home.vue <script> export default name: "home", // 提供 provide() return msg: "provide" ; ; </script> Son.vue <template> <div>这是儿子组件 msg </div> </template> <script> export default // 注入 inject: ["msg"] ; </script>
- $attrs 和 $listeners
-
Home.vue <template> <div class="home"> <Son :a="[1,2,3,4]" /> </div> </template> Son.vue <template> <div> <!-- attrs如果再往下级组件传值 需要使用v-bind --> <GrandSon v-bind="$attrs"></GrandSon> <div v-for="x in $attrs.a" :key="x"> x </div> </div> </template> <script> import GrandSon from "./GrandSon"; export default inheritAttrs: false, // 不显示继承的attrs(在控制台Elements可以查看) components: GrandSon ; </script> GrandSon.vue <template> <div>这是孙子组件 $attrs.a </div> </template>
Home.vue <template> <div class="home"> <Son1 :a="[1,2,3,4]" @c='fn' /> </div> </template> <script> import Son1 from "./Son1"; export default name: "home", components: Son1 , methods: fn() alert("我是fn"); ; </script> Son1.vue <template> <div> 这是son1组件 <button @click="$listeners.c">子组件调用父组件的fn</button> <!-- attrs 如果再往下级组件传值 需要使用v-bind --> <!-- listeners 如果再往下级组件传递方法 需要使用v-on --> <GrandSon v-on="$listeners"></GrandSon> </div> </template> <script> import GrandSon from "./GrandSon"; export default components: GrandSon ; </script> GrandSon.vue <template> <div> 这是孙子组件 <button @click="$listeners.c">孙子组件调用fn</button> </div> </template>
- $parent 和 $children
-
Home.vue <template> <div class="home"> <Son1 @input="changeV" :value='value' /> </div> </template> <script> import Son1 from "./Son1"; export default name: "home", components: Son1 , data() return value: 300000 ; , methods: changeV(val) this.value = val; , ; </script> Son1.vue <template> <div> value 这是son1组件 <button @click="changeT">子调用父的input事件</button> </div> </template> <script> export default // props: ["value"], props: value: type: Number , methods: changeT() // this.$parent.value = 50000; this.$emit("input", 50000); ; </script> GrandSon.vue <template> <div> 这是孙子组件 <button @click="fn1">孙子调用爷爷的input事件</button> </div> </template> <script> export default methods: fn1() this.$parent.$emit("input", 700); ; </script>
- slot
以上是关于vue组件间通信方式的主要内容,如果未能解决你的问题,请参考以下文章