聊一聊Vue和Ts

这篇具有很好参考价值的文章主要介绍了聊一聊Vue和Ts。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

Vue3 已经正式发布了一段时间了,各种生态已经成熟。最近使用 taro+vue3 重构冷链的小程序,经过了一段时间的开发和使用,有了一些自己的思考。

总的来说,Vue3 无论是在底层原理还是在实际开发过程中,都有了很大的进步。

从源码层面来说,使用 Proxy 代替 Object.defineProperty 的 API,一个是代理的对象,一个是递归监控的属性,从而在性能上有了很大的进步,并且,也解决了对象动态属性增加、数组改变监听上的缺陷;对 diff 算法进行优化,增加了静态标记,大大提高了 Vue 的执行效率;还有静态提升、事件监听缓存等一系列提升效率的手段。

从应用层面来说,主要的改变是将 option API 改成了 composition API(组合式 API),在业务中抛弃 data、methods、生命周期函数隔离开的开发方式,使代码相对于业务有更强的聚合性,在代码开发、代码阅读、代码维护方面对于开发者都是更加友好。

对于 typescript 有了更好的支持,我们知道,对于大型的前端项目来说,使用 typescript 的类型校验,能使前端项目有更强的健壮性,这也使得 Vue3 对于大型项目的开发提供了更强的质量保证。

2 组合式 API

所谓的组合式 API,将 Vue2 中的 data、methods、生命周期、数据监听等 option,都封装成钩子函数,然后组合到 setup 函数中,其核心就在于 setup 函数。setup 函数存在的意义,就是为了使用这些新增的组合式 API,并且这些 API 只能在 setup 函数中使用。

setup 函数执行的时机是,props 初始化之后,beforeCreate 函数执行之前,所以在执行 setup 时,还没有初始化 Vue 实例,因此在 setup 中不能使用 this 对象。setup 函数的返回值会被注入到 Vue 实例中,供 Vue 组件使用,所以任何数据想在 Vue 组件的模板中使用,必须在 setup 函数中 return 出去。

组合式 API 的组合,体现在两个层面。第一层的意思是,将某一业务相关数据和处理逻辑放到一起,这是一种关注点的聚合,更方便我们编写代码、处理业务逻辑,并且能更聚焦业务逻辑,更方便我们看代码。第二层面的意思,当某个组件的业务逻辑足够复杂,setup 中的代码足够大的情况下,我们可以在 setup 内部,进一步提取相关的一块业务,使代码逻辑更加清晰,做到了进一步的聚合作用。

如下面代码所示,将业务代码块 A 抽出来,则代码块 A 中 return 出来的数据就可以在组件中使用:

// 组件
import functionA from 'A'
export default defineComponent({
name: 'componentName',
setup() {
...functionA()
}
})
// 代码块A
export default () => {
return {
a: 1
}
}

3 响应式 API

在 Vue3 中响应式 API,主要体现在 ref 和 reactive 两个函数。对于响应式 API,想说两个问题,第一个是为什么要增加响应式 API,第二个是响应式 API 函数 ref 和 reactive 的异同点。

3.1 为什么增加响应式 API

在 Vue2 中所有数据都写在 data 的 option 中,data 中的数据都是响应式的,这样产生的一个问题是,有些常量数据本身不需要监听,从而造成了资源的浪费。所以在 Vue3 中增加了响应式 API,只需要对需要动态更新 dom 的数据进行响应式,不需要动态更新 dom 的数据不进行响应式处理,从很大程度上节省了资源。这里我觉得需要注意的是,写代码的时候一定要仔细思考一下,哪些数据需要进行响应式绑定,哪些数据不需要进行响应式绑定,而不是一股脑的全给绑定上,这样即使代码逻辑不能很清晰易懂,并且也会影响执行效率(写惯了 Vue2 的同学需要注意)。

3.2 ref 和 reactive 的异同点

在了解了为什么要增加响应式 API 后,我们发现 Vue3 提供了两个响应式 API 函数,ref 和 reactive。为什么会提供两个 API 呢? 一个不就可以了吗?那么这两个 API 之间的区别是什么呢?

