父子组件的访问方式
- 有时候我们需要父组件直接访问子组件,子组件直接访问父组件,或者是子组件访问根组件
-
- 父组件访问子组件:使用$children或者$refs
- 子组件访问父组件:使用$parent
- 子组件访问根组件:使用$root
父组件访问子组件[$children]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../../../js/vue.js"></script> </head> <body> <div > <cpn></cpn> <button @click="btnClick">访问子组件</button> </div> </body> <template > <div>this is zi;</div> </template> <script> // 创建vue const vue = new Vue({ el: '#app', data: {}, methods: { btnClick(){ // 通过$children访问子组件 // 默认获取全部子组件 一般开发中不用,应为如果访问需要通过下标去访问,但是在开发中需求是变化的 let children = this.$children; console.log(children); // 调用子组件的方法 children[0].showMessage(); // 打印子组件的属性 console.log(children[0].name); } }, components: { cpn: { template: '#cpn', data() { return { name: '彼岸舞' } }, methods: { showMessage() { console.log('message is click;') } } } } }) </script> </html>
运行效果
父组件访问子组件[$refs]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../../../js/vue.js"></script> </head> <body> <div > <!-- 添加ref属性--> <cpn ref="clickCpn"></cpn> <cpn></cpn> <button @click="btnClick">访问子组件</button> </div> </body> <template > <div>this is zi;</div> </template> <script> // 创建vue const vue = new Vue({ el: '#app', data: {}, methods: { btnClick(){ // 通过$refs访问子组件 // 需要在子组件上添加 ref属性 以便于确认是 要访问那个组件 返回的是通过ref属性值找到的组件对象,而不是数组 let refs = this.$refs['clickCpn']; console.log(refs); // 调用子组件的方法 refs.showMessage(); // 打印子组件的属性 console.log(refs.name); } }, components: { cpn: { template: '#cpn', data() { return { name: '彼岸舞' } }, methods: { showMessage() { console.log('message is click;') } } } } }) </script> </html>
运行效果
子组件访问父组件[$parent]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../../../js/vue.js"></script> </head> <body> <div > <cpn></cpn> </div> </body> <template > <div> <div>this is cpn;</div> <cpn-son></cpn-son> </div> </template> <template > <div> <div>this is cpnSon;</div> <button @click="btnClick">访问父组件</button> </div> </template> <script> // 创建vue const vue = new Vue({ el: '#app', data: {}, components: { cpn: { template: '#cpn', data() { return { name: '彼岸舞' } }, methods: { showMessage() { console.log('message is click;') } }, components:{ cpnSon:{ template: '#cpnSon', methods: { btnClick(){ // 子组件访问父组件,通过$parent访问,一般不建议使用因为会增加父子之间的耦合度,不利于组件复用 // 获取父组件对象 let parent = this.$parent; console.log(parent); // 调用父组件方法 parent.showMessage(); // 访问父组件属性 console.log(parent.name); } } } } } } }) </script> </html>
运行效果
子组件访问根组件[$root]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../../../js/vue.js"></script> </head> <body> <div > <cpn></cpn> </div> </body> <template > <div> <div>this is cpn;</div> <cpn-son></cpn-son> </div> </template> <template > <div> <div>this is cpnSon;</div> <button @click="btnClick">访问根组件</button> </div> </template> <script> // 创建vue const vue = new Vue({ el: '#app', data: { name:'flower' }, methods:{ showRoot(){ console.log('my root!'); } }, components: { cpn: { template: '#cpn', data() { return { name: '彼岸舞' } }, methods: { showMessage() { console.log('message is click;') } }, components:{ cpnSon:{ template: '#cpnSon', methods: { btnClick(){ // 子组件访问根组件,通过$root访问 // 获取根组件对象 let root = this.$root; console.log(root); // 调用根组件方法 root.showRoot(); // 访问根组件属性 console.log(root.name); } } } } } } }) </script> </html>
运行效果