Vue3组合式API+TypeScript写法入门

文章目录

  • 前言
  • 1.reactive
  • 2.ref
  • 3.props
  • 4.computed
  • 5.emit
  • 6.watch
  • 总结


前言

参考Vue3官网.
本篇以组合式API为例, 但不包含setup语法糖式写法.

原本打算结合class-component, Vue3不推荐就不用了: OverView|Vue Class Component.
而且是不再推荐基于类的组件写法, 推荐单文件组件, 组合式 API和setup语法糖.

在这里插入图片描述

而且这个库也好久没更新了: vue-class-component npm

在这里插入图片描述


1.reactive

可以选择使用多个reactive来保存状态.
但reactive只接受对象类型, 分开写势必要面临非对象类型数据的响应式处理问题.

你尽可以把它塞到一个对象里, 就像这样:

type asd = number;
const a = reactive<{ a: asd }>({ a: 1 });
consoel.log(a.a);

个人推荐用ref处理, 接受非对象类型:

type Count = number;
const count = ref<Count>(0);

不管怎么写都得给reactive下的每个属性规定类型, 这些类型之间可以互相引用
分开写的话就不需要组合一个约束整个reactive的接口, 约束每个值就可以了:

setup() {interface Book {title: string;}interface Info {id: number;book: Book}const book = reactive<Book>({ title: "Vue" }); // 在赋值时指定类型const info: Info = reactive({ id: 2, book: book }); // 在创建变量时指定类型const addToDo = function (todo: Info): void { // 函数要注明参数和返回值类型};
}

合起来写的情况下需要给reactive定义接口:

setup() {type Finished = number;type Still = number;interface Info {id: number;title: string;isCompleted: boolean;}interface react {finished: Finished;still: Still;todos: Info[];}const state = reactive<react>({finished: 0,still: 3,todos: [{ id: 1, title: "task0", isCompleted: false },{ id: 2, title: "task1", isCompleted: true }],});
}

也可以选择不给reactive定义接口, 那就得挨个定义reactive内属性的类型, 我不知道这样写是否规范:

setup() {type Finished = number;type Still = number;interface Info {id: number;title: string;isCompleted: boolean;}const state = reactive({finished: <Finished> 0,still: <Still> 3,todos: <Info[]> [{ id: 1, title: "task0", isCompleted: false },{ id: 2, title: "task1", isCompleted: true }],});
}

2.ref

对于非对象类型数据, 依然推荐使用ref处理:

export default defineComponent({setup() {let still = ref<Still>(3);let finished = ref<Finished>(0);let todos = ref<TaskInfo[]>([{ id: 0, title: "task0", isCompleted: false },{ id: 1, title: "task1", isCompleted: true },]);}
});

可以选择引入Vue自带的Ref类型, 这并不会影响其他地方对该值的接收, 比如const a: Ref<string> = ref('3'); a.value依然可以作为string类型的参数.

import type { Ref } from 'vue';export default defineComponent({setup() {let still: Ref<Still> = ref(3);let finished: Ref<Finished> = ref(0);let todos: Ref<TaskInfo[]> = ref([{ id: 0, title: "task0", isCompleted: false },{ id: 1, title: "task1", isCompleted: true },]);}
});

3.props

很遗憾在不使用setup语法糖的情况下Composition API的props并不能接受一个接口, 如下方式不被允许:

