📦 组件(三)之 组件传值方式
列举 vue2 中 组件之间 的
传值方式:
props、$emit、bus$attrs、$listeners、$propsslot$refs路由传值$parent、$children、$rootprovide、injectEventBuslocalStorage、sessionStorage、cookie、IndexedDBvuex、observable
1. props、$emit、bus
props、$emit相信大家应该都熟悉,这里就bus展开说一下
javascript
🌟🌟🌟 建立 1 个 js 文件(bus.js),内容如下:
import Vue from 'vue';
export default new Vue();javascript
🌟🌟🌟 这是 A 组件
<template>
<div id="A">
<p>{{ num }}</p>
<button @click="send">发送传递数据</button>
</div>
</template>
<script>
/* 引入 bus.js 文件 */
import bus from '@/utils/bus.js';
export default {
name: 'A',
data(){
return{
num: 0
}
},
methods: {
send(){
this.num++;
// 创建自定义事件,将数据传递到了 bus.js 文件
bus.$emit("getNum", this.num);
}
}
}
</script>javascript
🌟🌟🌟 这是 B 组件
<template>
<div id="B">
<p>{{ number }}</p>
</div>
</template>
<script>
import bus from '@/utils/bus.js';
export default {
data(){
return{
number: 0
}
},
created() {
// bus 触发事件的方法
bus.$on('getNum', val => {
this.number = val;
})
}
}
</script>2. $attrs、$listeners、$props
3. slot
4. $refs
$refs这里说 1 个注意点:必要时在$nextTick里使用$refs
5. 路由传值
首先得了解,路由跳转分为
声明式导航和编程式导航,这里不过多详解,可参考该 网址
6. $parent、$children、$root
$parent:获取到一个父节点的 VueComponent 对象,包含父节点中所有数据和方法等
$children:获取到一个包含所有子组件(不包含孙子组件)的 VueComponent 对象数组,可以直接拿到子组件中所有数据和方法等
$root:任何子组件都可以访问根组件实例上的data、methods、computed等属性和方法,以及全局注册的组件或插件
7. provide、inject
provide:可以让我们给后代组件指定想要提供的数据或方法
inject:在任何后代组件中接收想要添加在这个组件上的数据或方法
⚠️
注意事项: provide 和 inject 传递的数据不是响应式的,除非传入的就是一个可监听的对象(谨慎使用)
javascript
<!-- 父组件 --!>
<template>
<div class="parent">
<child></child>
</div>
</template>
<script>
export default {
data() {
return {
parentData: "我的名字是你父亲"
};
},
provide() {
return {
name: this.val, // data 的数据
someMethod: this.someMethod // methods 中的方法
};
},
methods: {
someMethod() {
console.log("这是注入的方法");
}
}
};
<!-- 子组件 --!>
<template>
<div class="child">
<SunChild></SunChild>
</div>
</template>
<script>
export default {
inject: ["name", "someMethod"],
mounted() {
console.log(this.name); // 我的名字是你父亲
this.someMethod(); // 会打印出 '这是注入的方法' 这句话
}
};
</script>
<!-- 孙组件 --!>
<template>
<div class="SunChild">
{{ name }} // 我的名字是你父亲
</div>
</template>
<script>
export default {
inject: ["name", "someMethod"],
mounted() {
console.log(this.name); // 我的名字是你父亲
this.someMethod(); // 会打印出 '这是注入的方法' 这句话
}
};
</script>8. EventBus
释义:EventBus 是 中央事件总线,不管是 父子组件,兄弟组件,跨层级组件 等都可以完成 通信
javascript
// 找到main.js 加入以下代码 公共的$bus
Vue.prototype.$bus = new Vue();
<!-- A 组件 --!>
<template>
<div class="A">
我是A组件
</div>
</template>
<script>
export default {
mounted() {
this.$bus.$on("fn", (value) => {
console.log(value);
});
}
};
</script>
<!-- B 组件 --!>
<template>
<div>
<input type="text" @blur="fn" />
</div>
</template>
<script>
export default {
methods: {
fn() {
this.$bus.$emit("fn", "可以父子通信,也可以兄弟通信");
}
}
};
</script>9. localStorage、sessionStorage、cookie、IndexedDB
释义:这些存储的简单使用一般大家都熟悉,这里不做详尽解释,后续会专门开展一篇文章去介绍他们
10. vuex、observable
示例:这里将以在
vuex 中请求下拉列表数据为例,给大家讲解如何使用 vuex

