响应式数据

1、 reactive() 接收一个普通对象然后返回该普通对象的响应式代理。

2、 ref 接受一个参数值并返回一个响应式且可改变的 ref 对象。ref 对象拥有一个指向内部值的单一属性 .value。

3、readonly ()接受一个对象 (不论是响应式还是普通的) 或是一个 ref,返回一个原值的只读代理。

4、toRef() 从复杂类型中抽离单个 响应式属性出来

5、toRefs() 将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref。每个单独的 ref 都是使用 toRef() 创建的。

<template>
    <h1>ref - {{count}}</h1>
    <h1>reactive - {{obj.name}}</h1>
    <h1>toRef  - {{fooRef}}</h1>
    <h1>toRefs   - {{foo}}</h1>
    <h2>readonly - {{copy.count}}</h2>
</template>
<script setup>
    import { ref, reactive, toRef, toRefs, readonly } from "vue";
    // 创建单个响应式数据
    const count = ref(0);
    count.value = 1;
    console.log(count);
    // 对象响应式数据
    const obj = reactive({
        name: "张三",
    });
    // 修改对象响应式数据
    setTimeout(() => {
        obj.name = "李四";
    });

    const state = reactive({
        foo: 1,
        bar: 2,
    });

    // 双向 ref,会与源属性同步
    const fooRef = toRef(state, "foo");

    // 更改该 ref 会更新源属性
    fooRef.value++;
    console.log(state.foo); // 2

    // 更改源属性也会更新该 ref
    state.foo++;
    console.log(fooRef.value); // 3

    const stateAsRefs = toRefs(state)
    // 可以解构而不会失去响应性
    const { foo, bar } = stateAsRefs


    const original = reactive({ count: 0 })
    const copy = readonly(original)

    setTimeout(() => {
         // 依赖追踪
        console.log(copy.count)
    },2000);

    // 更改源属性会触发
    original.count++

    // 更改该只读副本将会失败,并会得到一个警告
    copy.count++ // warning!
</script>
powered by GitbookEdit Time: 2024-06-06 18:25:41