通过实例了解vue3.3更新的特征

这篇具有很好参考价值的文章主要介绍了通过实例了解vue3.3更新的特征。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开场白

5月份,vue团队发布了 vue3.3.
这次小版本的发布主要解决了--
Vue 与 TypeScript 一起使用时的许多长期存在的痛点.
下面我们一起来学习一下vue3.3新特征

准备新新特征的环境

根据官方团队的描述,我们需要准备一下工作。
vue升级到 3.3 时,建议同时更新以下依赖项:
Volar / vue-tsc@^1.6.4 
vite@^4.3.5
@vitejs/plugin-vue@^4.2.0
vue-loader@^17.1.0 (如果使用 webpack 或 vue-cli)

使用vite来学习vue3.3的新特征

1.yarn create vite      创建vite项目
2.输出项目名
3.选择包名
4.选择vue
5.选择ts

通过实例了解vue3.3更新的特征

插件

Vue Language Features (Volar) 需要版本 v1.7.2以上
你可以点击设置小图标 然后选择切换版本
也可安装一下 TypeScript Vue Plugin (Volar) 插件

script setup + TypeScript 开发体验改善

在3.3以前,defineProps 和 defineEmits 的使用类型仅限于本地类型,并且仅支持类型文本和接口。
这是因为 Vue 需要能够分析 props 接口上的属性,以便生成相应的运行时选项。
现已在 3.3 中解决。编译器现在可以解析导入的类型,并支持一组有限的复杂类型:

解析导入的类型,并支持有限的复杂类型

//hello.ts文件
// 给HelloWord组件定义类型
export interface HelloPerson {
  name: string;
  age: number;
  likeArr: string[]
}
//HelloWorld.vue文件
<template>
  <div class="card">
    <p>姓名 {{ name }}</p>
    <p>年龄 {{ age }}</p>
    <p>爱好 {{ likeArr }}</p>
  </div>
</template>

<script setup lang="ts">
//导入我们定义的类型
import { HelloPerson } from './hello'
// 使用定义的类型
defineProps<HelloPerson>()
</script>
//在页面中使用
<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'
</script>
<template>
  <div>
    <HelloWorld name="张三" :age="19" :likeArr="['打豆豆','挖呀挖']" />
  </div>
</template>

通过实例了解vue3.3更新的特征
通过实例了解vue3.3更新的特征
通过实例了解vue3.3更新的特征

需要注意的点

1.组件中 defineProps我使用的是接口 interface 定义。
所以使用组件的时候接口中的参数必须要有,否者会有红色波浪线。
但在实际的场景中,我们有可能不需每一个参数。
为了解决这个上述问题。
我们需要将 interface 中的字段改为可选。使用 ? 还处理。
变为下面的样子就可以了。


// 给HelloWord组件定义类型
//  ? 表示该字段可以有也可以没有
export interface HelloPerson {
  name?: string;
  age?: number;
  likeArr?: string[]
}

通过实例了解vue3.3更新的特征

通过实例了解vue3.3更新的特征

类型的扩展

有些时候我们还需要进行类型的扩展。
HelloPerson接口中没有我们需要的类型。
我们可以自己进行扩展,现在我们扩展一个其他类型
otherProp 为字符串,同样的这个类型是可有可无的
<script setup lang="ts">
//导入我们定义的类型
import { HelloPerson } from './hello'
// 使用定义的类型 同时还扩展了otherProp类型为字符串。
// 同样的这个类型是可有可无的
defineProps<HelloPerson & { otherProp?: string }>()
</script>

通过实例了解vue3.3更新的特征

需要注意的点

需要注意的是,复杂类型支持是基于 AST 的,因此不是 100% 全面的。
不支持一些需要实际类型分析的复杂类型,例如条件类型。
我们可以将条件类型用于单个 props 的类型,
但不能对整个 props 对象使用。

通用组件-组件可以接收泛型参数

有些时候我们不知道,传递过来的是什么类型。
这个时候我们就可以使用泛型了。
// Hi组件
<template>
  <div class="card">
    <p>爱好 {{ likeArr }}</p>
    <p>性别 {{ sex }}</p>
  </div>
</template>

<script setup lang="ts" generic="T">
defineProps<{
  likeArr: T[]
  sex: T
}>()
</script>
<script setup lang="ts">
import Hi from './components/Hi.vue'
let likeArr = ['摸鱼','睡觉']
</script>
<template>
  <div>
    // 在使用的时候会自动推导类型的
    <Hi :likeArr="likeArr" sex="男"/>
  </div>
</template>

通过实例了解vue3.3更新的特征

多个泛型

多个泛型使用逗号隔开,于此同时,也是可以继承的
<template>
  <div class="card">
    <p>爱好 {{ likeArr }}</p>
    <p>性别 {{ sex }}</p>
    <p>年龄 {{ age }}</p>
  </div>
</template>

<script setup lang="ts" generic="T,U extends number">
// 让U这个泛型继承数字
defineProps<{
  likeArr: T[]
  sex: T,
  age: U
}>()
</script>
<script setup lang="ts">
import Hi from './components/Hi.vue'
let likeArr = ['摸鱼','睡觉']
</script>
<template>
  <div>
    <Hi :likeArr="likeArr" sex="男" :age="10" />
  </div>
</template>
<style scoped>

通过实例了解vue3.3更新的特征文章来源地址https://www.toymoban.com/news/detail-467428.html

defineEmits的优化--现在

<template>
  <div class="card">
   <button @click="handlerSay">说</button>
   <button @click="handlerWrite">写</button>
  </div>
