vuejs之父子组件访问【$refs】【$children】

在Vue中,我们不用依赖原生JS或jQuery等第三方库获取DOM节点,据官方所示,元素绑定ref后,父组件可以直接通过调用this.$refs即可得到整个目标对象,提高了获取DOM节点的效率。

父组件访问子组件

$refs 

$refs(reference 缩略):一个持有注册过ref attribute 的所有 DOM 元素和组件实例。本质是一个对象。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向该子组件实例。通俗讲,refs特性就是为元素或子组件赋予一个class/id引用,通过this.$refs.refName来访问元素或子组件的实例。

 代码示例:

<!-- 父组件 -->
  <div id="app">

    <cpn></cpn>
    <cpn></cpn>
    <cpn ref="aaa"></cpn>
    <button @click="btnClick" >按钮</button>

  </div>

  <!-- 子组件 -->
  <template id="cpn">

    <div>
      我是子组件
    </div>
  </template>

 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

  <script>
    // 父传子:props
    const cpn = {
      template: "#cpn",
      data() {
        return {
          name:"我是子组件的name"
        }
      },
      methods: {

      },
    };
    const app = new Vue({
      el: "#app",
      data() {
  
      },
      methods: {
        btnClick(){

           // 使用 $ref
           console.log(this.$refs);
           console.log(this.$refs.aaa.name)

        }
      },
      components: {
        cpn
      },
    })
  </script>

输出结果:

 this.$refs是一个对象类型,默认是个空对象({}),叫做VueComponent,并伴有标识符aaa。展开后可操作其挂载的数据和调用上面的方法。

另外当ref和v-for一起使用时,获得的引用将会是一个数组,包含循环数组源:

<template>
  <div>
    <div ref="myDiv" v-for="(item, index) in arr" :key="index">{{item}}</div>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      arr: ['one', 'two', 'three', 'four']
    }
  },
  mounted() {
    console.log(this.$refs.myDiv)
  }
}
</script>

输出结果:

  

注: $refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs

$children

代码示例: 

 <!-- 父组件 -->
  <div id="app">

    <cpn></cpn>
    <cpn></cpn>
    <cpn></cpn>
    <button @click="btnClick" >按钮</button>

  </div>

  <!-- 子组件 -->
  <template id="cpn">
    <div>
      我是子组件
    </div>
  </template>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

  <script>
    // 父传子:props
    const cpn = {
      template: "#cpn",
      data() {

      },
      methods: {
        showMessage(){
          console.log("showMessage");
        }
      },
    };
    const app = new Vue({
      el: "#app",
      data() {
    
      },
      methods: {
        btnClick(){
          // 使用 $children
          console.log(this.$children)
          console.log(this.$children[0].showMessage)
          for (let cpn of this.$children) {
            console.log(cpn.showMessage)
          }
        }
      },
      components: {
        cpn
      },
    })
  </script>

输出结果:

 

可见 this.$children 获取的是数组类型,也是叫VueComponent,展开后可以对其内部数据和方法进行调用。

缺点: 需要手动传入索引指定子组件,较繁琐,开发不常用。

  

 参考:https://blog.csdn.net/qq_38128179/article/details/88876060        https://v2.cn.vuejs.org/v2/guide/components-edge-cases.html#%E8%AE%BF%E9%97%AE%E5%AD%90%E7%BB%84%E4%BB%B6%E5%AE%9E%E4%BE%8B%E6%88%96%E5%AD%90%E5%85%83%E7%B4%A0

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值