说了 父组件直接访问子组件,现在讲 子组件访问父组件:
有这么个代码:
<body>
<template id="cpn">
<div style="border: solid red 2px ">
<h2>这里是 cpn</h2>
<v-ccpn></v-ccpn>
</div>
</template>
<template id="ccpn">
<div style="border: solid blue 1px ">
<h2>这里是 ccpn</h2>
</div>
</template>
<div id="app">
<v-cpn></v-cpn>
</div>
<script src="js/vue.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
app_s1:"却看见更黑暗的家伙(app_s1)"
},
methods:{
},
components:{
'v-cpn':{
template:"#cpn",
data(){
return{cpn_s1:"负重一万斤长大(cpn_s1)"}
},
components:{
'v-ccpn':{
template: "#ccpn",
data() {
return{ccpn_s1:"我想在那里最蓝的大海杨帆(ccpn_s1)"}
}
}
}
}
}
})
</script>
界面:
解析: VUE 实例 app 是跟组件 =》 cpn子组件 =》 ccpn 组件
换句话: 爷组件=》 父组件 =》 子组件
那么 如果子组件要访问 父组件的数据 我们也不用事件传递,直接用:$parent
使用例子:
<body>
<template id="cpn">
<div style="border: solid red 2px ">
<h2>这里是 cpn</h2>
<v-ccpn></v-ccpn>
</div>
</template>
<template id="ccpn">
<div style="border: solid blue 1px ">
<h2>这里是 ccpn</h2>
<button @click="parent_data_s1">点击直接显示父组件cpn的data中的 s1</button>
</div>
</template>
<div id="app">
<v-cpn></v-cpn>
</div>
<script src="js/vue.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
app_s1:"却看见更黑暗的家伙(app_s1)"
},
components:{
'v-cpn':{
template:"#cpn",
data(){
return{cpn_s1:"负重一万斤长大(cpn_s1)"}
},
components:{
'v-ccpn':{
template: "#ccpn",
data() {
return{ccpn_s1:"我想在那里最蓝的大海杨帆(ccpn_s1)"}
},
methods:{
parent_data_s1(){ //主要看这个函数 贼方便哈!
alert(this.$parent.cpn_s1);
}
}
}
}
}
}
})
</script>
别怕 你看图就看懂了他的嵌套 然后慢慢思维跟进然后分析即可。
可以看到很方便 直接即可访问自己的父组件。
但是还是有弊端的 :
尽管在Vue开发中,我们允许通过$parent 来访问父组件,但是在真实开发中尽量不要 这样做。子组件应该尽量避免直接访问父组件的数据, 因为这样耦合度太高了。因为我们说 组件都独立的。
因为:我们将子组件放在另外一个组件之内, 很可能该父组件没有对应的属性,往往会引 起问题。
注意:
1. $parent 没有下标形式,因为总不可能你有几个爸爸吧 ,为什么$children可以? 因为 你可以有多个孩子。
2.可以看到这里的button 直接访问 ccpn 的方法,是怎么做到的,因为button定义在 ccpn中,这些是细节,也是基础吧.
还有一个讲完即可:
this.$root 他是直接访问根组件 比如上面写的 那么他就直接访问 vue实例了。
使用例:
<body>
<template id="cpn">
<div style="border: solid red 2px ">
<h2>这里是 cpn</h2>
<v-ccpn></v-ccpn>
</div>
</template>
<template id="ccpn">
<div style="border: solid blue 1px ">
<h2>这里是 ccpn</h2>
<button @click="root_data_s1">点击直接显示根组件vue实例的data中的 s1</button>
</div>
</template>
<div id="app">
<v-cpn></v-cpn>
</div>
<script src="js/vue.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
app_s1:"却看见更黑暗的家伙(app_s1)"
},
components:{
'v-cpn':{
template:"#cpn",
data(){
return{cpn_s1:"负重一万斤长大(cpn_s1)"}
},
components:{
'v-ccpn':{
template: "#ccpn",
data() {
return{ccpn_s1:"我想在那里最蓝的大海杨帆(ccpn_s1)"}
},
methods:{
root_data_s1(){ //主要看这个函数 贼方便哈!
alert(this.$root.app_s1);
}
}
}
}
}
}
})
</script>
$root 在哪里可以被访问,因为他是根组件 啊哈哈。