Vue ref,reactive 响应式引用

// ref , reactive 响应式引用
// 原理,通过proxy 对数据进行封装,当数据变化时,触发模版等内容的更新
// ref 处理基础类型的数据
// reactive 处理非基础类型数据 如:数组,对象等


<script>
// ref , reactive 响应式引用
// 原理,通过proxy 对数据进行封装,当数据变化时,触发模版等内容的更新
// ref 处理基础类型的数据
// reactive 处理非基础类型数据 如:数组,对象等

方法一:简单使用 ref,监听属性变化

方法二:简单使用 reactive 监听对象变化

// setup 
    // 创建 vue实例
   const app = Vue.createApp({
   
   
    
     // ref 时,使用name如: {
   
   {name}}
    // reactive 时,使用name如: {
   
   {nameObj.name}}
    template:  `
    <div >
        {
    
    {nameObj.name}}
    </div>
   `,

        // created 实例被完全初始化之前
        // 可以直接使用
        setup(props, context) {
   
   
            // 不能在里面用 this关键词
            // 不能调用外部函数
            // 方法一: 使用 ref
            /*
            const {ref} = Vue;
            // proxy, ‘dell’ 变成 proxy({value: 'lee'})这样的一个响应式引用
                let name = ref('dell');
                setTimeout(() => {
                    name.valu
### Vueref响应式引用机制及原理 在Vue 3中,`ref` 是一个用于创建响应式数据引用的核心API。它支持所有类型的数据(包括基本类型和对象类型),并且通过 `.value` 属性来访问或修改其内部值。以下是关于 `ref` 的详细解析: --- #### 1. **`ref` 的用法** `ref` 可以用于创建基本类型和对象类型的响应式引用。以下是一些常见的使用场景: - **基本类型** 当需要将一个基本类型(如数字、字符串、布尔值)转换为响应式时,可以使用 `ref`。 ```javascript import { ref } from 'vue'; const count = ref(0); // 创建一个响应式的数字引用 console.log(count.value); // 输出:0 count.value++; // 修改响应式引用的值 console.log(count.value); // 输出:1 ``` - **对象类型** 对于复杂数据结构(如对象或数组),`ref` 同样适用。 ```javascript import { ref } from 'vue'; const objRef = ref({ name: 'Vue' }); // 创建一个响应式的对象引用 console.log(objRef.value.name); // 输出:Vue objRef.value.name = 'React'; // 修改响应式引用中的属性 console.log(objRef.value.name); // 输出:React ``` --- #### 2. **`ref` 的响应式原理** `ref` 的实现依赖于 Vue 3 的响应式系统,核心是通过 `Proxy` 和 `Reflect` 来拦截数据的读取和写入操作。以下是其实现的关键点: - **类封装** `ref` 内部通过一个名为 `RefImpl` 的类来封装数据。该类定义了 `_value` 和 `_rawValue` 属性,并提供了 `get` 和 `set` 方法来拦截对 `.value` 的访问和修改[^3]。 - **依赖收集** 在读取 `ref.value` 时,会调用 `trackRefValue(this)` 方法进行依赖收集。这意味着 Vue响应式系统会记录哪些组件或计算属性依赖于该 `ref` 引用[^3]。 - **触发更新** 当修改 `ref.value` 时,会调用 `triggerRefValue(this)` 方法通知所有依赖于该 `ref` 的组件或计算属性重新渲染或计算[^3]。 --- #### 3. **`ref` 与模板自动解包** 在 Vue 3 的模板中,`ref` 的 `.value` 会被自动解包,因此无需显式地访问 `.value` 属性。例如: ```html <template> <div>{{ count }}</div> <!-- 自动解包,等价于 {{ count.value }} --> </template> <script> import { ref } from 'vue'; export default { setup() { const count = ref(0); return { count }; } }; </script> ``` --- #### 4. **`ref` 与 `reactive` 的对比** 尽管 `ref` 和 `reactive` 都是 Vue 3 的响应式API,但它们的设计目标和使用场景有所不同: | 特性 | `ref` | `reactive` | |-------------------|----------------------------------------|-------------------------------------| | 数据类型支持 | 所有类型 | 对象/数组 | | 访问方式 | 需要 `.value` | 直接访问属性 | | 响应式保持 | 替换整个对象仍保持响应 | 结构破坏会丢失响应 | | 模板自动解包 | 支持 | 无需解包 | | TypeScript 支持 | 明确类型推断 | 嵌套属性类型保留 | --- #### 5. **代码示例** 以下是一个完整的代码示例,展示了如何在 Vue 3 中使用 `ref`: ```javascript // 使用 ref 处理基本类型和对象类型 import { ref, createApp } from 'vue'; const app = createApp({ template: ` <div> <p>Count: {{ count }}</p> <!-- 自动解包 --> <p>Name: {{ user.value.name }}</p> <!-- 需要 .value --> <button @click="increment">Increment</button> </div> `, setup() { const count = ref(0); // 基本类型 const user = ref({ name: 'Vue' }); // 对象类型 const increment = () => { count.value++; // 修改基本类型 user.value.name = 'React'; // 修改对象类型 }; return { count, user, increment }; } }); app.mount('#app'); ``` --- #### 6. **总结** `ref` 是 Vue 3 中处理响应式数据的重要工具,尤其适用于基本类型或需要明确 `.value` 访问的场景。它的实现基于 `Proxy` 和 `Reflect`,能够高效地拦截数据的读写操作并触发依赖更新[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值