Vue$refs和$nextTick的使用

271 阅读1分钟

$refs

  • $refs可以获取原生DOM和组件
  • $refs获取到的是一个对象
  • $refs可以获取组件所有的数据,包括组件的变量和方法

使用$refs

  1. 给标签或者组件添加ref属性
  2. 然后使用$refs获取
  • 创建组件(demo.vue)
<template>
  <div>
      <p>demo组件</p>
  </div>
</template>

<script>
export default {
    data () {
        return {
            msg :'demo组件'
        }
    },
    methods:{
        fn(){
            console.log(demo的方法);
        }
    }
}
</script>

<style>

</style>
  • 创建vue文件引入demo组件
<template>
  <div>
    <!-- 通过ref属性获取dom元素和组件对象 -->
    <p>获取dom元素</p>
      <h1 id="h1" ref="myh1">hello vue</h1>
      <demo ref="de"></demo>
  </div>
</template>

<script>
import demo from "./components/demo.vue";
export default {
  mounted(){
    // 通过ref属性获取dom元素
    console.log(document.querySelector('#h1'));  // 使用原生方式获取DOM
    console.log(this.$refs.myh1);               //使用$refs获取DOM
    console.log(1,this.$refs.de);               //使用$refs获取组件对象
    console.log(2,this.$refs.de.fn);            //使用$refs获取组件的方法
    console.log(3,this.$refs.de.msg);           //使用$refs获取组件的变量
  },
  components:{
    demo
  }
}
</script>

<style>

</style>

$nextTick的使用

  • 作用:Vue 更新DOM是异步的,因此想要获取同步的DOM就需要使用$nextTick()方法

  • $nextTick()返回的是Promise对象

  • $nextTick()获取DOM的方式

    • this.$nextTick(function(){})
    • this.$nextTick().then(()=>{})
    • await this.$nextTick()

代码

<template>
  <div>
    <!-- $nextTick解决data更新异步问题 -->
    <p ref="p1">{{count}}</p>
    <button @click="btn">点击</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      count:0
    }
  },
  methods:{
    btn(){
      this.count++
      console.log(this.$refs.p1.innerHTML);  //0
      this.$nextTick(()=>{
        console.log(this.$refs.p1.innerHTML); //1
      })
    }
  }
}
</script>

<style>

</style>