</template>

<script setup lang="ts" generic="T,U extends number">
const emit = defineEmits<{
  //这里的id是自定义的,你也可以叫其他
  foo: [id: number];  
  //这里的name, age是自定义的,你也可以叫其他
  bar:[name:string, age:number]
}>()
function handlerSay() {
  emit('foo',1)
}
function handlerWrite() {
  emit('bar',  '张三', 19)
}
</script>
<script setup lang="ts">
import Say from './components/Say.vue'
function bar(a,b) {
  console.log(a,b)
}
</script>
<template>
  <div>
    <Say @bar="bar" />
  </div>
</template>

defineEmits以前的写法

<template>
  <div class="card">
   <button @click="handlerSay">说</button>
   <button @click="handlerWrite">写</button>
  </div>
</template>


const emit = defineEmits<{
  (e: 'foo', id: number): void
  (e: 'bar', name: string,  age: number): void
}>()

function handlerSay() {
  emit('foo',1)
}
function handlerWrite() {
  emit('bar',  '张三', 19)
}

尾声

如果你觉得我写的不错的话,请给在下方给我点一下推荐。谢谢啦。
如果这篇文章帮助你了,请给打赏。谢谢。
我敢保证,打赏点赞的今年都可以找到女朋友

到了这里,关于通过实例了解vue3.3更新的特征的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 了解Vue3预渲染

    我们作为开发人员常常寻找各种方法来提高网站的加载速度和用户体验,预渲染是一个可选方案,它可以显著改善网站的性能。当我们使用Vue.js构建SPA(现代化的单页应用),在首次加载时可能面临性能方面的挑战,因为页面内容通常由JavaScript动态生成,那么使用预渲染技术

    2024年02月15日
    浏览(32)
  • Vue3 了解与安装

    Vue(读音/vju:/,类似于view)是一套用于构建用户界面的渐进式框架。 Vue的核心库只关注视图层,不仅易于上手,还方便与第三方库或既有项目整合。 和库是不一是Vue是一套架构,会基于自生特点向用户提供一套相当完整的解决方案,而且控制权在项目本身;对项目的入侵性较

    2024年02月16日
    浏览(27)
  • Vue3 - Element Plus 表格组件 “手动“ 取消/选中勾选列,并同步更新表格复选框 UI 状态(el-table 表格组件中,通过代码手动控制某个列的选中与取消勾选,并且复选框跟着变)

    网上基本上都是全部取消勾选的教程,没有仅对单独列操作的教程。 本文 实现了在 vue3 + element plus 组件库中,对 “某一个” 或 “几个单独” 列进行勾选/取消(手动操作表格复选框),并且让表格复选框自动同步选中状态, 完美解决删除表格列勾选的数据后,选中和取消

    2024年02月03日
    浏览(83)
  • vue3获取子组件实例

     方法一,直接获取   getCurrentInstance

    2024年02月16日
    浏览(86)
  • Vue3 全局实例上挂载属性方法

    导语 在大多数开发需求中,我们有时需要将某个数据,或者某个函数方法,挂载到,全局实例身上,以便于,在项目全局的任何位置都能够调用其方法,或读取其数据。 在Vue2 中,我们是在 main.js 中 直接将数据或者方法绑定在 Vue.prototype 身上,在页面中,可以直接通过 thi

    2024年02月02日
    浏览(28)
  • 简单本地websocket运行实例(vue3)

    目录 1.完善一下登陆页面,方便后续使用 2.具体实现vue页面 3.hooks文件夹建立,存放websocket设置 4.建立src的同级server文件夹,用于后端启动websocket服务 5.创建index.js文件,编写websocket代码 6.在server目录下,通过npm run dev运行后端代码  7.效果展示 整体代码: 页面结构如图:  

    2024年02月06日
    浏览(34)
  • vue3-基本属性更新

    Vue3的基本属性: 组合式API(Composition API): 组合式API是Vue3最核心的特性之一,它允许开发者将逻辑相关的选项组合在一起,提高代码的可维护性和可读性。组合式API主要体现在setup函数中,setup函数是一个新的组件选项,用于在组件创建之前执行一些逻辑。 响应式系统重构

    2024年01月23日
    浏览(34)
  • vue3——解决数据更新而视图未更新问题

    最近有一个项目遇到一个问题:是一个弹窗操作数据,当弹窗里的数据已经发生改变时,而视图并没有改变,未能得到及时更新,因此归纳了以下方法来解决这个问题 1、强制更新 2、在数据修改的组件上加上标识符 修改数据时 3、在视图组件中使用 v-if 修改值之后将组件销毁

    2024年02月16日
    浏览(48)
  • vue3中数据更新,视图没有更新解决方案

    Vue 3.0 中我们使用 reactive() 定义的 响应式 数据的时候,当我们对象再次赋值,我们发现数据已经修改成功,但是页⾯并没有自动渲染成最新的数据; 使用vue的强制刷新处理 scriptsetup import {defineComponent , ref , computed , toRefs , getCurrentInstance} from \\\'vue\\\' constinternalInstance = getCurrentIns

    2024年02月17日
    浏览(46)
  • vue通过js代码实例化组件

    最近在写项目的一些公共组件(一些选择器),很多个地方都需要用,所以在main.js全局声明了,但发现子页面调用还是有挺多的地方需写。 例如,要在template实例化组件,并用ref绑定,然后在js里的methods里写方法。 main.js 声明全局组件 第一种方案 一开始想到的是用ref绑定组

    2024年02月08日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包