复习vue(7)refs 和 DOM 操作

153 阅读1分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。

refs 和 DOM 操作

  • vue 是数据驱动的,不提倡操作DOM,但是必要的时候还是要操作 DOM ,vue提供了一个行内属性,专门用来获取 DOM,
  • vm.$refs 是Vue提供的实例属性,专门用来获取DOM元素

使用 refs

在需要获取的标签添加 ref="标识符"行内属性;然后在vue的实例中通过 vm.$refs.标识符 获取这个元素对象;如果有多个相同标识符的ref,vm.$refs 将会获得一个数组;

代码示例:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>

<body>
  <div id="app">
    <p ref="p1">{{msg}}</p>
    <ul ref="ulList">
      <li v-for="(item, index) in arr" :key="index" ref="wrap">{{item}}</li>
    </ul>
  </div>


  <script src="vue.js"></script>
  <script>
    // Vue 是数据驱动的,不提倡操作 DOM,但是必要的时候还是要操作 DOM,Vue 提供了一个行内属性,专门用来获取 DOM;
    // this.$refs
    let vm = new Vue({
      el: '#app',
      data: {
        msg: '来学习啦?',
        arr: [1, 2, 3, 4]
      },
      mounted() {
        console.log(this.$refs);
        // ref 属性可以用来获取 DOM;
        // this.$refs.xxx xxx 是你要获取的 DOM 元素对象上 ref 属性的值,例如获取上面的 p 标签,
        console.log(this.$refs.p1);

        // 如果相同的 ref 值的元素有多个,那么获取到的是一个数组
        console.log(this.$refs.wrap);
      }
    })
  </script>
</body>

</html>

Vue 异步的 DOM 更新和 nextTick

  • vue 更新 DOM 的机制
  • vue 的 DOM 更新不是同步的,而是异步的如果我们希望获取更新数据后渲染的 DOM,我们需要使用 nextTick

nextTick

  • 语法: this.$nextTick(callBack);
  • 把 callBack 放到 DOM更新后执行
示例代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>

<body>
  <div id="app">
    <p ref="p1">{{msg}}</p>
    <ul ref="ulList">
      <li v-for="(item, index) in arr" :key="index" ref="wrap">{{item}}</li>
    </ul>
  </div>


  <script src="vue.js"></script>
  <script>
    // this.$refs
    let vm = new Vue({
      el: '#app',
      data: {
        msg: '来学习啦?',
        arr: [1, 2, 3, 4]
      },
      mounted() {
        this.arr.push(5, 6, 7);
        console.log(this.$refs.wrap.length); // 4
        console.log(this.arr); //1234567 数据都已更新

        // 为啥是4?不是7?
        // 因为 Vue 的 DOM 更新是异步的,如果我们希望获取更新数据后渲染出来的 DOM,我们需要使用 nextTick

        this.$nextTick(() => {
          // 这个 $nextTick 方法会在数据更新后,新的 DOM 挂载后执行;
          console.log(this.$refs.wrap.length); // 7
          console.log(this.arr); //1234567 数据都已更新
        })
      }
    })
  </script>
</body>

</html>