vue3+ts 实际开发中 如何书写 vue3 语法

TS+Vue项目语法 创建组件(分3步) 1、引入核心文件 2、@Component装饰器 3、暴露组件并继承vue的基类(其中One为组件名) <script lang="ts"> import {Vue,Component} from "vue-property-decorator" @Component({}) export default class One extends Vue{} </script> 使用组件(分3步) 1、引入组件 2、在装饰器中,注册组件 3、通过标签. 阅读详情

vue3语法的发展

  1. Vue3 在早期版本( 3.0.0-beta.21 之前)中对 composition api 的支持,只能在组件选项 setup 函数中使用。
  2. 在 3.0.0-beta.21 版本中增加了 <script setup> 的实验特性。如果你使用了,会提示你 <script setup> 还处在实验特性阶段。
  3. 在 3.2.0 版本中移除<script setup> 的实验状态,从此,宣告 <script setup> 正式转正使用,成为框架稳定的特性之一。

所以我们现在直接就开始使用3.2.0之后的写法

优势

与组件选项 setup 函数对比, <script setup> 的优点:

  1. 更少、更简洁的代码,不需要使用 return {} 暴露变量和方法了,使用组件时不需要主动注册了;
  2. 更好的 Typescript 支持,使用纯 Typescript 声明 props 和抛出事件,不会再像 option api 里那么蹩脚了;
  3. 更好的运行时性能;
    当然, <script setup> 也是有自己的缺点的,比如需要学习额外的 API。

Composition Api类型约束

<script setup lang="ts">
import { ref, reactive, computed } from 'vue'
 
type User = { 
  name: string
  age: number
}
 
// ref
const msg1 = ref('')  //  会默认约束成 string 类型,因为ts类型推导
const msg2 = ref<string>('')  //  可以通过范型约束类型
const user1 = ref<User>({ name: 'tang', age: 18 })  //  范型约束
const user2 = ref({} as User)  // 类型断言
 
// reactive
const obj = reactive({})
const user3 = reactive<User>({ name: 'tang', age: 18 })
const user4 = reactive({} as User)
 
// computed
const msg3 = computed(() => msg1.value)
const user5 = computed<User>(() => {
  return { name: 'tang', age: 18 }
})
</script>

编译器宏

编译器宏(compiler macros) 有:defineProps、defineEmits、withDefaults、defineExpose 等。

编译器宏只能在 <script setup> 块中使用,不需要被导入,并且会在处理 <script setup> 块时被一同编译掉。

编译器宏必须在 <script setup> 的顶层使用,不可以在 <script setup> 的局部变量中引用

defineProps

在 <script setup> 块中是没有组件配置项的,也就是说是没有 props 选项,需要使用 defineProps 来声明 props 相关信息。defineProps 接收的对象和组件选项 props 的值一样。

我这边引用了pug 如果需要安装一下就可以直接使用 <template lang="pug">
好处可以减少代码量 层次也清楚

npm install pug
// componentA.vue 组件
<template lang="pug">
div
    div {{`我的名字是${name},今年${age}`}}
    div(v-for="item in list",:key="item.name") {{`我的名字是${item.name},今年${item.age}`}}
</template>
<script setup lang="ts">
interface item {
    name: string,
    age: string
}
const props = defineProps<{
    name: string,
    age: string,
    list?: item[] // ?非必传参数
}>()
</script>
// home.vue 页面
<template lang="pug">
.mainBg
    componentA(:name="name",:age="age", :list="list")
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import componentA from '@/components/componentA.vue';
let name = ref('')
const age = ref('')
const list = ref(
    [
        {
            name: '张三',
            age: '20'
        },
        {
            name: '李四',
            age: 18
        },
        {
            name: '王五',
            age: 25
        },
    ]
)
<style lang="scss">
.mainBg {
    padding: 10px;
}
</style>

这时候是可以看到TS写法里面 name和age是没有定义默认值
页面效果
在这里插入图片描述
Vue3 为我们提供了 withDefaults 这个编译器宏,给 props 提供默认值

// componentA.vue 组件
<template lang="pug">
div
    div {{`我的名字是${name},今年${age}`}}
    div(v-for="item in list",:key="item.name") {{`我的名字是${item.name},今年${item.age}`}}
</template>
<script setup lang="ts">
interface item {
    name: string,
    age: string
}
interface Props {
    name: string,
    age: string,
    list?: item[]
}
const props = withDefaults(defineProps<Props>(),{
    name: "小cc",
    age: "18",
    list: ()=> []
})
</script>

在这里插入图片描述

这边给它定义默认值之后保存 看页面发现还是没有把默认值展示出来
这是因为我们在home页面给name和age用ref赋值的时候给了 ‘ ’ 所以他把空当成了默认值就没有展示withDefaults里面给的默认值 这时候我们把name和age写成
let name = ref() const age = ref()
在这里插入图片描述
还有一种情况 当不给props定义默认值的时候 传参也是为空时
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

defineEmits

一样的,在 <script setup> 块中也是没有组件配置项 emits 的,需要使用 defineEmits 编译器宏声明 emits 相关信息。

