Vue 3 中的 ref 完全指南

打印 上一主题 下一主题

主题 934|帖子 934|积分 2806

Vue 3 中的 ref 完全指南

Vue 3 引入了 Composition API,其中 ref 是关键的一部分。ref 可以让我们更方便地在组件中定义响应式数据,在模板中使用 <script setup> 语法糖时尤为简便。本文将详细解说 Vue 3 中 ref 的概念、用途及常见用法,并通过示例展示如何在实际开辟中利用 ref 提升开辟效率。

一、什么是 ref

ref 是 Vue 3 Composition API 中定义响应式数据的核心函数。ref 可以使基本类型(字符串、数字、布尔值等)和复杂数据类型(数组、对象等)都具备响应式特性。当 ref 定义的数据发生变革时,Vue 会自动追踪并更新模板中对应的数据展示。
使用 ref 创建响应式数据

在 Vue 3 中,通过引入 ref 函数,我们可以轻松定义一个响应式数据。ref 会返回一个包含值的对象,通过 .value 属性访问和修改数据。
  1. import { ref } from 'vue';
  2. const count = ref(0); // 定义一个响应式的计数器变量
  3. console.log(count.value); // 访问 count 的值,输出 0
  4. count.value = 10; // 修改 count 的值
  5. console.log(count.value); // 访问修改后的值,输出 10
复制代码
在上述示例中,我们通过 ref(0) 创建了一个响应式的 count,并通过 .value 访问或更改其值。

二、基础用法

1. 定义和修改响应式数据

在 <script setup> 中,可以直接使用 ref 来定义数据并应用在模板中:
  1. <template>
  2.   <div>
  3.     <p>当前计数:{{ count }}</p>
  4.     <button @click="increment">增加计数</button>
  5.   </div>
  6. </template>
  7. <script setup>
  8. import { ref } from 'vue';
  9. const count = ref(0); // 定义响应式变量 count
  10. function increment() {
  11.   count.value++; // 更新 count 的值
  12. }
  13. </script>
复制代码
表明:


  • count 是响应式的,当 count.value 更新时,<p>{{ count }}</p> 会自动重新渲染。
  • 在模板中直接使用 count 时,Vue 会自动分析 .value,无需手动调用 count.value。
2. 响应式数据的双向绑定

ref 常用于实现双向绑定,比如将表单输入的内容实时绑定到变量中:
  1. <template>
  2.   <div>
  3.     <input v-model="username" placeholder="请输入用户名" />
  4.     <p>您输入的用户名是:{{ username }}</p>
  5.   </div>
  6. </template>
  7. <script setup>
  8. import { ref } from 'vue';
  9. const username = ref(''); // 定义响应式变量 username
  10. </script>
复制代码
表明:


  • v-model 指令会自动绑定输入值到 username 变量,并且每次输入内容变革时,Vue 会自动更新视图中的展示值。

三、 ref 与复杂数据类型

1. 对象类型的 ref

ref 不仅可以定义基本类型数据,还可以定义对象类型。我们可以直接修改对象内部的属性,Vue 会自动监听并更新。
  1. <template>
  2.   <div>
  3.     <p>用户名:{{ user.name }}</p>
  4.     <p>年龄:{{ user.age }}</p>
  5.     <button @click="updateUser">修改用户名</button>
  6.   </div>
  7. </template>
  8. <script setup>
  9. import { ref } from 'vue';
  10. const user = ref({
  11.   name: '张三',
  12.   age: 25
  13. });
  14. function updateUser() {
  15.   user.value.name = '李四'; // 修改对象内部属性
  16. }
  17. </script>
复制代码
注意:虽然 user 是一个对象,但仍必要通过 user.value 访问其属性。
2. 数组类型的 ref

