返回

Vue 3 深度解读:toRefs 和 toRef 的异同与最佳实践

前端




在 Vue 3 中,新增了几种创建响应式数据的方法,其各自的作用当然也不尽相同,每一种方法都有其自己的应用场景,今天我们来聊聊什么是 ref toRef 和 toRefs?三者在使用方式上有什么不同?最佳的使用场景是什么?

**什么是 ref、toRef 和 toRefs?** 

**ref** 

ref 是 Vue 中的一个内置指令,用于获取 DOM 元素或组件实例。在 Vue 2 中,ref 可以直接用在模板中,比如:

```html
<template>
  <input ref="myInput" />
</template>

<script>
export default {
  mounted() {
    console.log(this.$refs.myInput) // 输出: <input>
  }
}
</script>

在 Vue 3 中,ref 仍然可以用于获取 DOM 元素或组件实例,但用法略有不同。首先,需要在组件的 setup() 方法中声明一个 ref,比如:

const myInputRef = ref(null)

然后,可以在模板中使用 v-ref 指令来获取 ref,比如:

<template>
  <input v-ref="myInputRef" />
</template>

<script>
export default {
  setup() {
    const myInputRef = ref(null)
    return {
      myInputRef
    }
  },
  mounted() {
    console.log(this.myInputRef) // 输出: <input>
  }
}
</script>

toRef

toRef 是 Vue 3 中的一个新方法,它可以将一个普通对象转换成一个响应式对象。比如:

const myObject = {
  name: 'John',
  age: 30
}

const reactiveMyObject = toRef(myObject)

现在,reactiveMyObject 就变成了一个响应式对象,这意味着当 myObject 的属性发生变化时,reactiveMyObject 的属性也会随之变化。

toRefs

toRefs 是 Vue 3 中的另一个新方法,它可以将一个普通对象的所有属性转换成响应式属性。比如:

const myObject = {
  name: 'John',
  age: 30
}

const reactiveMyObject = toRefs(myObject)

现在,reactiveMyObject 的所有属性都变成了响应式属性,这意味着当 myObject 的属性发生变化时,reactiveMyObject 的属性也会随之变化。

三者在使用方式上的区别

  • ref 用于获取 DOM 元素或组件实例,而 toRef 和 toRefs 用于将普通对象转换成响应式对象。
  • ref 可以直接在模板中使用,而 toRef 和 toRefs 需要在 setup() 方法中声明。
  • ref 返回的是一个对象,而 toRef 和 toRefs 返回的是一个响应式对象。

最佳的使用场景

  • ref 适用于需要获取 DOM 元素或组件实例的场景,比如:
const myInputRef = ref(null)

this.$nextTick(() => {
  myInputRef.value.focus()
})
  • toRef 适用于需要将普通对象转换成响应式对象的场景,比如:
const myObject = {
  name: 'John',
  age: 30
}

const reactiveMyObject = toRef(myObject)

watch(reactiveMyObject.name, (newName) => {
  console.log(`Name changed to ${newName}`)
})
  • toRefs 适用于需要将普通对象的所有属性转换成响应式属性的场景,比如:
const myObject = {
  name: 'John',
  age: 30
}

const reactiveMyObject = toRefs(myObject)

watch(reactiveMyObject.name, (newName) => {
  console.log(`Name changed to ${newName}`)
})

watch(reactiveMyObject.age, (newAge) => {
  console.log(`Age changed to ${newAge}`)
})

总结

ref、toRef 和 toRefs 都是 Vue 3 中创建响应式数据的新方法,它们各自的作用和应用场景有所不同。通过理解它们的异同,我们可以更好地理解和应用这些新特性,从而编写出更优雅和高效的 Vue 3 代码。