interface Book {page: number;id: number
}
interface propsInterface { book: Book,a: Function
}setup() {props: <propsInterface> { // 此处标红, <propsInterface>不能加在此处book: {type: Object,require: true}a: {type: Function,require: true}} 
}

所以就不要接口了, 用文档推荐的方法, 简单类型的type直接写, 复杂类型在类型后面加as PropType<???>来做进一步的描述:

interface Title {a: number;s: string;
}export default defineComponent({name: "Item",props: {id: {type: Number,require: true,},title: {type: Object as PropType<Title>,require: true,},isCompleted: {type: Boolean,require: true,},deleteToDo: {type: Function as PropType<(id: number) => void>, // 进一步描述函数require: true,},finish: {type: Function as PropType<(id: number, complete: boolean) => void>, // 进一步描述对象require: true,}}
})

4.computed

参考文档用例:

setup(props) {const getId = computed<number>(() => { // 计算属性return props.id;});const isCompleted = computed<boolean>({ // 可写计算属性get(): boolean {return props.isCompleted;},set(): void {props.finish!(props.id!, props.isCompleted);},});return {getId,isCompleted,};
}

5.emit

type.ts:

export type Answer = string;

子组件:

<template><div class="todo-header"><inputtype="text"@keyup.enter="pressEnter"@keyup.esc="pressESC"/></div>
</template>
emits: ["enter", "esc"],
setup() {const pressEnter = function () {const hq: Answer = "press Enter";emit("enter", hq);};const pressESC = function () {const nq: Answer = "press ESC";emit("esc", nq);};return {pressEnter,pressESC,};
}

父组件:

<template><div><Header @esc="pressESC" @enter="pressEnter" /></div>
</template>
setup() {const pressEnter = function (answer: Answer): void {console.log(answer);};const pressESC = function (answer: Answer): void {console.log(answer);};return {pressEnter,pressESC,};
}

6.watch

<template><div><p>Counter: {{ counter }}</p><button @click="incrementCounter">Increment</button></div>
</template>
setup() {interface Counter = number;const counter = ref<Counter>(0);const incrementCounter = (): void => {counter.value++;};// 使用 watch 函数观察 counter 的变化watch(counter, (newValue, oldValue) => {console.log(`counter changed from ${oldValue} to ${newValue}`);}, { deep: true });return {counter,incrementCounter,};
}

总结

如果有漏掉的部分, 以后会补充.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android App 持续集成性能测试:启动流量

目录 前言&#xff1a; get app UID 获取流量数据 获得启动流量数据 总结 前言&#xff1a; Jenkins 是一种开源的持续集成工具&#xff0c;可以帮助我们更加方便地进行软件开发和测试工作。通过 API 远程管理 Jenkins 可以帮助我们更加方便地进行 Jenkins 的配置和管理工…

react实现路由跳转动画

下载插件 npm i react-transition-group 配置路由 import { createBrowserRouter as ReactRouter,Navigate } from "react-router-dom";import App from ../App.js import Login from "../view/login.js"; import Home from "../home.js"; co…

了解 3DS MAX 3D摄像机跟踪设置:第 4 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合成。 将“宽度”和“高度”值分别设置为 1280 和 720。将帧速率设置为 25&#xff0c;将持续时间设置为 12 秒。单…

Flask 文件上传,删除上传的文件

目录结构 app.py from flask import Flask, request, render_template, redirect, url_for import osapp Flask(__name__) BASE_DIR os.getcwd() UPLOAD_FOLDER os.path.join(BASE_DIR, testfile)app.route(/) def home():files os.listdir(UPLOAD_FOLDER)return render_t…

欧盟新规,燃油噩梦?2025年起,高速公路每60公里设立一处快充站

根据外媒The Verge报道&#xff0c;欧洲电动汽车用户将获得更多便捷的待遇&#xff0c;同时还能减少有害温室气体排放&#xff0c;这得益于欧盟理事会最新通过的法规。 根据欧盟的法规要求&#xff0c;自2025年起&#xff0c;TEN-T高速公路系统在欧洲将需要每隔60公里设立一座高…

Langchain 和 Chroma 的集成

Langchain 和 Chroma 的集成 1. Chroma2. 基本示例​3. 基本示例(包括保存到磁盘)4. 将 Chroma Client 传递到 Langchain ​5. 基本示例(使用 Docker 容器)6. 更新和删除7. 带分数的相似性搜索​ 1. Chroma Chroma 是一个人工智能原生开源矢量数据库&#xff0c;专注于开发人员…

ES6基础知识六:你是怎么理解ES6中 Promise的?使用场景?

一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;回调函数&#xff09;更加合理和更加强大 在以往我们如果处理多层异步操作&#xff0c;我们往往会像下面那样编写我们的代码 doSomething(function(resu…

[ 容器 ] Harbor 私有仓库的部署与管理

目录 一、什么是Harbor二、Harbor的特性三、Harbor的构成四、Harbor 部署五、关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数六、维护管理Harbor 一、什么是Harbor Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户…

jQuery的DOM操作之笔记总结

jQuery的DOM操作之笔记总结 首先我们来介绍一下什么是DOM 简述&#xff1a; 1.DOM全称Document Object Model&#xff08;文档对象模型&#xff09;。 2.每个文档都是一棵DOM结构的树&#xff0c;文档里的很多元素&#xff0c;就像树上的很多节点&#xff0c;或是分叉的树枝…

知识库数据导出为excel-使用JavaScript实现在浏览器中导出Excel文件

我们智能客服知识库机器人已经开发完成&#xff0c;后端数据库是使用的qdrant向量数据库&#xff0c;但是该数据库并没有导出备份功能&#xff0c;所以我按简单的纯前端实现知识库导出excel数据 使用第三方库(如SheetJS) SheetJS是一个流行的JavaScript库&#xff0c;可帮助处理…

腾讯云 Cloud Studio 实战训练营——快速构建React完成点餐H5页面

目录 ​编辑 一、前言 1、什么是腾讯云 Cloud Studio 2、本文实验介绍 二、前期准备工作 1、注册 Cloud Studio 2、初始化工作空间 三、开发一个简版的点餐系统页面 1、安装依赖 1.1、安装 antd-mobile 1.2、安装 less 和 less-loader 1.3、暴露 webpack 配置文件 …

OpenCV实现照片换底色处理

目录 1.导言 2.引言 3.代码分析 4.优化改进 5.总结 1.导言 在图像处理领域&#xff0c;OpenCV是一款强大而广泛应用的开源库&#xff0c;能够提供丰富的图像处理和计算机视觉功能。本篇博客将介绍如何利用Qt 编辑器调用OpenCV库对照片进行换底色处理&#xff0c;实现更加…

Stable Diffusion生成艺术二维码

Stable Diffusion生成艺术二维码 文章会有浏览问题&#xff0c;点击此处查看原文 首先需要一个Stable Diffusion服务环境&#xff0c;《Stable Diffusion服务环境搭建&#xff08;远程服务版&#xff09;》如果你已经有了那就忽略 一、准备一个比较好的二维码底图 首先解析二…

STC12C5A系列单片机片内看门狗的应用

wdt.c #include "wdt.h"void wdt_init(void) {WDT_CONTR 0x24; // 0010 0100 - 1.1377s }void wdt_feed(void) {WDT_CONTR | 0x10; // 喂狗 }wdt.h #ifndef _WDT_H_ #define _WDT_H_#include "stc12c5a60s2.h"// 函数声明 extern void wdt_init(void); …

uniapp开启消息通知/提示(使用uniPush)

亲爱的小伙伴们&#xff0c;最近对uniPush有稍许研究&#xff0c;当前研究出一些心得&#xff0c;现在分项给大家&#xff0c;希望对大家的uniapp之路有所帮助。本次的教程是教会你如何使用uniPush自定义消息通知&#xff0c;同时还附带添加消息提示音添加&#xff0c;多的不说…

【Spring MVC学习】连接 接收请求参数 响应返回参数

目录 前言&#xff1a;认识Spring MVC &#x1f337;1、什么是MVC&#xff1f; 一、建立连接&#xff08;5个注解&#xff09; &#x1f337;1、RequestMapping注解:注册接⼝的路由映射&#xff08;默认返回页面&#xff09; &#x1f337;2、ResponseBody注解&#xff1a…

unity调用c++dll时变量处理问题

在C中为了处理方便可以将有些局部变量变为全局变量。 以下面三个变量为例 如果还有新全局变量需要这其来赋值&#xff0c;就会有问题。 如下面的body1_ptr为了dll生成处理方便&#xff0c;变为全局变量后&#xff0c;这个指针变赋值就会有问题。 因为geometry_path这个只在调…

Ubuntu22.04上部署Lua开发环境

需求背景 想在Ubuntu22.04上搭建一下Lua的开发环境&#xff0c;其实步骤比较简单的&#xff0c;此文章也适用于Ubuntu主机环境搭建Lua,如果想在在Ubuntu内部署一个容器&#xff0c;然后在容器内搭建Lua的环境&#xff0c;可以先参考容器的创建过程 ubuntu22.04上如何创建有pri…

字节抖音小程序,使用 uniapp 调起内置支付

字节抖音小程序&#xff0c;使用 uniapp 调起内置支付 第一步&#xff1a;提交订单 后端通过抖音预下单接口&#xff0c;提交支付订单信息。 预下单接口_小程序_抖音开放平台预下单接口 提交支付订单信息。 ## 使用限制 无 ## 接口说明 预下单接口需要保证同一app_id下每笔订…

Linux6.15 Docker 私有仓库(harbor)

文章目录 计算机系统5G云计算第四章 LINUX Docker 私有仓库&#xff08;harbor&#xff09;一、搭建本地私有仓库二、Docker--harbor私有仓库部署与管理1.Harbor 简介1&#xff09;什么是Harbor2&#xff09;Harbor的特性3&#xff09;Harbor的构成 2.Harbor 部署1&#xff09;…