ref

在 Vue 3 中,你可以使用 setup 函数来定义组件的数据和方法。在 setup 函数中,你可以使用 refreactivecomputed 等 Vue 3 的响应式 API 来定义数据,并返回一个包含你需要公开的数据和方法的对象。下面是一个例子:

  1. import { defineComponent, ref } from 'vue';
  2.  
  3. export default defineComponent({
  4. setup() {
  5. const message = ref('Hello World');
  6.  
  7. function showMessage() {
  8. alert(message.value);
  9. }
  10.  
  11. return {
  12. message,
  13. showMessage
  14. };
  15. }
  16. });

在这个例子中,我们使用 ref 函数来定义了一个名为 message 的响应式数据,并将其初始化为字符串 'Hello World'。我们还定义了一个名为 showMessage 的方法,它在被调用时会弹出一个包含 message 的提示框。最后,我们在 setup 函数的返回值中将 messageshowMessage 作为一个对象返回,这样它们就可以在组件的模板中使用了。

在组件的模板中,你可以使用插值语法和 v-on 指令来访问这些数据和方法。例如:

  1. <template>
  2. <div>
  3. <p>{{ message }}</p>
  4. <button @click="showMessage">显示消息</button>
  5. </div>
  6. </template>

在这个例子中,我们使用 {{ message }} 插值语法来显示 message 的值,并使用 @click 绑定了 showMessage 方法。当按钮被点击时,showMessage 方法就会被调用,弹出一个包含 message 的提示框。

需要注意的是,在 Vue 3 中,setup 函数是组件中定义数据和方法的主要方式。其他选项(如 datamethodscomputed)仍然可以使用,但它们只是 setup 函数的语法糖。如果你使用这些选项来定义数据和方法,Vue 3 会将它们转换为 setup 函数中的等效代码。

以下是一个简单的 Vue 3 应用程序示例,点击按钮时会将数据加 1:

  1. <template>
  2. <div>
  3. <p>{{ count }}</p>
  4. <button @click="increment">加 1</button>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. import { defineComponent, ref } from 'vue';
  10.  
  11. export default defineComponent({
  12. setup() {
  13. const count = ref(0);
  14.  
  15. function increment() {
  16. count.value++;
  17. }
  18.  
  19. return {
  20. count,
  21. increment
  22. };
  23. }
  24. });
  25. </script>

在这个例子中,我们使用 ref 函数来定义一个名为 count 的响应式数据,并将其初始化为 0。我们还定义了一个名为 increment 的方法,它在被调用时会将 count 的值加 1。最后,我们在 setup 函数的返回值中将 countincrement 作为一个对象返回,这样它们就可以在组件的模板中使用了。

在组件的模板中,我们使用 {{ count }} 插值语法来显示 count 的值,并使用 @click 绑定了 increment 方法。当按钮被点击时,increment 方法就会被调用,将 count 的值加 1,并且页面会自动更新显示最新的值。

可以将 increment 函数从普通函数改写为箭头函数,代码如下:

  1. <template>
  2. <div>
  3. <p>{{ count }}</p>
  4. <button @click="increment">加 1</button>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. import { defineComponent, ref } from 'vue';
  10.  
  11. export default defineComponent({
  12. setup() {
  13. const count = ref(0);
  14.  
  15. const increment = () => {
  16. count.value++;
  17. };
  18.  
  19. return {
  20. count,
  21. increment
  22. };
  23. }
  24. });
  25. </script>

在这个例子中,我们使用箭头函数语法定义了 increment 方法,这与使用普通函数的效果是一样的。箭头函数通常可以更简洁地表示函数逻辑,并且不需要绑定 this,因此在 Vue 3 中使用箭头函数作为组件的方法是很常见的。

 reactive 

reactive 是 Vue 3 中用于创建响应式对象的 API,它将一个普通的 JavaScript 对象转换为响应式对象,使得对象的属性能够在变化时触发视图的更新。

使用 reactive 创建响应式对象非常简单,只需要调用 reactive 函数并传入普通的 JavaScript 对象即可。例如:

  1. import { reactive } from 'vue';
  2.  
  3. const state = reactive({
  4. count: 0,
  5. message: 'Hello, World!',
  6. });

以下是一个简单的示例,演示如何使用 reactive 创建响应式对象,以及如何在视图中使用它们:

  1. <template>
  2. <div>
  3. <p>Count: {{ state.count }}</p>
  4. <p>Message: {{ state.message }}</p>
  5. <button @click="increment">Increment</button>
  6. <button @click="changeMessage">Change Message</button>
  7. </div>
  8. </template>
  9.  
  10. <script>
  11. import { reactive } from 'vue';
  12.  
  13. export default {
  14. setup() {
  15. const state = reactive({
  16. count: 0,
  17. message: 'Hello, World!',
  18. });
  19.  
  20. function increment() {
  21. state.count++;
  22. }
  23.  
  24. function changeMessage() {
  25. state.message = 'Hello, Vue!';
  26. }
  27.  
  28. return {
  29. state,
  30. increment,
  31. changeMessage,
  32. };
  33. },
  34. };
  35. </script>

