当前位置:首页 > VUE

vue ref实现

2026-01-07 23:14:49VUE

Vue 中 ref 的实现

在 Vue 中,ref 是一个用于创建响应式引用的 API,适用于基本类型和对象。以下是 ref 的核心实现原理和使用方法。

基本实现原理

ref 通过 Reactive 系统将一个值包装为响应式对象。内部使用 value 属性存储实际值,并通过 gettersetter 实现依赖收集和触发更新。

vue ref实现

function ref(value) {
  return {
    get value() {
      track(this, 'value'); // 依赖收集
      return value;
    },
    set value(newValue) {
      value = newValue;
      trigger(this, 'value'); // 触发更新
    }
  };
}

在模板中的使用

在模板中直接使用 ref 时,Vue 会自动解包 .value,无需显式调用。

<template>
  <div>{{ count }}</div>
</template>

<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>

在组合式 API 中的使用

在 JavaScript 中操作 ref 时,需要通过 .value 访问或修改值。

vue ref实现

import { ref } from 'vue';
const count = ref(0);

function increment() {
  count.value++; // 修改值
}

refreactive 的区别

  • ref 适用于基本类型(如 numberstring)或对象引用,通过 .value 访问。
  • reactive 仅适用于对象,直接访问属性,无需 .value
const objRef = ref({ foo: 1 });
objRef.value.foo = 2; // 需要 .value

const objReactive = reactive({ foo: 1 });
objReactive.foo = 2; // 直接修改

ref 的进阶用法

通过 unref 可以简化逻辑,避免重复判断 .value

import { ref, unref } from 'vue';
const maybeRef = ref(0);
const value = unref(maybeRef); // 自动解包

在响应式对象中使用 ref

ref 被嵌套在 reactive 对象中时,会自动解包 .value

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

console.log(state.count); // 直接访问,无需 .value

标签: vueref
分享给朋友:

相关文章

vue实现边框

vue实现边框

Vue 实现边框的方法 在 Vue 中实现边框效果可以通过多种方式完成,包括内联样式、CSS 类绑定、动态样式以及使用第三方 UI 库。以下是几种常见的实现方法。 内联样式绑定 使用 Vue 的…

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装 sc…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli…

vue实现筛选

vue实现筛选

实现筛选功能的基本思路 在Vue中实现筛选功能通常需要结合数据绑定、计算属性和方法。筛选的核心逻辑是根据用户输入的条件过滤原始数据列表,并动态更新显示结果。 数据准备 定义一个数组存储原始数据,另…

vue实现表单

vue实现表单

Vue 表单实现方法 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定。适用于 input、textarea、select 等元素。 <template> &l…