// componentA.vue 组件
<template lang="pug">
div
    div {{`我的名字是${name},今年${age}`}}
    //- div(v-for="item in list",:key="item.name") {{`我的名字是${item.name},今年${item.age}`}}
    el-button(type="primary",@click="setName") 向父组件发送 name
    el-button(type="primary",@click="setAge") 向父组件发送 age
</template>
<script setup lang="ts">
interface item {
    name: string,
    age: string
}
interface Props {
    name: string,
    age: string,
    list?: item[]
}
const props = withDefaults(defineProps<Props>(),{
    name: "小cc",
    age: "18",
    list: ()=> []
})
const emits = defineEmits<{
    (e: 'changeName', value: string) : void,
    (e: 'changeAge', value: string) : void,
}>()
const setName = () => {
    emits('changeName', '小橙子')
}
const setAge = () => {
    emits("changeAge", "28")
}
</script>
// home.vue
<template lang="pug">
.mainBg
    componentA(:name="name",:age="age", :list="list", @changeName="changeName",@changeAge="changeAge")
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import componentA from '@/components/componentA.vue';
let name = ref('')
const age = ref('')
const list = ref(
    [
        {
            name: '张三',
            age: '20'
        },
        {
            name: '李四',
            age: 18
        },
        {
            name: '王五',
            age: 25
        },
    ]
)
const changeName = (val: string) => {
    name.value = val
}
const changeAge = (val: string) => {
    age.value = val
}
<style lang="scss">
.mainBg {
    padding: 10px;
}
</style>

在这里插入图片描述
点击后
在这里插入图片描述

defineExpose

在 Vue3 中,默认不会暴露任何在 <script setup> 中声明的绑定,即不能通过模板 ref 获取到组件实例声明的绑定。

Vue3 提供了 defineExpose 编译器宏,可以显式地暴露需要暴露的组件中声明的变量和方法。

这个情况的场景父组件需要直接调用子组件内部的方法或者修改子组件里的值时,需要将方法或值通过defineExpose暴露才能操作

// componentB.vue
<template lang="pug">
div
    h1 组件B
    h1 {{msg}}
</template>
<script setup lang="ts">
import {ref} from 'vue'

const msg = ref('今天天气不怎么好')

const changeMsg = (v: string) => {
    msg.value = v
}

// 对外暴露的属性 需要用ref 调用子组件方法是需要把方法暴露出去
defineExpose({
  msg,
  changeMsg,
})
</script>
<template lang="pug">
.mainBg
    el-button(type="primary",@click="handleChangeMsg") 组件B
    componentB(ref="root")
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import componentB from '@/components/componentB.vue';
const root = ref<any>(null)
const handleChangeMsg = () => {
    root.value.changeMsg("果然 下雨了")
}
</script>


<style lang="scss">
.mainBg {
    padding: 10px;
}
</style>

在这里插入图片描述
在这里插入图片描述
如果把defineExpose注释掉
在这里插入图片描述
在这里插入图片描述
由于没有把这个方法暴露出来 导致找不到这个方法 changeMsg is not a function

Vue(十六):Vue3+ts 入门 Vue3项目构建动态参数lodash计算属性侦听器 (watch、watchEffect)v-for在组件上使用 v-for复选框、选择框、lazy、numberAttribute在组件上使用 v-model插槽祖孙组件传值(provide、inject)动态组件异步组件(defineAsyncComponent、Suspense)模板引用ref生命周期setup、ref、toRef、toRefsMixinTeleportcustomRefreadonly、shallowReadonlyshallowRea 阅读详情

相关推荐

【vue3学习P5-P10】vue3语法;vue响应式实现

vue3语法,vue3响应式的实现

倚树探星的博客 1985

vue3中ts写法

ref可看作给目标源的value增加一个属性,并且要标注清楚属性类型。reactive可以看作是目标源固有的属性。reactive可以多个同时声明。interface仅可适用对象。type可适用很多类型。

Ybittersweet的博客 1387

Vue3+TS笔记

vue3+ts基础通关手册

2403_88110114的博客 1723

VUE3与TS结合写法详解

car?: string}>()}>()项目中安装的第三方库里面都是打包后的JS代码,但是我们使用的时候却有对应的TS类型提示,这是因为在第三方库中的JS代码都有对应的TS类型声明文件。通俗地来讲,在 TypeScript 中以 .d.ts 为后缀的文件,我们称之为 TypeScript类型声明文件。它的主要作用是描述 JavaScript 模块内所有导出成员的类型信息。.ts 文件:既包含类型信息又可执行代码可以被编译为 .js 文件,然后,执行代码用途:编写程序代码的地方。

2301_77456141的博客 1万+

vue3 script setup 语法糖用了才知道有多爽 (一)

vue3 script setup 语法糖用了才知道有多爽 (一) script setup的分析和使用

YZRHANYU的博客 5434

Vue3通透教程【十七】Vite构建TS版本Vue项目

本系列将带领大家学习Vue3+TS+vite构成的前端工程化内容,本篇文章重点带领大家搭建Vue3+Ts版本项目!

