Vue ref引用

1. ref 引用概念

  • jquery :简化了程序员操作 DOM 的过程。
  • vue 优势:MVVM 在vue中,程序员不需要操作 DOM 。程序员只需要把数据维护好即可。
  • 建议:在 vue 的项目中,不要使用 jquery。
  • 那么在 vue 中需要操作 DOM 怎么办呢?

ref 用来辅助开发者在不依赖 jQuery不调用获取 DOM 的API 下,获取 DOM 元素或组件的引用

每个 vue 的组件实例上,都包含一个 $refs 对象,里面储存着对应的 DOM 元素或组件的引用。默认情况下,组件的 $refs 指向一个空对象。

2.使用 ref引用获取 DOM

  • 使用 ref 属性,为对应的标签添加引用的名称

    该名称不要重复,如果重复,获取到的是后面的 DOM

    <h3 ref="myH3"> Test.vue 根组件</h3>
    <p ref="myP">count from right {{ countFather }} </p>
    
  • 在该组件实例的 $refs 对象上可以获取到 DOM

    即可对 DOM 进行需要的操作

    export default {
        methods: {
            printThis(){
                console.log(this)
                this.$refs.myH3.style.color = 'red'
                this.$refs.myP.style.color = 'blue'
            }
        }
    }
    

3. 使用 ref 引用组件实例

  • 使用 ref 属性,为对应的组件**添加引用的名称 **xxx

  • 可以通过 $refs.xxx 得到组件的实例

  • 即可访问到 methods 中的方法以及 data 的数据

    <Right @numChange="getNewCount" ref="comRight"></Right>
    
    resetCount(){
        console.log(this.$refs.comRight)
        this.$refs.comRight.reset()
    }
    

4. 了解 this.$nextTick 应用场景

4.1 遇到的场景

<input type="text" v-if="inputVisible" @blur="showButton" ref="iptRef">
<button v-else @click="showInput">展示输入框</button>
showInput(){
    // 展示文本框
    this.inputVisible = true
    // 自动获得焦点
    this.$refs.iptRef.focus()
}

Cannot read properties of undefined (reading 'focus') 调用 focus 前面的是 undefined

原因: 当执行完 this.inputVisible = true ,data数据已经改变,将要对 ui结构进行更新,还处于 beforeUpdate 时期,此时 ui 结构还没有得到更新,页面中还没有 input 标签,当访问this.$refs.iptRef时,得到的就是 undefined

4.2 解决方案

this.$nextTick(callback) :将callback回调函数延迟到下一个 DOM 更新周期之后执行。

  • 等组件的 DOM 更新完成之后,再执行 callback 回调函数。
  • 从而能保证 callback 回调函数可以操作到最新的 DOM 元素。

4.3 为什么不用 updated

当 input 失去焦点时,data的数据也会发生变化,此时也会调用 updated 函数,但是此时 input 得DOM 结构已经被移除,会报错。

### 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、付费专栏及课程。

余额充值