在使用层面,ref 绑定的数据,需要使用 [data].value 进行数据更改。而 reactive 绑定的数据需要使用 [data].[prpoerty] 的方式进行数据更改。在使用场景方面,一般的,单个的普通数据,我们使用 ref 来定义响应式。而复杂数据,如:表单数据对象、某一模块的一组数据等,使用 reactive 来定义响应式。

那么,对象是不是必须用 reactive 来定义呢? 其实不是的,都可以。官方说法是:可以根据自身习惯使用不同的 API。其实,我觉得,他们是有各自的使用场景的,ref 更强调的是数据 Value 的改变,reactive 更强调的是数据中某一属性的改变。

4 treeShaking 思想

当 Javascript 项目达到一定体积时,将代码分成模块会更易于管理。但是,当这样做时,我们最终可能会导入实际上未使用的代码。Tree Shaking 是一种通过消除最终文件中未使用的代码来优化体积的方法。

Vue3 使用了 tree shaking 的方法,将组件以及其所有的生命周期函数等方法进行分开,如果在组件中使用的代码将不会出现在最终的打包文件中,如此,会减少大大 Vue3 项目的打包体积。由此造成的一个结果就是,使用方法的不同。

4.1 生命周期函数的使用方法

import { defineComponent, ref, onMounted } from 'vue';
export default defineComponent({
name: 'Gift',
setup() {
const counter = ref(0);
onMounted(() => {
// 处理业务,一般进行数据请求
})
return {
counter
}
}
})

4.2 Vuex 的使用方法

import { useStore } from "vuex";
import { defineComponent, ref, computed } from 'vue';
export default defineComponent({
name: 'Gift',
setup() {
const counter = ref(0);
const store = useStore();
const storeData = computed(() => store); // 配合computed,获取store的值。
return {
counter,
storeData
}
}
})

4.3 Router 的使用方法

import { useStore } from "vuex";
import { useRouter } from "vue-router";
import { defineComponent, ref, computed } from 'vue';
export default defineComponent({
name: 'Gift',
setup() {
const counter = ref(0);
const router = useRouter();
const onClick = () => {
router.push({ name: "AddGift" });
}
return {
counter,
onClick
}
}
})

5 关于 Typescript 的使用

这一部分是关于 Ts 的内容,不过它与 Vue3 的开发息息相关。Vue3 整体是使用 Ts 写的,因此,开发 Vue3 的项目需要使用 Ts,所以,我们还是要了解 TS 的。

关于 Ts 的使用这里就不在细说了,在这里想说的的是,在实际业务场景中是如何组织 Ts 代码的。通过对 TS 的大量使用,我的一个体会是:Ts 的核心思维是先关注数据结构,在根据数据结构进行页面开发。而以前的前端开发模式是,先写页面,然后再关注数据。

比如说,我们要开发一个页面,我们可能需要先定义一些 interface。开发页面的时候我们要关注:页面数据的 interface、接口返回数据的类型、请求参数的类型等等。

下面是开发一个列表页面的例子:

// 这是列表中每一项的数据类型
interface IDataItem {
id: string | number;
name: string;
desc: string;
[key: string]: any;
}

// 接口返回值类型, 一般来说,我们不确定接口返回的数据的类型,因此使用泛型
interface IRes<T> {
code: number;
msg: string;
data: T
}

// 口返回数据类型定义
interface IDataInfo {
list: Array<IDataItem>;
pageNum: number;
pageSize: number;
total: number;
}

// 请求
export const getDatalist = (
params: Record<string, any>
): Promise<IRes<IDataInfo>> => {
return Http.get("/api/data/list", params);
};

如上面代码,当我们的 interface 定义完成后,我们的页面数据基本都已清楚,直接写页面就会清晰很多,且出错概率会大大降低。文章来源地址https://www.toymoban.com/news/detail-401849.html