商务合作欢迎私信我 4万+

vue3用必须用ts开发吗,vue的ts和js相互结合

CompositionAPI可以更好的逻辑复用和代码组织,同一功能的代码不至于像以前一样太分散,虽然Vue2中可以用minxin来实现复用代码,但也存在问题,比如方法或属性名会冲突,代码来源也不清楚等_?这个和我们CSS离的Less或者Sass是很像的,我们用更好的代码编写方式来进行编写,最后还是友好生成原生的JavaScript语言。3、新增了一个views文件夹。这个和我们CSS离的Less或者Sass是很像的,用更好的代码编写方式来进行编写,最后还是友好生成原生的JavaScript语言。

神器榜 1万+

Vue3通透教程【十八】TS为组件的props标注类型

通过TS语法来编写组件的props方法

商务合作欢迎私信我 4万+

vue3项目中引入ts

基于vue3项目的基础上引入ts

一缕阳光@的博客 2万+

Vue3通透教程【十六】TS编译配置

掌握TS编译配置,让我们的更好的TS编码体验

商务合作欢迎私信我 8万+

Vue3通透教程【十五】补充TS开发环境搭建问题

凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是 Vue 框架之所以火起来的原因,和 Vue 框架相比其他框架的巨大优势,有兴趣的伙伴可以看一下Vue框架背后的故事尤大大对前端生态是这样看的。

商务合作欢迎私信我 2万+

ts基础语法

一.vue中怎么使用ts 使用ts的vue项目,和js项目结构是类似的,多了几个文件 tsconfig.json: typescript配置文件,主要用于指定待编译的文件和定义编译选项 shims-tsx.d.ts: 允许.tsx 结尾的文件,可在 Vue 项目中编写 jsx 代码 shims-vue.d.ts: 主要用于 TypeScript 识别.vue 文件,Ts 默认并不支持导入 vue 文件 结合vue-property-decorator使用ts 在 vue 中使用 typescript

口袋的天空的博客 1万+

Vue3通透教程【十二】TS类型声明优势

众所周知的ts为强类型,这样的好处是什么?这篇文章为大家揭晓

商务合作欢迎私信我 2万+

用 vite 构建 vue3 + TS 项目实战

1、项目初始化 npm install create-vite@2.9.0 -g // 全局安装 create-vite npm init @vitejs/app shop-admin // 初始化项目(shop-admin 项目名) cd shop-admin npm install npm run dev 2、eslint 基础配置 npm install eslint --save-dev npm install@eslint/create-confi...

weixin_37883657的博客 1万+

Vue3通透教程【十六】TS自动编译

凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是 Vue 框架之所以火起来的原因,和 Vue 框架相比其他框架的巨大优势,有兴趣的伙伴可以看一下Vue框架背后的故事尤大大对前端生态是这样看的。

商务合作欢迎私信我 2万+

vue3-vite-ts:学习vue3的新属性的同时,尝试ts的写法

vue3-vite-ts 学习vue3的新属性的同时,尝试ts的写法

vue3+ts的基础语法

vue3和ts的基础语法

weixin_61607556的博客 948

电路仿真软件PSIM简介

PSIM的基本使用操作...

qq_55203246的博客 7180

Vue3+TS快速上手

文章目录一、TypeScript快速上手初识TypeScript安装TypeScript第一个TypeScript程序TypeScript常用语法基础类型接口类 一、TypeScript快速上手 初识TypeScript TypeScript 是 JavaScript 的一个超集,主要提供了类型系统和对 ES6+ 的支持,它由 Microsoft 开发,代码开源于 GitHub上 安装TypeScript 命令行运行如下命令,全局安装TypeScript: npm install -g typescript

蜡笔小星的博客 8894

MT25QL256完整操作指南:从ID读取到4KB扇区擦除(附华大SPI例程)

本文提供了MT25QL256 NOR FLASH在华大MCU上的完整驱动开发指南。内容涵盖从SPI初始化、器件ID读取、状态寄存器查询,到核心的页编程和4KB扇区擦除操作,并分享了构建健壮驱动框架、处理跨页写入及常见调试问题的实战经验。

tt34567的博客 886

KV STUDIO的安装与实践(一)

KV STUDIO是一种软件开发工具,用于编写、调试和管理基于Key-Value(键-值)存储的应用程序。KV STUDIO提供了一个集成开发环境(IDE),使开发人员可以方便地创建和管理键-值数据库,并编写逻辑和业务规则来操作和查询这些数据。它支持多种编程语言和平台,并提供了丰富的API和工具来简化开发过程。使用KV STUDIO,开发人员可以快速构建高效、可靠的键-值存储系统,并实现各种应用程序,如缓存、会话管理、配置存储等。本次使用plc进行案例讲解,结合小编的亲身经历,仅供参考!

weixin_47514459的博客 6364
上一篇: vue3+vite+ts项目搭建及踩坑
下一篇: ts报错“对象可能为“未定义”
double_Fly_
博客等级 码龄7年 7327粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值