前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初探 Vue 3.0 的组装式 API(三)

初探 Vue 3.0 的组装式 API(三)

作者头像
贤羽
发布于 2022-06-09 07:02:15
发布于 2022-06-09 07:02:15
22900
代码可运行
举报
运行总次数:0
代码可运行

在基础的响应式数据和事件函数之后,我们再来说说 computed 计算属性 和 watch 监听吧。

初探 Vue 3.0 的组装式 API(一)

初探 Vue 3.0 的组装式 API(二)

(三)组件属性、计算属性与监听

1. 组件属性

通过数据和事件处理的几个例子,大家或许发现了 Vue3 的两个基本变化思路:

  • 开发人员自己动手组装响应式数据;
  • 事件处理对象方法降级为普通函数。

而这两者都避免了再将各种不同层级的属性、方法绑定到 $vm 上,从而避免了混乱的 this 指向问题。

以至于我们在 Vue3 的例子里基本没再用到过 this

对于父级组件传入的属性值,以前都是通过 this.<属性名> 访问的,在 Vue3 的 setup() 中怎么获取组件属性呢?

很简单,setup() 函数收到的第一个参数就是传入的属性值了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
    props: {
        name: String,
    },
    setup(props) {
        const { name } = props;

        return { name };
    },
};

不过由于传入的 props 是一个响应式数据,为了确保传入的非引用型数据发生变化时,页面内状态能动态更新,我们还得用 toRefs 从里面解构取值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { toRefs } from 'vue';

export default {
    props: {
        name: String,
    },
    setup(props) {
        const { name } = toRefs(props);

        return { name };
    },
};

2. 计算属性

对于间接通过其它数据再计算出来的计算属性,通过 Vue3 的组装 API 实现也很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// sells.js
import { ref, toRefs, computed } from 'vue';

export default {
    props: {
        // 库存数量
        totalCount: Number,
        // 售出数量
        sellCount: Number,
    },
    setup(props) {
        const { 
            totalCount = ref(0), 
            sellCount = ref(0), 
        } = toRefs(props);
        // 剩余数量
        const remainCount = computed(() => totalCount.value - sellCount.value);

        return { totalCount, sellCount, remainCount };
    },
};

除了实际的业务逻辑之外,computed() 通常还可以用于多个 className 的计算合成,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
    props: {
        // 是否禁用状态
        disabled: Boolean,
    },
    setup(props) {
        const { disabled } = toRefs(props);
        const className = computed(() => [
            'sells-list', 
            {
                'is-disabled': disabled,
            },
        ]);
    },
};

3. 监听

3.1 watch

当某个响应数据发生变化时,执行相关处理逻辑,我们就会用到 watch() 了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { disabledIds } = toRefs(props);
const selectedId = ref(null);

// 监听某个数据
watch(selectedId, (val, oldVal) => { 
    // do something
 });
// 监听多个数据
watch([selectedId, disabledIds], (val, oldVal) => {
    // 此时传入的 val 和 oldVal 将会是多个数据的数组
 });

// 监听某个复合条件的结果
watch(() => selectedId === disabledIds, (val, oldVal) => {
    // 当其中相关值发生改变,但结果不变时,这里不会被触发
});

我们还可以使用 watch() 返回的停止器来结束监听:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const selectedId = ref(null);

const stopWatch = watch(selectedId, (val) => { });

stopWatch();

3.2 watchEffect

watch 不同,watchEffect() 不需要指明监听目标,在它接收一个 effect 函数后,将会立刻执行并分析其中依赖的响应数据,在它们发生变化时再次执行这个 effect 函数。:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const sellsCount = ref(0);

watchEffect(() => {
    console.log(`sellsCount: ${sellsCount.value}`);
}); 
// 将会立刻看到输出日志,之后数据变化时再次打印日志

3.3 回收处理

如果需要在监听停止的同时,做一些额外的回收处理(比如解除 DOM 事件监听器、清理其它数据等),可以用到 onInvalidate 函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const sellsCount = ref(0);

watch(sellsCount, (val, oldVal, onInvalidate) => {
    console.log(`sellsCount: ${val}`);
    onInvalidate(() => {
        // 回收处理
    });
});