到了这里,关于聊一聊Vue和Ts的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 聊一聊synchronized

    在 Java 中, synchronized 可以用于实现线程同步,有以下几种常见的使用方式: 修饰代码块:将 synchronized 放在代码块的前面, 例如: 在这种方式下,会为给定的对象 obj 获取锁,在代码块执行期间,只有持有该锁的线程才能进入代码块执行。 修饰方法:将 sync

    2024年01月22日
    浏览(61)
  • 聊一聊 TLS/SSL

    哈喽大家好,我是咸鱼 当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 \\\"https://\\\" 开头 这意味着我们正在使用 TLS/SSL 协议进行安全通信。虽然它可能看起来只是一个小小的锁图标和一个 “https” ,但实际上,这个协议在保护我们的在线隐私和安

    2024年02月08日
    浏览(52)
  • 聊一聊模板方法模式

    统一抽取,制定规范; 模板方法模式,又叫模板模式,属于23种设计模式中的 行为型模式 。在抽象类中公开定义了执行的方法,子类可以按需重写其方法,但是要以抽象类中定义的方式调用方法。总结起来就是: 定义一个操作的算法结构,而将一些步骤延迟到子类中。在不

    2024年02月04日
    浏览(52)
  • 聊一聊AIGC

    “UGC不存在了”——借鉴自《三体》 ChatGPT 的横空出世将一个全新的概念推上风口——AIGC( AI Generated Content)。 GC即创作内容(Generated Content),和传统的UGC、PGC,OGC不同的是,AIGC的创作主体由人变成了人工智能。 xGC PGC:Professionally Generated Content,专业生产内容 UGC:User G

    2024年02月10日
    浏览(61)
  • 聊一聊大模型

    事情还得从ChatGPT说起。 2022年12月OpenAI发布了自然语言生成模型ChatGPT,一个可以基于用户输入文本自动生成回答的人工智能体。它有着赶超人类的自然对话程度以及逆天的学识。一时间引爆了整个人工智能界,各大巨头也纷纷跟进发布了自家的大模型,如:百度-文心一言、科

    2024年02月05日
    浏览(55)
  • 聊一聊适配器模式

    接口不能用?行,我帮你适配 适配器模式(Adapter),是23种设计模式中的 结构型模式 之一;它就像我们电脑上接口不够时,需要用到的拓展坞,起到转接的作用。它可以将新的功能和原先的功能连接起来,使由于需求变动导致不能用的功能,重新利用起来。 上图的Mac上,只

    2024年02月04日
    浏览(50)
  • 聊一聊mysql中的间隙锁

    间隙锁在mysql中经常使用到,今天就聊一聊mysql的间隙锁的内容。 间隙锁是为了解决幻读的问题,并且在当前读的场景下解决的。 当前读包含:update,delete,insert,select…lock in share mode,select…for update 一基本概念 1、行锁:给某一行进行加锁 2、间隙锁:两个值之间的间隙,为解

    2024年02月12日
    浏览(43)
  • 聊一聊nginx中KeepAlive的设置

    之前工作中遇到一个KeepAlive的问题,现在把它记录下来,场景是这样的: 从上图可以看出,用户通过Client访问的是LVS的VIP, VIP后端挂载的RealServer是Nginx服务器。 Client可以是浏览器也可以是一个客户端程序。一般情况下, 这种架构不会出现问题,但是如果Client端把请求发送给

    2024年02月01日
    浏览(59)
  • 聊一聊Java抽象同步队列AQS

    AQS是锁的底层支持 由该图可以看到,AQS是一个FIFO的双向队列,其内部通过节点head和tail记录队首和队尾元素,队列元素的类型为Node。其中Node中的thread变量用来存放进入AQS队列里面的线程;Node节点内部的SHARED用来标记该线程是获取共享资源时被阻塞挂起后放入AQS队列的,EX

    2024年02月16日
    浏览(44)
  • 聊一聊.NET的网页抓取和编码转换

    在本文中,你会了解到两种用于 HTML 解析的类库。另外,我们将讨论关于网页抓取,编码转换和压缩处理的知识,以及如何在 .NET 中实现它们,最后进行优化和改进。 有了 Copilot 的加持,可以让我们快速的完成开发任务,并在极短的时间内完成小工具的开发。谁能想到现如今

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包