返回

shallowRef是什么?可能导致视图更新的原因

前端

浅层响应(shallowRef)可能会引起的问题

很多时候我们在使用Vue.js进行开发的时候,我们通过绑定变量来渲染视图,如果需要在组件渲染过程中修改某个变量,我们可以使用shallowRef()来包裹变量,这样就不会触发视图的更新,从而提高性能。

通常情况下,在使用shallowRef()时不会出现问题,但在某些情况下,它可能会导致视图的更新。

让我们来看看一个具体的例子:

<template>
  <div>
    <p>{{ msg }}</p>
    <button @click="updateMsg">Update Message</button>
  </div>
</template>

<script>
import { shallowRef } from 'vue'

export default {
  setup() {
    // 使用 shallowRef 来包裹 msg 变量
    const msg = shallowRef('Hello World!')

    function updateMsg() {
      // 更新 msg 变量的值
      msg.value = 'New Message!'
    }

    return {
      msg,
      updateMsg,
    }
  }
}
</script>

上面的例子中,我们使用shallowRef()包裹了msg变量,然后在updateMsg函数中更新了msg变量的值。我们希望这样不会触发视图的更新,但实际上,视图却更新了。

这是因为shallowRef()并不能阻止所有类型的视图更新。它只阻止那些由变量直接修改引起的视图更新。在上面的例子中,我们使用msg.value来修改msg变量的值,这是直接修改,所以视图会更新。

要解决这个问题,我们可以使用Vue.set()方法来更新msg变量的值。Vue.set()方法可以阻止视图的更新。

<template>
  <div>
    <p>{{ msg }}</p>
    <button @click="updateMsg">Update Message</button>
  </div>
</template>

<script>
import { shallowRef } from 'vue'
import { set } from 'vue'

export default {
  setup() {
    // 使用 shallowRef 来包裹 msg 变量
    const msg = shallowRef('Hello World!')

    function updateMsg() {
      // 使用 Vue.set 来更新 msg 变量的值
      set(msg, 'value', 'New Message!')
    }

    return {
      msg,
      updateMsg,
    }
  }
}
</script>

现在,视图就不会更新了。

除了这个问题之外,shallowRef()还有其他一些限制。例如,它不能用于响应式对象。如果我们需要在组件渲染过程中修改响应式对象,我们需要使用reactive()方法来包裹对象。

总的来说,shallowRef()是一个非常有用的工具,它可以帮助我们提高性能。但是,在使用它的时候,我们需要了解它的限制。