Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >《Vue3.0抢先学》系列之:响应式之Ref vs. Reactive

《Vue3.0抢先学》系列之:响应式之Ref vs. Reactive

作者头像
一斤代码
发布于 2019-10-29 08:00:22
发布于 2019-10-29 08:00:22
1.7K00
代码可运行
举报
文章被收录于专栏:大前端开发大前端开发
运行总次数:0
代码可运行

在上文中,我们使用Vue3.0最新的Composition API改写了由Options API写成的计数器示例。我们发现,原先的数据响应式监听的用法发生了变化,原先通过data中声明的响应式属性,现在替换成由 ref 函数来创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Vue2.x Options API 写法
data() {
  return {
    count: 0
  }
}

// Vue3.x Composition API 写法
const count = ref(0)

这种新的写法,有点React Hooks的味道了。ref 函数传入一个值作为参数,返回一个基于该值的响应式Ref对象,该对象中的值一旦被改变和访问,都会被跟踪到,就像我们改写后的示例代码一样,通过修改 count.value 的值,可以触发模板的重新渲染,显示最新的值。

其实,除了 ref 函数,Vue3.0中还提供了另外一个可以创建响应式对象的函数,那就是 reactive 函数。如果我们的示例程序用 reactive 函数来改写,那么会是这样子的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { createApp, reactive } = Vue

// 计数器组件
const Counter = {
    template: `
        <div class="counter-display">
            <span class="counter-label">恭喜你,你已经写了</span>
            <span class="counter-text">{{ state.count }}</span>
            <span class="counter-label">斤代码!</span>
        </div>
        <div class="counter-btns">
            <button class="btn" @click="increase">写一斤</button>
            <button class="btn" @click="reset">删库啦</button>
        </div>
    `,

    setup() {
        const countOps = useCount()
        return { ...countOps }
    }
}

function useCount() {
    const state = reactive({ count: 0 })
    const increase = () => { state.count++ }
    const reset = () => { state.count = 0 }
    return { state, increase, reset }
}

和使用 ref 的时候变化不是很大,只是把 count 作为一个对象的属性进行包装了,看起来是不是也很容易理解?

然而,你可能会有疑问,为什么要提供 ref 和 reactive 两种方式呢?其实,这是和为了适应不同人的编程风格有关。要理解这点,让我们先来看2段实现了同样功能的代码。

风格一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x = 0
let y = 0

function updatePos(e) {
  x = e.pageX
  y = e.pageY
}

风格二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const pos = { x: 0, y: 0 }

function updatePos(e) {
  pos.x = e.pageX
  pos.y = e.pageY
}

从上面的2段代码观察到,两者的主要区别在于:风格一,我们使用了2个变量来存储x、y坐标值;而风格二则将x、y值封装于一个对象的2个属性中存储。这两种风格的代码工作的都没问题,关键在于个人或团队的偏好:使用单独的变量还是使用对象封装。

而前面说的 ref 和 reactive 的区别,正是和这个有关。我们可以把使用 ref 看做是风格一,使用 reactive 对应风格二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 风格一
const x = ref(0)
const y = ref(0)
const isDisplay = ref(false)

// 风格二
const state = reactive({
  x: 0,
  y: 0,
  isDisplay: false
})

