Vue.js 中 ref 和 reactive 的区别及用法解析

 更新时间:2024年09月19日 09:59:32   作者:陈小唬  
在Vue.js中,ref主要用于创建响应式的引用,通过.value属性来访问和修改值,特别适用于需要频繁更改整个值的场景,而reactive则用于创建深度响应的对象或数组,本文给大家介绍Vue.js 中 ref 和 reactive 的区别及用法,感兴趣的朋友跟随小编一起看看吧

Vue.js 中 refreactive 的区别及用法

ref

  • 目的:创建一个对值的响应式引用。
  • 用法:通过 .value 属性来访问和修改值。
  • 示例
import { ref } from 'vue';
const count = ref(0);
count.value++;  // 增加值
console.log(count.value);  // 访问值

直接赋值数组ref 创建的是一个包含 .value 属性的对象,这个 .value 属性持有实际的数据。无论如何改变这个 .value 的内容,Vue 都能检测到变化并进行更新。

import { ref } from 'vue';
const city1List = ref([]);
onMounted(() => {
  getCityByPid(0).then(res => {
    city1List.value = res.data.data;  // 直接赋值新数组
    console.log(city1List.value);  // 访问数组内容
  });
});

reactive

  • 目的:创建一个深度响应的对象或数组。
  • 用法:直接修改响应对象或数组的属性。
  • 示例
import { reactive } from 'vue'; const state = reactive({ count: 0 }); 
state.count++; // 增加 
count console.log(state.count); // 访问 count

不能直接赋值数组reactive 创建的是一个深度响应的对象或数组,Vue 只跟踪创建时的对象引用。如果直接重新赋值一个新的对象或数组,Vue 将无法跟踪新的引用,因为新的引用不会被自动转换为响应式对象。

import { reactive } from 'vue';
let city1List = reactive([]); 
onMounted(() => { 
getCityByPid(0).then(res => 
     { city1List.splice(0, city1List.length, ...res.data.data); // 使用数组方法修改内容 
     console.log(city1List); // 访问数组内容 
   }); 
);

关键区别和最佳实践

ref

创建一个响应式引用。使用 .value 来访问和修改值。可以直接通过 .value 重新赋值新的数组或对象。

reactive

  • 创建一个深度响应的对象或数组。
  • 直接修改对象或数组的属性或元素。
  • 不能直接重新赋值整个对象或数组,而需要修改其内部的属性或元素。

实际解决方案

使用 reactive 更新数组时,可以使用 splice 清除并替换元素,这样保持了对原始响应数组的引用,Vue 会继续跟踪其内容的变化。

import { reactive } from 'vue';
let city1List = reactive([]);
onMounted(() => {
  getCityByPid(0).then(res => {
    city1List.splice(0, city1List.length, ...res.data.data);  // 清除现有数组并添加新项目
    console.log(city1List);  // 访问数组内容
  });
});

总结

ref 适用于需要频繁更改整个值的场景,因为它可以直接赋值新的数组或对象。

reactive 适用于需要深度响应的对象或数组,在修改其内部属性或元素时能保持响应性。

到此这篇关于Vue.js 中 ref 和 reactive 的区别及用法的文章就介绍到这了,更多相关Vue.js ref 和 reactive用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3实现长列表虚拟滚动的示例代码

    vue3实现长列表虚拟滚动的示例代码

    本文主要介绍了vue3实现长列表虚拟滚动的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • vue3中 provide 和 inject 用法小结

    vue3中 provide 和 inject 用法小结

    父子组件传递数据时,使用的是props和emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传很多次,会很麻烦,这篇文章主要介绍了vue3中 provide 和 inject 用法,需要的朋友可以参考下
    2023-11-11
  • vue element upload组件 file-list的动态绑定实现

    vue element upload组件 file-list的动态绑定实现

    这篇文章主要介绍了vue element upload组件 file-list的动态绑定实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Django与Vue语法的冲突问题完美解决方法

    Django与Vue语法的冲突问题完美解决方法

    这篇文章主要介绍了Django与Vue语法的冲突问题完美解决方法,本文给大家分享了两种解决方法,需要的朋友参考下吧
    2017-12-12
  • Vue中的父子组件传值及传方法

    Vue中的父子组件传值及传方法

    这篇文章主要介绍了Vue中的父子组件传值及传方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • vue组件jsx语法的具体使用

    vue组件jsx语法的具体使用

    本篇文章主要介绍了vue组件jsx语法的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Vue2与Vue3兄弟组件通讯bus的区别及用法

    Vue2与Vue3兄弟组件通讯bus的区别及用法

    这篇文章主要介绍了Vue2与Vue3兄弟组件通讯bus的区别及用法,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家多多进步早日升职加薪
    2021-09-09
  • vue移动端设置全屏背景的项目实践

    vue移动端设置全屏背景的项目实践

    本vue移动端项目设置全屏背景,关键是要找对文件,然后添加background属性即可,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 基于vue实现swipe分页组件实例

    基于vue实现swipe分页组件实例

    本篇文章主要介绍了基于vue实现swipe分页组件实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Vue import from省略后缀/加载文件夹的方法/实例详解

    Vue import from省略后缀/加载文件夹的方法/实例详解

    本文介绍Vue在import时省略后缀以及import文件夹的方法,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08

最新评论