二十一、父子组件的通信(父子组件的访问方式)
有时候需要父组件直接访问子组件,子组件直接访问父组件,或者是子组件访问根组件
- 父组件访问子组件:使用 $children 或 $refs (renference--引用)
- 子组件访问父组件:使用 $parent
一、父访问子
1. this.$children 是一个数组类型,它包含所有子组件对象
我们这里通过一个遍历,取出所有子组件的message状态
<div id="app">
<my_cpn></my_cpn>
<my_cpn></my_cpn>
<my_cpn></my_cpn>
<button @click="btnClick">按钮</button>
</div>
<template id="cpnC">
<div>我是子组件</div>
</template>
<script>
const app = new Vue({
el: "#app",
data: {
message: "Hellow World"
},
methods: {
btnClick(){
// 1. $children => 数组类型
console.log(this.$children);
for(let c of this.$children){
console.log(c.name);
}
// 一般不适用下标值拿数据
this.$children[0].showMessage();
}
},
components: {
my_cpn: {
template: "#cpnC",
data(){
return{
name: "我是子组件的name"
}
},
methods: {
showMessage(){
console.log("showMessage")
}
}
}
}
});
</script>
2. this.$refs 是一个对象类型,它默认是一个空对象 包含所有子组件对象,需要在模板引用标签上加上 ref="key" 使用
<div id="app">
<my_cpn></my_cpn>
<my_cpn></my_cpn>
<my_cpn ref="aaa"></my_cpn>
<button @click="btnClick">按钮</button>
</div>
<template id="cpnC">
<div>我是子组件</div>
</template>
<script>
const app = new Vue({
el: "#app",
data: {
message: "Hellow World"
},
methods: {
btnClick(){
// 1. $children => 数组类型
// console.log(this.$children);
// for(let c of this.$children){
// console.log(c.name);
// }
// 一般不适用下标值拿数据
//this.$children[0].showMessage();
//2. $refs =>对象类型,默认是一个空对象
// 需要在模板引用标签上加上 ref="key" 使用
console.log(this.$refs.aaa.name)
}
},
components: {
my_cpn: {
template: "#cpnC",
data(){
return{
name: "我是子组件的name"
}
},
methods: {
showMessage(){
console.log("showMessage")
}
}
}
}
});
</script>
二、子访问父
1. this.$parent 访问父类组件
2. this.$root 访问根组件
<div id="app">
<my_cpn></my_cpn>
</div>
<template id="cpnC">
<div>
<p>我是子组件</p>
<button @click="btnClick">按钮</button>
<d_cpn></d_cpn>
</div>
</template>
<template id="cpnD">
<div>
<p>我是子组件的子组件</p>
<button @click="btnClick">按钮</button>
</div>
</template>
<script>
const app = new Vue({
el: "#app",
data: {
message: "Hellow World"
},
components: {
my_cpn: {
template: "#cpnC",
data(){
return{
name: "我是二级的组件"
}
},
methods: {
btnClick(){
// 1.访问父组件$parent
console.log(this.$parent)
}
},
components: {
d_cpn: {
template: "#cpnD",
methods: {
btnClick(){
//访问父组件
console.log(this.$parent);
console.log(this.$parent.name);
//访问根组件
console.log(this.$root);
console.log(this.$root.message);
}
}
}
}
}
}
});
</script>

浙公网安备 33010602011771号