🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 组件访问(了解) 组件访问指的是嵌套组件之间,会形成父子组件。子组件可以用 `this.$parent` 访问父组件,父组件可以用 `$children` 访问子组件。 >[warning] 减少使用 `$parent` 和 `$children`它们的主要目的是作为访问组件的应急方法。 > 推荐用 props 和 events 实现父子组件通信 ## 父组件访问子组件两种方式 `$children`和`$refs` 这两种方式推荐用后者。 ``` var vm = new Vue({ el: "#app", data: { txt: '456' }, mounted() { console.log(this.$refs.ym.$options.propsData.msg) } }) ``` >[danger] ### $children的缺陷: > 通过$children访问子组件时,是一个数组类型,访问其中的子组件必须通过索引值。 > 但是当子组件过多,我们需要拿到其中一个时,往往不能确定它的索引值,甚至还可能会发生变化。 > 有时候,我们想明确获取其中一个特定的组件,这个时候就可以使用$refs >[success] ### $refs的使用: > $refs和ref指令通常是一起使用的。 > 首先,我们通过ref给某一个子组件绑定一个特定的sign(标识)。 > 其次,通过this.$refs.sign就可以访问到该组件了。 ## 子组件访问父组件 `$parent` ``` Vue.component('ym-alert', { props: ['msg'], template: ` <div class="alert alert-danger">{{msg}} <ym-abc></ym-abc></div>`, mounted() { console.log(this.$parent.txt = 789) } }); ``` >[danger] 尽管在Vue开发中,我们允许通过$parent来访问父组件,但是在真实开发中尽量不要这样做。 > 子组件应该尽量避免直接访问父组件的数据,因为这样耦合度太高了。 > 如果我们将子组件放在另外一个组件之内,很可能该父组件没有对应的属性,往往会引起问题。 > 另外,更不好做的是通过$parent直接修改父组件的状态,那么父组件中的状态将变得飘忽不定,很不利于我的调试和维护。 ## 访问根组件 `$root` ``` Vue.component('ym-abc', { template: `<div>2252522</div>`, mounted() { console.log(this.$root) this.$root.txt = 7816196 } }) ``` >[danger] $root的问题与$parent很类似。不再赘述,不建议使用 ## 代码 ``` <div class="container" id="app"> {{txt}} <ym-alert ref="ym" msg="123"></ym-alert> </div> <script src="js/vue.js"></script> <script> Vue.component('ym-abc', { template: `<div>2252522</div>`, mounted() { console.log(this.$root) this.$root.txt = 7816196 } }) Vue.component('ym-alert', { props: ['msg'], template: ` <div class="alert alert-danger">{{msg}} <ym-abc></ym-abc></div>`, mounted() { //console.log(this.$parent.txt = 789) } }); var vm = new Vue({ el: "#app", data: { txt: '456' }, mounted() { console.log(this.$refs.ym.$options.props.msg) } }) </script> ```