看了今天的文章,是不是稍微有点头绪了?关于Vue3.0响应式的东西还有很多可以讲,后面的文章见!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.10.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《Vue3.0抢先学》系列之:使用render函数
还记得Vue2.x中组件的 render 方法么?我们除了可以用template来进行模板化的渲染输出,还可以用 render 方法进行编程式的渲染。模板有着看起来更易于阅读、更直观的优点,而 render 方法有着更好的灵活性。在Vue3.0中依然保留了这个功能,而且还为符合Composition API的编程理念做了调整。
一斤代码
2019/10/29
2K0
《Vue3.0抢先学》系列之:组件属性Props
组件,是封装和复用性的体现。封装,将尽量少的细节暴露给外界;复用,在保证整体功能的情况下通过一些方式提供灵活性、可变性。这些设计指导原则可以让我们在程序开发的过程中,写出组织良好,可维护性比较高的代码。
一斤代码
2019/10/29
2.6K0
《Vue3.0抢先学》系列之:组件属性Props
VUE3.0和VUE2.0语法上的不同
前言:本篇文章只做VUE3.0和VUE2.0语法上的不同分析,不做性能和源码架构等的分析。
javascript艺术
2022/06/08
1.5K0
VUE3.0和VUE2.0语法上的不同
《Vue3.0抢先学》系列之:更多响应式API示例
这几天,我们陆续学习了解了关于Vue3.0的一些新特性,尤其是新的Composition API的用法。这套新的API中最重要、最核心的部分,恐怕就是实现响应式功能的这一块了。而且,这套响应式API不仅可以在Vue3.0环境下使用,也可以独立使用。
一斤代码
2019/10/29
9960
vue3.0 Composition API 上手初体验 函数组件的开发与使用
在上一节中,我们讨论了普通组件的开发与使用,其实相比较 vue 2.0 来说,差别并不大。
FungLeo
2020/05/26
1.2K0
精读《Vue3.0 Function API》
Vue 3.0 的发布引起了轩然大波,让我们解读下它的 function api RFC 详细了解一下 Vue 团队是怎么想的吧!
极乐君
2019/07/10
1.1K0
《Vue3.0抢先学》系列之:使用Composition API
在上一篇文章中,我们大致了解了如何使用Vue3.0编写一个简单的计数器程序。不过,正如熟悉Vue2.x的朋友所看到的,我们用Vue3.0实现出来的代码和Vue2.x的看起来并没有什么太大区别。难道Vue3.0就这样了?没什么新的东西吗?
一斤代码
2019/10/29
1.2K0
Vue 3 响应式基础
reactive 相当于 Vue 2.x 中的 Vue.observable() API ,为避免与 RxJS 中的 observables 混淆因此对其重命名。该 API 返回一个响应式的对象状态。该响应式转换是“深度转换”——它会影响嵌套对象传递的所有 property。
公众号---人生代码
2020/11/11
6860
《Vue3.0抢先学》系列之:一个简单的例子
书接上文:你被我撩拨了一下,从Github上下载了Vue3.0的源码。然后呢,你是不是已经迫不及待的想知道到底怎么样快速的把这个源代码用起来呢?
一斤代码
2019/10/29
1.2K0
《Vue3.0抢先学》系列之:一个简单的例子
推荐:非常详细的vue3.0开发笔记(7k字)
当将当前的技术栈从Vue 2.0升级到Vue 3.0时,有许多值得考虑的理由。以下是10个升级到Vue 3.0的理由:
微芒不朽
2023/08/21
4470
推荐:非常详细的vue3.0开发笔记(7k字)
vue3.0 Composition API 翻译版(超长)
Composition API 一组基于功能的附加API,允许灵活地组成组件逻辑。
公众号---人生代码
2020/05/18
8.9K0
vue3.0 Composition API 翻译版(超长)
面试官:Vue3.0的设计目标是什么?做了哪些优化?
不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下Vue3之前我们或许会面临的问题
@超人
2021/02/26
4540
面试官:Vue3.0的设计目标是什么?做了哪些优化?
茶余饭后聊聊 Vue3.0 响应式数据那些事儿
"别再更新了,实在是学不动了"这句话道出了多少前端开发者的心声,"不幸"的是 Vue 的作者在国庆区间发布了 Vue3.0 的 pre-Aplha 版本,这意味着 Vue3.0 快要和我们见面了。既来之则安之,扶我起来我要开始讲了。Vue3.0 为了达到更快、更小、更易于维护、更贴近原生、对开发者更友好的目的,在很多方面进行了重构:
政采云前端团队
2019/12/20
9600
茶余饭后聊聊 Vue3.0 响应式数据那些事儿
vue3基础ref,reactive,toRef ,toRefs 使用和理解
在 Vue 3 中,ref、reactive、toRef 和 toRefs 是用于响应式数据管理的重要工具。理解它们的使用方式和区别对于有效地利用 Vue 3 的响应式系统至关重要。以下是对这些工具的详细解释和示例。
肥晨
2024/08/27
5260
vue3基础ref,reactive,toRef ,toRefs 使用和理解
Vue3.0 新特性以及使用变更总结(实际工作用到的)
Vue3.0 在去年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发,这篇文章就是在使用后的一个总结, 包含Vue3新特性的使用以及一些用法上的变更。
@超人
2021/03/23
2.6K0
Vue3.0 新特性以及使用变更总结(实际工作用到的)
vue3.0新特性
在 vue3 的 script 中不再使用 data 和 methods ,而是使用 setup() 方法
青梅煮码
2023/02/18
3420
vue3 -- 通过几行示例代码,聊一聊响应式
Vue3 中关于响应式的 API (@vue/reactivity)有以下几个,下面通过使用不同的 Api 实现上述示例,来做一个对比和总结 :
奋飛
2020/12/09
1.9K0
为什么 Vue3.0 要重写响应式系统
面试的时候经常被问到 响应式 相关的内容,而Vue3.0 更新后,面试官又有了新的武器;
西岭老湿
2021/01/26
1.1K0
为什么 Vue3.0 要重写响应式系统
109.精读《Vue3.0 Function API》
Vue 3.0 的发布引起了轩然大波,让我们解读下它的 function api RFC 详细了解一下 Vue 团队是怎么想的吧!
黄子毅
2022/03/14
3830
vue 随记(3):“新时代”的姿势
•性能上:最多比vue2 快2倍•静态标记提升•proxy取代defineProperty•tree shaking:按需编译打包代码•composition api :类似hook的编码风格•支持typescript:面向未来目前的代码 98% 以上使用 TypeScript 编写。如果你还没有学习 TypeScript,请尽快学习,否则可能看不懂源码。另外有件事情说出来可能会让你非常惊讶,Vue 3 的源代码完全没有使用 class 关键字!(只在测试代码和示例代码里用到了 class 关键字)•custom renderer api:自定义渲染
一粒小麦
2020/07/21
6760
相关推荐
《Vue3.0抢先学》系列之:使用render函数
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验