跳到主要内容

ref, reactive

ref 支持所有类型, reactive 只支持引用类型 Array, Object, Map, Set

ref 取值, 赋值需要 .value, reactive 不需要 .value

reactive 不能直接赋值, 否则会破坏其响应式的功能(数组使用 push 加解构)(把数组作为一个属性)

readonly 把所有属性变成只读的。

ref 只能浅层解包。

toRef

toRef 只有在修改响应式对象的字段的值时视图才会变化, 修改非响应式对象的字段时视图毫无变化

<template>
<div>
{{ man }}
<hr />
{{ name }}
<hr />
<button @click="change">click</button>
</div>
</template>
<script setup lang="ts">
import { reactive, toRef } from "vue";

const man = reactive({ name: "wzy" });
const name = toRef(man, "name");

const change = () => {
man.name = "w";
name.value = "z";
console.log(man);
console.log(name);
};
</script>
<style scoped></style>

toRefs

toRefs 把响应式对象的所有字段都变成响应式对象到一个对象中。一般是会搭配解构赋值使用。

const { name, age } = toRefs(man);

上面的代码中, name, age 都是响应式了。在通过 name.value 修改时,man.name 的值也会被修改。视图也会更新。

toRaw

toRaw 可以获取到响应式对象的原始对象

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

const man = reactive({ name: "wzy" });

const change = () => {
// name.value = "123";
const raw = toRaw(man);
console.log(man, raw); // 响应式对象, 原始对象
man.name = "wwww"; // 视图, 响应式对象, 原始对象 都会更新
console.log(man, raw); // 可以观察到响应式对象, 原始对象的 name 字段都会更新
};
</script>