watchEffect((onInvalidate) => {
    console.log(`sellsCount: ${sellsCount.value}`);
    onInvalidate(() => {
        // 回收处理
    });
});

下一篇:《初探 Vue 3.0 的组装式 API(四)》

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
一条SQL更新语句是如何执行的?
这是图解MySQL的第2篇文章,这篇文章会通过一条SQL更新语句的执行流程让大家清楚地明白:
蝉沐风
2022/08/22
6080
一条SQL更新语句是如何执行的?
一条SQL是怎么执行的
对于写语句相对于读语句会稍微复杂,首先要知道MySQL的三个重要日志模块redo log(重做日志)、undo log(撤消日志)、binlog(归档日志),
闻说社
2024/12/12
910
一条SQL是怎么执行的
从Mysql架构看一条更新sql的执行过程
上一篇文章我们讲了一条查询sql时如何执行的. 今天我们继续来看下一条更新sql的执行流程.
架构狂人
2023/10/28
3750
从Mysql架构看一条更新sql的执行过程
一条Update语句的执行过程是怎样的?
这个问题大家在面试的时候大家都背过类似的题,而且网上也有很多答案,这里分享一个大致流程介绍,关于下图的介绍来自这里 执行一条 select 语句,期间发生了什么?。
小许code
2023/06/27
7140
一条Update语句的执行过程是怎样的?
一条 sql 的执行过程详解
如果这条sql是写操作(insert、update、delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以这里只说明 InnoDB 的引擎层过程。由于写操作较查询操作更为复杂,所以先看一下写操作的执行图。方便后面解析。
BUG弄潮儿
2020/12/17
1.3K0
一条 sql 的执行过程详解
一条更新sql的完整执行流程(超详细)
查询流程,我们是不是再研究下更新流程、插入流程和删除流程? 一条查询sql的完整执行流程(从连接到引擎,穿插涉及到的知识,超详细) 在数据库里面,我们说的update操作其实包括了更新、插入和删除。如果大家有看过MyBatis的源码,应该知道Executor里面也只有doQuery()和doUpdate。的方法, 没有 doDelete()和 dolnsert()。 更新流程和查询流程有什么不同呢? 取到数据前和查询的基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。 区别就在于拿到符合条件的数据之后的操作。 但是,要学习更新的执行流程,我们需要先知道以下几个名词的含义: 贴图镇此博客(
向着百万年薪努力的小赵
2022/12/02
5190
一条更新sql的完整执行流程(超详细)
详解一条查询select语句和更新update语句的执行流程
前面几篇MySQL系列的文章介绍了索引,事务和锁相关知识,那么今天就让我们来看看当我们执行一条select语句和一条update语句的时候,MySQL要经过哪些步骤,才能返回我们想要的数据。
用户2781897
2020/09/10
2.4K0
MySQL架构与执行流程
  MySQL数据库自己用了也有两三年了,基本上只是掌握增删改查的sql语句,从没有思考过MySQL的内部到底是怎么根据sql查询数据的,包括索引的原理,只知道加了索引查的就快,不知道为什么加上索引效率就会提升,包括索引的限制和优化也知之甚少,所以决定开一专题来学习与记录MySQL。
会说话的丶猫
2020/08/06
8540
MySQL架构与执行流程
面试官:你说说一条更新SQL的执行过程?
在上一篇《面试官:你说说一条查询SQL的执行过程?》中描述了Mysql的架构分层,通过解析器、优化器和执行引擎完成一条SQL查询的过程,那这一篇续上继续说明一条更新SQL的执行过程。
艾小仙
2021/08/25
4590
面试官:你说说一条更新SQL的执行过程?
字节三面:详解一条 SQL 的执行过程
天天和数据库打交道,一天能写上几十条 SQL 语句,但你知道我们的系统是如何和数据库交互的吗?MySQL 如何帮我们存储数据、又是如何帮我们管理事务?....是不是感觉真的除了写几个 「select * from dual」外基本脑子一片空白?金三银四读者福利:整理好的MySQL实战笔记,金三银四面试资料集锦。
Java程序猿
2021/02/23
4010
【我在拉勾训练营学技术】Mysql 架构原理
mysql 数据库作为现在互联网企业首选的数据库,我们程序员就应该对它多一些了解,我在拉勾训练营学到第五阶段啦,了解了mysql 整体架构,记录下来。
程序员爱酸奶
2021/03/21
5500
头条二面: 详解一条 SQL 的执行过程|文末送书
天天和数据库打交道,一天能写上几十条 SQL 语句,但你知道我们的系统是如何和数据库交互的吗?MySQL 如何帮我们存储数据、又是如何帮我们管理事务?....是不是感觉真的除了写几个 「select * from dual」外基本脑子一片空白?这篇文章就将带你走进 MySQL 的世界,让你彻底了解系统到底是如何和 MySQL 交互的,MySQL 在接受到我们发送的 SQL 语句时又分别做了哪些事情。
kunge
2021/01/28
8500
头条二面: 详解一条 SQL 的执行过程|文末送书
MySQL数据库:SQL语句的执行过程
我们的系统在和 MySQL 数据库进行通信前,需要先和数据库建立连接,而这个功能就是由MySQL驱动底层帮我们完成的,建立完连接之后,我们只需要发送 SQL 语句就可以执行 CRUD 了。如下图所示:
全栈程序员站长
2022/06/29
3.7K0
MySQL数据库:SQL语句的执行过程
【MySQL 系列】MySQL 架构篇
Server 层:负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接池,执行器、优化器、解析器、预处理器、查询缓存等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等)都在 Server 层实现;
栗筝i
2024/03/19
2.5K0
【MySQL 系列】MySQL 架构篇
MySQL架构分析
MySQL架构分析 MySQL 的体系结构 MySQL 的模块详解 **Connectors**:用于支持各种语言与 **SQL** 交互; **Management Services & Utili
编程之心
2021/07/14
6780
MySQL架构分析
MySQL中一条更新的SQL如何执行
MySQL 之 -- 一条更新的 SQL 如何执行,一条更新的 SQL 语句如何执行执行流程一条 SQL 的执行流程如图所示:(图片来源于网络) 如图所示:MySQL 数据库主要分为两个层级:服务层和存储引擎层服务层:server 层包括连接器、查询缓存、分析器、优化器、执行器,包括大多数 MySQL 中的核心功能所有跨存储引擎的功能也在这一层实现,包括存储过程、触发器、视图等。 执行流程 一条 SQL 的执行流程如图所示:(图片来源于网络) 如图所示: MySQL 数据库主要分为两个层级:服务层和存
码农编程进阶笔记
2021/11/01
1.3K0
MySQL中一条更新的SQL如何执行
MySQL 存储引擎(2)原
顾名思义,存储引擎就是用于存储我们的数据的。在关系型数据库中我们一般将数据库存放在表中(Table)。
兜兜毛毛
2020/04/23
5660
MySQL事务(三)InnoDB存储引擎下SQL执行的缓存机制
在 MySQL架构(二)SQL 更新语句是如何执行的?中,小鱼介绍了SQL 更新语句的执行流程,文章中考虑初次介绍MySQL 架构,涉及到服务层的流程并没有展开介绍。
鳄鱼儿
2024/05/28
3000
MySQL事务(三)InnoDB存储引擎下SQL执行的缓存机制
SQL语句执行过程详解
  如果这条sql是写操作(insert、update、delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以这里只说明 InnoDB 的引擎层过程。由于写操作较查询操作更为复杂,所以先看一下写操作的执行图。方便后面解析。
用户7353950
2022/05/11
2.4K0
SQL语句执行过程详解
MySQL架构(二)SQL 更新语句是如何执行的?
在上一篇文章中,我们从一个查询语句的执行流程知道了 MySQL 架构可分为 Server 层和存储引擎层,以及各个层级的具体部件。
鳄鱼儿
2024/05/21
3050
MySQL架构(二)SQL 更新语句是如何执行的?
推荐阅读
相关推荐
一条SQL更新语句是如何执行的?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档