4. 子组件 通过 $parent
来获取父组件实例的属性和方法
<script> export default {
name:'test',
created(){
console.log( this.$parent.obj )
this.$parent.getQuery()
},
}
</script>
5. $attrs
和 $listeners
获取父组件实例属性和方法(组件嵌套情况下使用)
❝「
$attrs
」:包含了父作用域中不被认为 (且不预期为)props
的特性绑定 (class 和 style 除外),并且可以通过 v-bind=”$attrs
” 传入内部组件。当一个组件没有声明任何props
时,它包含所有父作用域的绑定 (class 和 style 除外)。「
$listeners
」:包含了父作用域中的 (不含 .native 修饰符) v-on 事件监听器。它可以通过 v-on=”$listeners
” 传入内部组件。它是一个对象,里面包含了作用在这个组件上的所有事件监听器,相当于子组件继承了父组件的事件。使用场景:多层嵌套组件的情况下使用,可以避免使用Vuex来做数据处理, 使用
❞v-bind="$attrs" v-on="$listeners"
很方便达到业务数据传递。
父组件
<template>
<div>
<Test3
:status="status"
:title="title"
@getData="getData" />
</div></template><script>import Test3 from "../components/Test3.vue";
export default {
name:'person',
data(){
return {
title:'personal 组件',
status: false
}
},
methods:{
getData(){
console.log(this.title)
}
},
components:{
Test3
}
}
</script>
子组件1
<template>
<div>
<h1>Test3 组件</h1> <br /><br />
// 通过 $attrs(属性,除了【props中定义的属性】) 和 $listeners(方法) 来给嵌套子组件传递父组件的属性和方法
<Test4 v-bind="$attrs" v-on="$listeners"/>
</div></template><script>// 引入子子组件
import Test4 from "../components/Test4";
export default {
name: "test3",
props: ["title"],
components: {
Test4,
},
created() {
console.log(this.$attrs); //{status: false}
console.log("-----------");
console.log(this.$listeners); // {getData: ƒ}
},
};
</script>
嵌套子组件
<template>
<div>
<h1>Test4 组件</h1>
</div></template><script> export default {
name:'test4',
created(){
console.log('-----Test4------')
console.log(this.$attrs) //{status: false}
console.log(this.$listeners) // {getData: ƒ}
}
}
</script>
6. 跨组件之间传值
❝通过新建一个
js
文件,导入vue
, 导出vue
实例;然后通过 给导出的实例 上绑定事件$emit
事件 , 然后再通过$on
监听触发的事件,这样就可以达到全局组件数据共享。使用场景:
它可以满足任意场景传递数据,
父子组件传值
,子父传值
,兄弟组件之间传值
,跨级组件之间传值
.通信数据比较简单时,可以采用这种 方案,项目比较庞大,可以采用
❞Vuex
.
vue .js
/*
* @Description:
* @Author: ZhangXin
* @Date: 2021-01-22 15:48:56
* @LastEditTime: 2021-01-22 15:51:24
* @LastEditors: ZhangXin
*/
import Vue from 'vue'
export default new Vue()
组件A
<!--
* @Description:
* @Author: ZhangXin
* @Date: 2021-01-22 14:44:17
* @LastEditTime: 2021-01-22 16:25:33
* @LastEditors: ZhangXin
--><template>
<div>
<button @click="changeValue">改变</button>
</div></template><script>import zxVue from '../util/newVue.js';
export default {
name:'person',
data(){
return {
title:'personal 组件',
status: false
}
},
methods:{
changeValue(){
// 通过给 vue实例绑定事件
zxVue.$emit("getTitle", this.title)
}
}
}
</script>
组件C
<!--
* @Description:
* @Author: ZhangXin
* @Date: 2021-01-22 15:07:30
* @LastEditTime: 2021-01-22 16:26:38
* @LastEditors: ZhangXin
--><template>
<div>
<h1>Test4 组件</h1>
<h1>{{ title }}</h1>
</div></template><script>import zxVue from "../util/newVue";
export default {
name: "test4",
data() {
return {
title: "test4",
};
},
mounted(){
// 通过 vue 实例.$on 监听事件名,来接收跨级组件传递过来的值
zxVue.$on("getTitle", (item) => {
this.title = item;
console.log(item)
});
}
};
</script>
7. Vuex
❝这里就不介绍了,完了单独写一篇文章精讲
❞Vuex
8. provide
和 inject
实现父组件向子孙孙组件传值。(层级不限)
❝
provide
和inject
这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
provide
:
- 是一个对象或返回一个对象的函数
- 该对象包含可注入其子孙的属性。
inject
:
- 是一个字符串数组 或者是一个对象
- 用来在子组件或者子孙组件中注入
provide
提供的父组件属性。使用场景:
❞
provide/inject可以轻松实现跨级访问父组件的数据
# provide//对象provide:{ name:'测试'}//返回对象的函数provide(){ return { name: '测试' }}#injectinject:['name']
父组件
<!--
* @Description:
* @Author: ZhangXin
* @Date: 2021-01-22 23:24:16
* @LastEditTime: 2021-01-22 23:49:50
* @LastEditors: ZhangXin
--><template>
<div>
<h1>我是父组件</h1>
<Son />
</div></template><script>import Son from '../components/son/SonOne'
export default {
name:'father',
provide(){
return {
titleFather: '父组件的值'
}
},
components:{
Son
},
data(){
return{
title:'我是父组件 '
}
},
}
</script>
子组件
<template>
<div>
<h1>我是子孙组件</h1>
</div></template><script>import SonTwo from '../son/SonTwo'
export default {
name:'sonone',
components:{
SonTwo
},
inject:['titleFather'],
created(){
console.log(`${this.titleFather}-----------SonTwo`)
},
data(){
return{
title:'我是子组件 '
}
},
}
</script>
子孙组件
<template>
<div>
<h1>我是子孙组件</h1>
</div></template><script>import SonTwo from '../son/SonTwo'
export default {
name:'sonone',
components:{
SonTwo
},
inject:['titleFather'],
created(){
console.log(`${this.titleFather}-----------SonTwo`)
},
data(){
return{
title:'我是子组件 '
}
},
}
</script>
0 评论