3.Vue3 To系列

188 阅读1分钟

1.toRef

复制 reactive 里的单个属性并转成 ref

<template>
  {{ person }}
  {{ age }}
  <button @click="change">change</button>
</template>

<script setup lang="ts">
import {isRef, reactive, toRef} from "vue";

const person = reactive({
  name: 'Yang',
  age: 23
})

// 复制reactive对象里的一个属性 并变成ref对象 并且修改这个值源数据也会发生改变
// 修改源数据这个值也会发生改变
const age = toRef(person, 'age')

const change = () => {
  age.value++
  console.log(isRef(age))// true
}
</script>

2.toRefs

复制 reactive 里的所有属性并转成 ref

<template>
  {{ name }}
  {{ age }}
  <button @click="change">change</button>
</template>

<script setup lang="ts">
import {reactive, toRefs} from "vue";

const person = reactive({
  name: 'Yang',
  age: 23
})

// 不经历refs的数据解构之后会失去响应式
// let {name, age} = person
// 辅助reactive对象并把所有属性都通过ref变成响应式数据

let {name, age} = toRefs(person)

const change = () => {
  name.value = 'Tom'
  age.value++
}
</script>

3.toRaw

把一个响应式数据变成普通数据

<template>
  {{ person }}
  {{ raw }}
  <button @click="change">change</button>
</template>

<script setup lang="ts">
import {reactive, toRaw} from "vue";

const person = reactive({
  name: "Yang",
  age: 23
})

// 把一个响应式对象变成一个普通对象
// 经过toRaw拿到的对象和源对象是引用关系 修改其中一个另一个也会发生该改变
// 区别就是源对象修改会引起视图更新 toRaw得到的对象不会引起视图更新

const raw = toRaw(person)

const change = () => {
  raw.age++
  console.log(person)
  console.log(raw)
}
</script>