在 Vue 3 中,提供了多种创建响应式数据的方法,下面将详细介绍这些方法及其使用场景。

reactive 函数

reactive 函数用于创建一个响应式对象。它接收一个普通对象作为参数,并返回一个响应式的代理对象。

示例代码

<template>
  <div>
    <p>{{ state.count }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script setup>
import { reactive } from 'vue';

const state = reactive({
  count: 0
});

const increment = () => {
  state.count++;
};
</script>

解释: reactive 函数将一个普通对象转换为响应式对象。当修改 state 对象的属性时,Vue 会自动更新与之绑定的 DOM。

ref 函数

ref 函数用于创建一个响应式的引用。它可以用于包装基本数据类型(如 number、string、boolean 等),也可以用于包装对象。

示例代码

<template>
  <div>
    <p>{{ count.value }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};
</script>

解释: ref 函数创建一个包含响应式数据的对象,该对象有一个 .value 属性用于访问和修改数据。在模板中使用 ref 时,不需要使用 .value,Vue 会自动解包。

toRef 和 toRefs 函数

toRef 用于从一个响应式对象中创建一个单独的响应式引用。

示例代码

<template>
  <div>
    <p>{{ countRef.value }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script setup>
import { reactive, toRef } from 'vue';

const state = reactive({
  count: 0
});

const countRef = toRef(state, 'count');

const increment = () => {
  countRef.value++;
};
</script>

解释: toRef 创建的引用与原对象的属性保持响应式连接。

toRefs 用于将一个响应式对象转换为普通对象,其中每个属性都是一个 ref。

示例代码

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script setup>
import { reactive, toRefs } from 'vue';

const state = reactive({
  count: 0
});

const { count } = toRefs(state);

const increment = () => {
  count.value++;
};
</script>

解释: toRefs 常用于解构响应式对象,以保持响应式连接。

shallowReactive 和 shallowRef 函数

shallowReactive 只对对象的第一层属性进行响应式处理,而不会递归处理嵌套对象。

示例代码

<template>
  <div>
    <p>{{ state.name }}</p>
    <p>{{ state.info.address }}</p>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAddress">修改地址</button>
  </div>
</template>

<script setup>
import { shallowReactive } from 'vue';

const state = shallowReactive({
  name: '张三',
  info: {
    address: '北京市'
  }
});

const changeName = () => {
  state.name = '李四';
};

const changeAddress = () => {
  state.info.address = '上海市';
};
</script>

解释: 修改 state.name 会触发响应式更新,但修改 state.info.address 不会。

shallowRef 只对 .value 属性进行响应式处理,而不会对其内部对象进行递归处理。

示例代码

<template>
  <div>
    <p>{{ state.value.name }}</p>
    <button @click="changeName">修改姓名</button>
  </div>
</template>

<script setup>
import { shallowRef } from 'vue';

const state = shallowRef({
  name: '张三'
});

const changeName = () => {
  // 这样不会触发响应式更新
  // state.value.name = '李四';
  // 需要替换整个 .value 对象
  state.value = {
    ...state.value,
    name: '李四'
  };
};
</script>

解释: 直接修改 state.value 的属性不会触发响应式更新,需要替换整个 .value 对象。

以上就是 Vue 3 中常用的创建响应式数据的方法,你可以根据具体的需求选择合适的方法

四下皆无人