当前位置: 首页 > article >正文

[vue3] Ref Reactive

【b站-【前端面试】Vue3 ref 与 reactive 区别】

Ref:Ref用于创建一个响应式的基本数据类型,比如数字、字符串等。它将普通的数据变成响应式数据,可以监听数据的变化。使用Ref时,我们可以通过.value来访问和修改数据的值。

Reactive:Reactive则用于创建一个响应式对象,可以包含多个属性。通过Reactive,我们可以将整个对象变成响应式,使对象的任何属性发生变化时都能被检测到。

Ref

ref 接受的数据类型:基本类型,引用类型。
作用:把参数加工成一个响应式对象,全称为reference对象(简称为ref对象) 。
核心原理:
如果参数是基本类型, 那么形成响应式依赖于Object.defineProperty( )get( )set( )
如果ref的参数是引用类型,底层ref会借助reactive的proxy 定义响应式变成这样:reactive({value:‘value’})

import { ref } from 'vue'
 
// 为基本数据类型添加响应式状态
const name = ref('Neo')
 
// 为复杂数据类型添加响应式状态
const state = ref({
  count: 0
})
 
// 打印name的值
console.log(name.value)
// 打印count的值
console.log(state.value.count)

可以在setup()函数中使用,管理简单的数据状态。

import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);

    return {
      count
    };
  }
};

在Vue3中,<script setup>语法是一种简洁的写法,可以在单文件组件中更便捷地使用ref。

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

const count = ref(0);
</script>

Reactive

在Vue3中,Reactive用于创建一个响应式对象,使对象的属性发生变化时能够被检测到。通过reactive()函数创建一个响应式对象,对象的所有属性都变成响应式

原理:它的响应式是更加‘深层次’的(会影响对象内部所有嵌套的属性,所有的数据都是响应式的),底层本质是将传入的数据包装成一个 Proxy

参数必须是对象或者数组,如果要让对象的某个元素实现响应式时比较麻烦。需要使用 toRefs 函数处理

import { reactive } from 'vue';

const user = reactive({
  name: 'Alice',
  age: 30
});

在模板中使用Reactive
在模板中可以直接使用响应式对象,对对象的属性进行访问和修改。

<template>
  <div>
    <p>Name: {{ user.name }}</p>
    <p>Age: {{ user.age }}</p>
  </div>
</template>

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

export default {
  setup() {
    const user = reactive({
      name: 'Alice',
      age: 30
    });

    return { user };
  }
};
</script>

深层响应式
Reactive会递归地将对象的所有嵌套属性都变成响应式,确保整个对象的变化能够被追踪。

const nestedData = reactive({
  nestedObj: {
    key: 'value'
  }
});

// 修改嵌套属性
nestedData.nestedObj.key = 'new value';

import { reactive, toRefs } from 'vue'

// 通过 reactive 定义响应式数据
const state = reactive({
    // 定义每一个表单控件的配置项:type类型、label文本、prop绑定字段 等信息
    items: [{
        label: "用户名",
        prop: "name",
        inputwidth: "100%",
    }, {
        password: true,
        label: "密码",
        prop: "pwd",
        inputwidth: "100%",
        rules: [{ required: true, message: "请输入密码", trigger: 'blur' }]
    }, {
        label: "手机号",
        prop: "phone",
        inputwidth: "100%",
        required: true,
        validateType: "phone"
    }],
    // 定义每一个表单绑定字段对应的信息(form表单数据信息)
    formData: {
        name: "",
        pwd: "",
        phone: ""
    },
    // form 元素配置信息
    options: {
        size: "small",
        formWidth: "35%",//表单占父元素的宽度
        labelWidth: "80px",//标签的长度
    },
})

// 通过 toRefs 获取 reactive 中的每一项属性的引用(js中调用使用 .value,template 中直接使用自动解析)
const { items, formData, options } = toRefs(state);

console.log(items,options)

参考:

前端Vue篇之Vue3响应式:Ref和Reactive

【Vue3 易混淆概念点一】ref、toRef、toRefs、reactive 异同点


http://www.kler.cn/a/539033.html

相关文章:

  • DeepSeek从入门到精通:全面掌握AI大模型的核心能力
  • 【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪
  • C++ 设计模式 - 访问者模式
  • QT修仙之路1-1--遇见QT
  • 【03】 区块链分布式网络
  • 在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
  • 如何在Python中使用内置函数
  • 【Golang学习之旅】Go + Redis 缓存设计与优化(项目实战)
  • 2.9学习总结
  • 从零开始了解人工智能:核心概念、GPT及 DeepSeek 探索
  • 使用cursor开发python调用deepseek本地模型实现本地AI对话
  • 如何学习多智能体系统协调(如自动驾驶车协同避让)
  • Linux:安装 node 及 nvm node 版本管理工具(ubuntu )
  • jvm view
  • 【LeetCode Hot100 堆】第 K 大的元素、前 K 个高频元素
  • 智慧城市节水管理信息系统项目解决方案
  • 在阿里云ECS上一键部署DeepSeek-R1
  • 7.Python文件操作:文件的打开与关闭、文件的读写、文件读写应用
  • 数据管理的“圣经”——《DAMA数据管理知识体系指南(第二版)》
  • 解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用
  • React 什么是抽象组件及为什么要抽象组件
  • 人工智能-A* 算法规划的路径进行动态调整
  • 分组加密算法CLEFIA
  • 【LLM】o1/R1系列LLM数据篇
  • 【开学补课复习专题】python 语言考试试题2
  • cuda学习资料汇总