//在父组件里面通过slot-scope='p',{{p.属性}}来获取属性值,slot属性来获取子组件插槽,以name作为区分
<template>
<B :color="dataColor">
<div slot="app" slot-scope="p">slot--{{p.slotName}}</div>
</B>
</template>
//子组件里面通过slot插槽,里面标明属性name来区分不同slot,通过v-bind:属性,
//在父组件里面通过slot-scope='p',{{p.属性}}来获取属性值
<template>
<div>
{{color}}--{{$attrs.color}}
<slot name="app" :slotName="slotName"></slot>
<button @click="changeSlot">改变slot</button>
</div>
</template>
var Event=new Vue();
Event.$emit(事件名,数据);
Event.$on(事件名,data => {});
<template>
<div>
<button @click="send">发送a</button>
<B></B>
<C></C>
</div>
</template>
<script>
import B from './B.vue'
import C from './C.vue'
import util from '../util/util'
export default {
data(){
return{
name:'aaa'
}
},
methods:{
send(){
util.Event.$emit('data-a',this.name);
}
},
components:{
B:B,
C:C
}
}
</script>
<style scoped>
</style>
aaa
<template>
<div>
{{name}}--{{age}}
</div>
</template>
<script>
import util from '../util/util'
export default {
data(){
return{
name:'ccc',
age:''
}
},
mounted(){
util.Event.$on('data-a',name=>{
this.name=name;
})
util.Event.$on('data-b',age=>{
this.age=age;
})
}
}
</script>
<style scoped>
</style>
import Vue from 'vue'
var obj={
Event:new Vue()
}
export default obj;
<template>
<div>
<button @click="send">发送a</button>
<B :foo="foo" :boo="boo" :coo="coo" :doo="doo" title="前端工匠" @click="send"></B>
</div>
</template>
<script>
import B from './B.vue'
import util from '../util/util'
export default {
data(){
return{
name:'aaa',
foo: "Javascript",
boo: "Html",
coo: "CSS",
doo: "Vue"
}
},
methods:{
send(){
util.Event.$emit('data-a',this.name);
}
},
components:{
B:B,
}
}
</script>
<style scoped>
</style>
<template>
<div>
<C></C>
</div>
</template>
<script>
import util from '../util/util'
import C from './C.vue'
export default {
data(){
return{
age:20
}
},
props:{
foo:String
},
created(){
console.log(this.$attrs); //{boo: "Html", coo: "CSS", doo: "Vue", title: "前端工匠"}
},
methods:{
send(){
util.Event.$emit('data-b',this.age);
}
},
components:{
C:C
}
}
</script>
<style scoped>
</style>
允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效
<template>
<div>
<B ></B>
</div>
</template>
<script>
import B from './B.vue'
export default {
provide:{
name:"我是父组件"
},
data(){
return{
}
},
components:{
B:B,
}
}
</script>
<style scoped>
</style>
<template>
<div></div>
</template>
<script>
export default {
inject:['name'],
mounted(){
console.log(this.name);//我是父组件
}
}
</script>
<style scoped>
</style>
在 A.vue 里,我们设置了一个 provide: name,值为 浪里行舟,它的作用就是将 name 这个变量提供给它的所有子组件。而在 B.vue 中,通过 inject 注入了从 A 组件中提供的 name 变量,那么在组件 B 中,就可以直接通过 this.name 访问这个变量了,它的值也是 我是父组件。这就是 provide / inject API 最核心的用法。
需要注意的是:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的----vue官方文档
所以,上面 A.vue 的 name 如果改变了,B.vue 的 this.name 是不会改变的,仍然是 我是父组件