赋值和渲染是异步过程,解决方式4种

4 篇文章 0 订阅

vue知识点03

赋值和渲染是异步过程,解决方式4种:

四种方式的优先级:
在这里插入图片描述
在这里插入图片描述

<template>
  <div>
    <div ref="node">模板插值{{ value }}</div>
    <ul>
      <li v-for="(item, index) in list" :key="index">
        {{ item.title }} + {{ item.handler }} + {{ item.state }}
        <button>处理</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      value: 1002,
      list: Array(10)
        .fill()
        .map((_, i) => {
          return {
            title: "待处理事件0" + i,
            handler: "人员:Aj",
            state: Math.random() > 0.5 ? "Finish" : "New",
          };
        }),
    };
  },
  created() {
    console.log("index created>>>", this.$refs.node);
    // vue框架根据nodejs的nextTick原理实现了一个$nextTick异步回调执行函数
    // tick表示记号--是渲染后的记号
  },

  mounted() {
    console.log("index mounted>>>", this.$refs.node);

    // 以下几个方法的优先级?
    // nextTick === Promise > requrestAnimationFrame > setTimeout

    // 解决赋值异步问题的方案:
    setTimeout(() => {
      console.log("index mounted setTimeout>>>", this.$refs.node.innerHTML);
    });

    requestAnimationFrame(() => {
      console.log("index mounted requestAnimationFrame>>>", this.$refs.node.innerHTML);
    });

    Promise.resolve().then(() => {
      console.log("index mounted Promise>>>", this.$refs.node.innerHTML);
    });
    this.$nextTick(function () {
      console.log("index mounted nextTick>>>", this.$refs.node.innerHTML);
    });

    console.log("index mounted 更改模板插值>>>", this.$refs.node.innerHTML);
    // vue中对赋值和渲染做了一个优化,对于同一个方法中的非异步赋值会进行渲染合并--使用的原理是防抖
    // 给value赋值后,会起一个定时器,然后等是否有新的非异步赋值
    this.value = 20;
    // 发现有非异步赋值,那么会清除之前的定时器,重新起一个定时器,继续观察
    this.list[0] = 10;
    this.list[2] = 100;
    this.list[4] = 1001;
    this.list[6] = 10011;
    // 直到没有异步赋值,然后执行渲染
    console.log("index mounted 更改模板插值>>>", this.$refs.node.innerHTML);
    setTimeout(() => {
      console.log("index mounted setTimeout02>>>", this.$refs.node.innerHTML);
    });

    requestAnimationFrame(() => {
      console.log("index mounted requestAnimationFrame02>>>", this.$refs.node.innerHTML);
    });
    // 表示赋值渲染完成以后再去执行的回调函数
    this.$nextTick(function () {
      console.log("index mounted nextTick02>>>", this.$refs.node.innerHTML);
    });

    Promise.resolve().then(() => {
      console.log("index mounted Promise02>>>", this.$refs.node.innerHTML);
    });

    // 结果:赋值和渲染是异步的。它的延迟是使用Promise实现的
  },

  updated() {
    console.log("index updated>>>", this.$refs.node);
  },
};
</script>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue.js 中的 `watch` 选项默认是同步执行的,但是如果你在 `watch` 回调函数中进行异步操作时,可能会遇到赋值异步的问题。这是因为 JavaScript 中的异步操作,例如 `setTimeout` 和 `fetch` 等,会先于同步代码执行完毕,所以当异步操作完成时,`watch` 回调函数可能已经执行完毕,并且已经将新值赋值给了对应的数据。 为了解决这个问题,Vue.js 提供了一个 `$nextTick` 方法,可以让回调函数在 DOM 更新之后再执行。你可以在 `watch` 回调函数中使用 `$nextTick` 方法来确保赋值异步操作的正确性,例如: ```javascript watch: { myData: { handler(newValue) { // 异步操作,例如 fetch fetch('/api/data').then(res => { // 赋值异步 this.myData = res.data; // 在下一个 tick 中执行回调函数 this.$nextTick(() => { console.log('myData 已更新'); }); }); }, immediate: true, }, }, ``` 在上面的例子中,当 `myData` 的值发生改变时,`handler` 回调函数会执行异步操作,并在异步操作完成后将新值赋值给 `myData`。然后,在下一个 tick 中,`$nextTick` 方法会执行回调函数并打印出 `'myData 已更新'`。这样就能确保赋值异步操作的正确性了。 ### 回答2: 在Vue中,watch选项是用来监听数据变化的,常用于对数据的变化做一些逻辑处理或者触发一些副作用操作。当我们在watch选项中赋值时,它的执行是异步的。 具体来说,当我们给watch选项赋值时,这个赋值操作会将要执行的回调函数添加到一个队列中,等到代码执行完毕之后再去执行这个队列中的回调函数。这样可以避免频繁的执行计算属性或者渲染组件,优化性能。 例如,我们有一个data属性名为count,同时有一个watch选项监听了count的变化: ``` data: { count: 0 }, watch: { count: function() { this.asyncFn(); } }, methods: { asyncFn: function() { setTimeout(function() { console.log(this.count); }, 1000); } } ``` 当我们修改count的值时,比如点击按钮来改变count的值,那么watch回调的执行会被推迟到下一个事件循环中,也就是说,在按钮的点击事件处理函数执行完之后,watch回调才会被执行。 这异步的执行机制使得我们可以更好地控制代码的执行时机,避免了一些不必要的重复执行,提升了代码的性能。但同时也要注意,在异步的情况下,我们可能会遇到一些问题,比如依赖顺序的问题,这时我们可以使用Vue提供的nextTick方法来解决。 ### 回答3: 在vue中,watch属性是用于监听数据变化的。当数据变化时,watch会自动执行对应的响应函数。一般情况下,watch的赋值是同步的,也就是说,当数据改变时,watch会立即执行相应的函数。 然而,在某些情况下,我们可能会遇到watch赋值异步的情况。具体来说,当我们在watch中对数据进行赋值操作时,有时候这个赋值操作可能是异步的,也就是说,watch函数并不会立即执行,而是等待赋值操作完成后再执行。 为什么会出现watch赋值异步的情况呢?这主要是由于vue的响应式系统机制所致。在vue中,数据的变化会触发一系列的操作,包括触发getter和setter函数、重新渲染组件等。而这些操作是在vue的下一个事件循环中执行的,也就是说,赋值操作在当前的事件循环中并不会立即生效,而是需要等待下一个事件循环才能生效。 对于这情况,我们可以采用一些方法来确保watch的赋值操作是同步的。例如,可以在watch函数中使用$nextTick方法来延迟执行异步操作,确保赋值操作生效。另外,也可以使用computed属性来替代watch属性,因为computed属性的赋值操作是同步的。 总之,虽然在某些情况下watch的赋值异步的,但我们可以通过一些手段来确保watch的赋值操作是同步的,以满足我们的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值