在上面的代码中,我们使用 reactive 创建了一个响应式对象 state,包含两个属性 countmessage。我们还定义了两个方法 incrementchangeMessage,分别用于增加 count 属性的值和修改 message 属性的值。在模板中,我们使用插值语法 {{ }}v-on 指令绑定了 state 对象的属性和方法,以实现视图的响应式更新。@ 符号,它是 v-on 指令的缩写,用于绑定事件。

当我们点击 "Increment" 按钮时,increment 方法会将 count 属性的值增加 1,这会触发视图的响应式更新,使得 "Count" 文字后面的数字会自动更新为最新的值。

当我们点击 "Change Message" 按钮时,changeMessage 方法会将 message 属性的值修改为 "Hello, Vue!",这也会触发视图的响应式更新,使得 "Message" 文字后面的内容会自动更新为最新的值。

ref和reactive 的差别:

refreactive 都是 Vue 3 提供的用于实现响应式数据的 API,但它们的使用方式和作用略有不同。

  • ref:用于创建一个响应式的基本数据类型,如数字、字符串、布尔值等。ref 创建的响应式对象包装了一个基本类型的值,它提供了 .value 属性来访问包装的值,同时在模板中使用时,也需要通过 .value 来访问包装的值。
  • reactive:用于创建一个响应式的对象,可以包含多个属性。reactive 创建的响应式对象本身就是一个 JavaScript 对象,可以直接访问其中的属性,而不需要使用额外的 .value 属性。在模板中使用时,直接使用对象的属性名即可。

下面是一个示例,展示了 refreactive 同时存在时的使用方法和区别。

  1. <template>
  2. <div>
  3. <!-- ref 示例 -->
  4. <p>count 的值是:{{ count }}</p>
  5. <button @click="increment">+1</button>
  6.  
  7. <!-- reactive 示例 -->
  8. <p>person 的名字是:{{ person.name }}</p>
  9. <p>person 的年龄是:{{ person.age }}</p>
  10. <button @click="changeName">修改名字</button>
  11. <button @click="changeAge">修改年龄</button>
  12. </div>
  13. </template>
  14.  
  15. <script>
  16. import { ref, reactive } from 'vue';
  17.  
  18. export default {
  19. setup() {
  20. // ref 示例
  21. const count = ref(0);
  22. const increment = () => {
  23. count.value++;
  24. };
  25.  
  26. // reactive 示例
  27. const person = reactive({
  28. name: '张三',
  29. age: 20
  30. });
  31. const changeName = () => {
  32. person.name = '李四';
  33. };
  34. const changeAge = () => {
  35. person.age++;
  36. };
  37.  
  38. return {
  39. count,
  40. increment,
  41. person,
  42. changeName,
  43. changeAge
  44. };
  45. }
  46. }
  47. </script>
  48.  
  49. <!-- 批注:
  50. ref 用于创建单个数据的响应式值,需要使用 count.value 访问该值。
  51. reactive 用于创建包含多个属性的响应式对象,可以通过 person.name 和 person.age 访问属性。 -->

 toRefs 

toRefs 是 Vue 3 中的一个 API,它可以将一个 reactive 对象中的所有属性都转换成 ref 对象,并返回一个包含这些 ref 对象的新对象。

在 Vue 3 中,由于 reactive 对象的属性是被代理的,所以无法直接通过解构的方式获取这些属性,并且也无法将它们传递给一些只接受 ref 对象的 API。而通过 toRefs,我们可以将这些属性都转换成 ref 对象,并且使用 ref 对象的方式来访问它们。

下面是一个使用 toRefs 的示例:

return{...toRefs(date)}这段代码的作用是将 reactive 对象 data 中的所有属性转换为 ref 对象,并将这些 ref 对象组成一个新的对象返回。

具体来说,toRefs 函数可以将 reactive 对象中的所有属性转换为 ref 对象,这样我们就可以像操作普通的 ref 对象一样操作 reactive 对象的属性。但是,由于 toRefs 返回的是一个对象,因此它并不能直接将这些 ref 对象合并为一个 reactive 对象。因此,我们需要使用 ES6 扩展运算符 ... 将这些 ref 对象组成一个新的对象并返回。

需要注意的是,使用 toRefs 转换出来的 ref 对象和原来的 reactive 对象中的属性绑定关系是保持一致的。也就是说,如果我们通过 ref 对象修改了某个属性的值,那么这个修改也会反映到 reactive 对象上。因此,toRefs 函数可以用来在模板中方便地使用 reactive 对象的属性,同时保持这些属性与 reactive 对象的绑定关系。

  1. <template>
  2. <div>
  3. <p>count: {{ count.value }}</p>
  4. <p>message: {{ message.value }}</p>
  5. <button @click="increment">increment</button>
  6. </div>
  7. </template>
  8.  
  9. <script>
  10. import { reactive, toRefs } from 'vue'
  11.  
  12. export default {
  13. setup() {
  14. const data = reactive({
  15. count: 0,
  16. message: 'Hello, world!'
  17. })
  18.  
  19. const increment = () => {
  20. data.count++
  21. }
  22.  
  23. // 使用 toRefs 将 reactive 对象中的属性转换为 ref 对象
  24. // 然后将这些 ref 对象组成一个新的对象并返回
  25. return {
  26. ...toRefs(data),
  27. increment
  28. }
  29. }
  30. }
  31. </script>

