vue (ref 和 $nextTick 的使用)

一、首先介绍一下ref的使用:

1.目标:通过id 或 ref 属性获取原生DOM(获取标签)

在mounted生命周期 - 2种方式获取原生DOM标签

① 用id属性

② ref属性

小例子:

<template>
  <div>
       <!-- 获取标签可以用ref -->
       <p>1.获取原生DOM元素</p>
       <h1 id="h" ref="myH">我是一个孤独可怜又能吃的h1</h1>
  </div>
</template>

<script>
export default {
     // 目标:获取组件对象
     // 1.创建组件/引入组件/注册组件/使用组件
     // 2.组件起别名ref
     // 3.恰当时机,获取组件对象


     mounted() {
          // 两种方式都能获取到
          console.log(document.getElementById('h'));
          // $refs对象里面特有的属性
          console.log(this.$refs.myH)
     },
    
     
}
</script>

<style>

</style>

运行结果:

vue (ref 和 $nextTick 的使用)

 2. 目标:通过ref属性获取组件对象

<template>
  <div>
       <p>2.获取组件对象 - 可调用组件内一切</p>
       <demo ref="de"></demo>
  </div>
</template>

<script>
import Demo from './Demo.vue';
export default {
    
  components: { Demo },

     mounted() {
          // 子组件调用
          let demoObj = this.$refs.de
          demoObj.fn()
     },
   
     
}
</script>

<style>

</style>
<template>
  <div>
       <p>我是Demo组件</p>
  </div>
</template>

<script>
export default {
     methods:{
            //组件对象
          fn() {
               console.log('demo组件内的方法被调用了')
          }
     }

}
</script>

<style>

</style>

3. nextTick基础使用

   nextTick 可以等DOM执行更新后

   vue更新DOM是异步的

<template>
  <div>
       <p>3. vue 更新DOM是异步的</p>
       <p ref="myP">{{count}}</p>
       <button @click="btn">点击count+1,马上提取p标签内容</button>
  </div>
</template>

<script>
export default {
  data() {
       return {
            count:0,
       }
  },
    
     methods: {
          btn() {
               this.count++;  // vue监测数据更新
               //vue更新DOM是异步代码 开启一个DOM更新队列(异步任务) 会从0开始
               // console.log(this.$refs.myP.innerHTML)  //0

               
               // 原因:vue更新DOM异步
               // 解决: this.$nextTick()
               // 过程: DOM 更新完全挨个触发 $nextTick里的函数体
               this.$nextTick(()=> {
                    console.log(this.$refs.myP.innerHTML)
                    console.log('DOM')
               })
          }
     }
     
}
</script>

<style>

</style>

使用场景(点击搜索自动获取焦点)

<template>
  <div>
       <input type="text" placeholder="这是一个输入框" v-if="isShow" ref="myInp">
       <button v-else @click="btn">点击我搜索</button>
  </div>
</template>

<script>
// 目标: 点按钮(消失) -输入框出现并且聚焦
// 1. 获取到输入框
// 2. 输入框调用事件方法focus()达到聚焦行为
export default {
     data() {
          return {
               isShow:false,
          }
     },
     methods: {
        async  btn() {
               this.isShow = true
               // this.$refs.myInp.focus()
               // 原因:data变化更新DOM是异步的,
               //       输入框还没有挂载到真实DOM上


               // 解决:
               // this.$nextTick(()=> {
               // this.$refs.myInp.focus()

               // })

               // 扩展:await 取代回调函数
               // $nextTick() 原地返回Promise对象
               // focus 自动获取焦点方法
               await this.$nextTick()
               this.$refs.myInp.focus()

          },
     }

}
</script>

<style>

</style>

上一篇:vue中$refs、$emit、$on的使用场景


下一篇:根据索引 绑定动态ref