当前位置:首页 > 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 中实现点击样式可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-bind:class 动态绑定类名 通过数据驱动的方式动态切换类名,结合…

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双…

vue实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通…

vue实现布局

vue实现布局

Vue 实现布局方法 Vue 提供了多种方式实现页面布局,可以通过组件化、CSS 框架或自定义样式完成。以下是几种常见方法: 使用 CSS Flexbox 或 Grid 通过 Vue 单文件组件结…

vue实现浮标

vue实现浮标

Vue 实现浮动按钮(浮标) 使用 Vue 实现浮动按钮可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 定位和 Vue 组件 创建 Vue 组件并配合 CSS 固定定位实现浮动按钮:…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…