$refs和$nextTick的使用

152 阅读1分钟

$refs:获取原生dom标签.

父组件代码

<template>
  <div style="border:1px solid #ccc; margin:5px;padding:5px">
    <h1>37-refs</h1>
    <!-- 1. 添加一个ref属性 -->
    <h2 ref="refH2">获取 dom元素 或者 组件</h2>
    <button @click="fn">获取dom</button>
    <MyCom ref="refMyCom"/>
    <button @click="fn2">获取子组件</button>
  </div>
</template>

<script>
// 导入->注册->使用
import MyCom from './MyCom.vue'
export default {
  components: { MyCom },
  methods: {
    fn() {
      // 1. 获取dom原生的方式
      // document.querySelector("h2").innerHTML = "abc"
      // 2. 获取dom原生的方式2 this.$refs.ref的值
      console.log(this.$refs.refH2.innerHTML)
    },
    fn2() {
      // 为所欲为
      // console.log(this.$refs.refMyCom)
      // console.log(this.$refs.refMyCom.num)
      // this.$refs.refMyCom.num = 1
      this.$refs.refMyCom.fn(1000)
    }
  }
}
</script>

<style>

</style>

子组件代码

<template>
  <div style="border:1px solid #ccc; margin:5px;padding:5px">
    <h2>子组件</h2>
    num: {{num}}
  </div>
</template>

<script>
export default {
  // 2.子接
  data(){
    return {
      num: 100
    }
  },
  methods: {
    fn(n){
      this.num = n
      console.log('子组件的函数')
    }
  }
}
</script>

<style>

</style>

$refs的使用.png

ref可以用来获取dom或组件实例对象的方法.

$nextTick的用法.

因为数据的变化而导致的dom更新是异步的.所以这个时候我们就要用到.$nextTick方法.

我们用一串代码来验证一下

<template>
  <div>
    <p id="num">数字: {{ count }}</p>
    <button @click="btn">点击+1, 观察打印</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    btn() {
      this.count++; // 数字添加后, 异步更新DOM, 所以马上获取标签的值还是0
      console.log(document.getElementById("num").innerHTML); // 0
    },
  },
};
</script>

把上面的代码在vue中运行.然后把输出的结果在控制台打印一下观察有什么变化.

点击button按钮控制台打印出来的结果

image.png

页面打印出来的结果

image.png

数字添加后, 异步更新DOM, 所以马上获取标签的值还是0

语法

this.$nextTick(回调函数)

image.png

在页面中打印出来.观察结果.

image.png 从结果中可以看到.代码同步了.

dom是异步更新的, $nextTick可以等待dom更新后触发此方法