当 ref 定义数组时,可以直接使用数组的修改方法(如 push、pop 等),Vue 会响应式地跟踪数组内容的变革。
  1. <template>
  2.   <div>
  3.     <p>任务列表:</p>
  4.     <ul>
  5.       <li v-for="task in tasks" :key="task">{{ task }}</li>
  6.     </ul>
  7.     <button @click="addTask">添加任务</button>
  8.   </div>
  9. </template>
  10. <script setup>
  11. import { ref } from 'vue';
  12. const tasks = ref(['学习 Vue 3', '完成项目']);
  13. function addTask() {
  14.   tasks.value.push('新任务'); // 向数组中添加元素
  15. }
  16. </script>
复制代码
在这个例子中,Vue 会监听 tasks 数组的变革,每次调用 addTask 方法时,新的使命会自动添加到列表中并显示在页面上。

四、ref 在 DOM 中的应用

1. 获取 DOM 元素的引用

在 Vue 3 中,可以通过 ref 获取 DOM 元素的引用,如许可以更机动地操作 DOM 元素。
  1. <template>
  2.   <div>
  3.     <input type="text" ref="inputRef" placeholder="请输入内容" />
  4.     <button @click="focusInput">聚焦输入框</button>
  5.   </div>
  6. </template>
  7. <script setup>
  8. import { ref } from 'vue';
  9. const inputRef = ref(null); // 定义一个 DOM 引用
  10. function focusInput() {
  11.   inputRef.value.focus(); // 调用 DOM 的 focus 方法
  12. }
  13. </script>
复制代码
表明


  • inputRef 是一个 DOM 引用,通过 <input ref="inputRef"> 绑定到详细的输入框。
  • 当点击按钮时,focusInput 方法会聚焦到输入框。
2. 监听 DOM 元素的变革

在某些场景下,我们可能必要在 DOM 元素变革时获取最新的高度、宽度等属性,可以结合 ref 和 Vue 的 onMounted 钩子实现。
  1. <template>
  2.   <div ref="boxRef" class="box">我是一个方块</div>
  3. </template>
  4. <script setup>
  5. import { ref, onMounted } from 'vue';
  6. const boxRef = ref(null);
  7. onMounted(() => {
  8.   console.log("方块高度:", boxRef.value.offsetHeight);
  9. });
  10. </script>
  11. <style scoped>
  12. .box {
  13.   width: 100px;
  14.   height: 100px;
  15.   background-color: skyblue;
  16. }
  17. </style>
复制代码
表明


  • boxRef 用来引用 .box 元素。
  • onMounted 钩子在组件挂载后实行,获取并输出方块的高度。

五、toRefs 与 reactive 的结合

ref 更适合管理单一数据,而如果我们有多个属性的对象必要响应式管理,通常会使用 reactive。当我们希望在组合 API 中把 reactive 对象的属性袒露到模板中时,可以使用 toRefs 将 reactive 转换为 ref。
示例:

  1. <template>
  2.   <div>
  3.     <p>用户名:{{ user.name }}</p>
  4.     <p>年龄:{{ user.age }}</p>
  5.     <button @click="incrementAge">增加年龄</button>
  6.   </div>
  7. </template>
  8. <script setup>
  9. import { reactive, toRefs } from 'vue';
  10. const user = reactive({
  11.   name: '张三',
  12.   age: 25
  13. });
  14. function incrementAge() {
  15.   user.age++;
  16. }
  17. const userRefs = toRefs(user);
  18. </script>
复制代码

六、总结



  • 定义响应式数据:ref 用于定义基本数据类型和复杂数据类型的响应式数据。
  • 双向绑定:ref 变量可以通过 v-model 实现表单的双向绑定。
  • DOM 引用:使用 ref 获取并操作 DOM 元素。
  • 与 reactive 结合:在必要处置处罚多个属性的对象时,建议使用 reactive 和 toRefs 组合。
ref 是 Vue 3 响应式体系中的核心工具,通过熟练掌握 ref,可以在 Vue 开辟中更加机动地实现数据绑定和界面交互。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表