在这个示例中,我们首先创建了一个 reactive 对象 data,其中包含了 countmessage 两个属性。然后,我们使用 toRefsdata 中的属性转换为 ref 对象,并将这些 ref 对象组成一个新的对象并返回。最后,我们在 setup 函数中定义了一个 increment 函数,用于增加 count 的值。在模板中,我们可以通过 count.valuemessage.value 来访问这些 ref 对象的值,并通过 @click="increment" 来监听按钮的点击事件。

vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs的更多相关文章

  1. Vue 全家桶 + Electron 开发的一个跨三端的应用

    代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  2. Vue全家桶高仿小米商城

    大家好,我是河畔一角,时隔半年再次给大家带来一门重量级的实战课程:<Vue全家桶高仿小米商城>,现在很多公司都在参与到商城的构建体系当中,因此掌握一套商城的标准开发体系非常重要:商城的开始 ...

  3. vue证明题一,vue全家桶的构成

    简单说下vue的构成,当然是简单为主,网上这东西满天飞,简单说几句就ok 1.vue是什么 vue读作view,是一种js框架.只关注于视图层,操作内容包括js,html,css 2.vue全家桶是什 ...

  4. 用 Vue 全家桶二次开发 V2EX 社区

    一.开发背景 为了全面的熟悉Vue+Vue-router+Vuex+axios技术栈,结合V2EX的开放API开发了这个简洁版的V2EX. 在线预览 (为了实现跨域,直接npm run dev部署的, ...

  5. Vue全家桶

    简介 “简单却不失优雅,小巧而不乏大匠”. Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计. 为什么 ...

  6. 从零开始系列之vue全家桶(3)安装使用vuex

    什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. ...

  7. 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...

  8. 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程

    使用vue全家桶制作博客网站   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...

  9. Vue全家桶介绍

    一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...

  10. 一个简单的假vue全家桶(vue+vue-router+require)

    首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...

随机推荐

  1. Javaweb学习笔记第八弹

    继续MyBatis学习 SQL语句警告提示问题 产生原因:IDEA和数据库没有建立连接,不识别表的信息 解决方式:在IDEA中配置MySQL数据库连接 在IDEA的Maven项目中,如果想要直接通过I ...

  2. SpringBoot使用邮件发送

    使用场景: 定时任务报错 消息推送 日志报错提醒 1.导入依赖 <dependency> <groupId>org.springframework.boot</group ...

  3. Spring MVC的请求处理逻辑

    当大家了解了如何编写一个简单的Spring MVC程序后,大家心中应该会有一些好奇:这背后到底发生了什么? Spring MVC是怎么把这些功能串联起来的?我们只是写了一个控制器而已,HTTP请求是怎 ...

  4. 「java技术干货」switch分支结构详解

    前言 在上一篇文章中,壹哥给大家介绍了Java里的顺序.分支.循环结构的概念,并且重点给大家讲解了分支结构中的条件分支.并在条件分支中,详细地给大家讲解了if条件分支的使用.现在我们应该知道,if条件 ...

  5. 在windows系统中设置MySQL数据库

    MySQL搭建 效果图 step1:下载安装包 https://downloads.mysql.com/archives/community/ step2:解压后即完成安装 step3:创建 my.i ...

  6. 基于OpenAI的代码编辑器,有点酷有点强!

    最近随着OpenAI的一系列大动作,把软件领域搅的天翻地覆.各行各业各领域,都出现了大量新产品. 开发工具领域首当其冲,各种新工具层出不穷,今天TJ就给大家推荐一个全新的开发工具:Cursor 从官网 ...

  7. MarkdownStudy03JDK

    卸载JDK 删除jdk文件夹 删除配置环境(计算机>属性>高级>系统变量中的JAVA_HOME和Path) 删除JAVA_HOME环境变量 删除path环境变量 用dos窗口查看是否 ...

  8. Install Ansible on CentOS 8

    环境准备: 1.至少俩台linux主机,一台是控制节点,一台是受控节点 2.控制节点和受控节点都需要安装Python36 3.控制节点需要安装ansible 4.控制节点需要获得受控节点的普通用户或r ...

  9. Java泛型: 主要知识点总结

    Java泛型:主要知识点总结 1 泛型的好处 解决元素存储的安全性问题. 解决获取数据元素时,需要类型强制转换的问题. Java泛型可以保证如果程序在编译时没有发出警告,运行.时就不会产生ClassC ...

  10. 把一个列表拆成N个子列表的四种方法

    编程的方法往往不止一种,比如怎么把一个Python种的列表拆成N个子列表,我们可以很容易找到N种方法,也许这就是编程的魅力所在. 一.列表表达式法 这种方法最为简洁,不过可读性差一些 这个方法中,即使 ...