网站首页 > 博客文章 正文
在vue3中使用更丝滑的去使用tsx
对于喜欢在vue3中使用tsx的小伙伴儿说,去书写属性的类型声明比去写实体的属性更为简单易用,但是在@vitejs/plugin-vue-jsx中,并没有给我们提供这样的使用方式,之前我开发了一个tsx-auto-props插件从一定程度上解决了这个问题。但是这个插件还是没有完全满足我目前的需求,于是我又重新梳理了一下整个的需求,开发了一个新的插件vite-plugin-tsx-resolve-types。
这个插件解决了什么问题?
相比tsx-auto-props而言,这个插件不仅仅局限于props的类型声明,并且增加了emits的类型声明的使用方式。所以这次插件可能所能解决的问题并不仅仅局限于tsx-auto-props所能解决的问题。
下面我们通过几个简单的例子来带大家学习一下我们这款插件的用法。
安装
pnpm add -D vite-plugin-tsx-resolve-types
使用
在vite.config.ts中配置插件:
import { defineConfig } from 'vite'
import tsxResolveTypes from 'vite-plugin-tsx-resolve-types'
import vueJsx from '@vitejs/plugin-vue-jsx'
export default defineConfig({
plugins: [
tsxResolveTypes(),
vueJsx(),
],
})
最基本的用法
你可以抛弃props的属性定义,而直接采用props类型定义的方式来实现属性的声明。
import {defineComponent} from "vue";
interface Props {
name: string
}
export const Test = defineComponent((props: Props) => {
return () => (
<div>{props.name}</div>
)
})
export const Test1 = defineComponent<Props>((props) => {
return () => (
<div>{props.name}</div>
)
})
export const Test2 = defineComponent({
setup(props:Props){
return ()=>{
<div>{props.name}</div>
}
}
})
export const Test3 = defineComponent<Props>({
setup(props){
return ()=>{
<div>{props.name}</div>
}
}
})
export default defineComponent<Props>((props) => {
return () => (
<div>{props.name}</div>
)
})
默认导出的setup形式
import {defineComponent} from "vue";
interface Props {
name: string
}
export default defineComponent<Props>({
setup(props){
return ()=>{
return <div>{props.name}</div>
}
}
})
复杂类型用法
你可以使用一些比较复杂的类型来定义你的props:
interface Props1 {
foo: string
}
interface Props2 {
bar: number
}
type Props = Props1 & Props2
export default defineComponent<Props>({
setup(props){
return ()=>{
return <div>{props.foo}{props.bar}</div>
}
}
})
interface Props4 extends Props1,Props2{
baz: boolean
}
export default defineComponent<Props4>({
setup(props){
return ()=>{
return <div>{props.foo}{props.bar}{props.baz}</div>
}
}
})
更多复杂用法的例子,大家可以自行探索。
默认值
在之前的tsx-auto-props插件中,我们没有办法给props设置默认值,但是在这个插件中,我们实现了给props类型定义设置默认值的功能。
import { defineComponent } from "vue";
interface Props {
name: string
age?: number
}
export default defineComponent<Props>({
setup(props = {name: 'aibayanyu', age: 18}){
return ()=>{
return <div>{props.name}{props.age}</div>
}
}
})
const defaults:Props = {
name: 'aibayanyu',
age: 18
}
export const Test1 = defineComponent<Props>({
setup(props = defaults){
return ()=>{
return <div>{props.name}{props.age}</div>
}
}
})
export const Test2 = defineComponent({
setup(props:Props = {name: 'aibayanyu', age: 18}){
return ()=>{
return <div>{props.name}{props.age}</div>
}
}
})
emits类型转换
对于emits的定义,我们也可以使用emits类型定义的方式来实现。
import {defineComponent,SetupContext} from "vue";
interface Emits{
// 支持类似defineEmits的写法
click:[Event]
// 支持函数式的写法
change:(value:string) => void
}
const Test = defineComponent((props,ctx:SetupContext<Emits>)=>{
return ()=>{
return <div onClick={(e)=>ctx.emit('click',e)}>test</div>
}
})
// 支持行内写法
const Test12 = defineComponent((props,ctx:SetupContext<{click:[string]}>)=>{
return ()=>{
return <div onClick={(e)=>ctx.emit('click',e)}>test</div>
}
})
const Test1 = defineComponent({
setup(props,ctx:SetupContext<Emits>){
return ()=>{
return <div onClick={(e)=>ctx.emit('click',e)}>test</div>
}
}
})
const Test2 = defineComponent({
setup(props,{emit}:SetupContext<Emits>){
return ()=>{
return <div onClick={(e)=>emit('click',e)}>test</div>
}
}
})
这就是目前我们的插件所提供的能力,如果大家有什么更好的建议,欢迎大家来提交PR/issue,我们一起来完善这个插件。
猜你喜欢
- 2025-01-04 vue3+ts+vite怎么配置es6转es5?
- 2025-01-04 Vue Demi是如何让你的库同时支持Vue2和Vue3的
- 2025-01-04 Vue3.3 + TS4 ,自主打造媲美 ElementPlus 的组件库(超清完结)
- 2025-01-04 用vue3.2+ts+element搭建了个后台框架,却没有项目给我做
- 2025-01-04 深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别
- 2025-01-04 不同vue版本下如何分环境打包
- 2025-01-04 Vue vben admin - 基于 Vue3 / Ant Design Vue 的高颜值管理后台UI框架
- 2025-01-04 使用Vite和TypeScript带你从零打造一个属于自己的Vue3组件库
- 2025-01-04 只会Vue的我,上班第一天就要我写React+TS,是种什么样的体验?
- 2025-01-04 基于 Vue3+Ts 后台前端管理系统Vue3-Admin
你 发表评论:
欢迎- 最近发表
-
- 告别频繁登录!Nuxt3 + TS + Vue3实战:双Token无感刷新方案全解析
- SpringBoot实现单点登录(SSO)的4种方案
- 随机密聊 匿名聊天室程序源码(随机匿名聊天在线)
- SpringBoot大文件上传卡死?分块切割术搞定GB级传输,速度飙升!
- Java 微服务从源码实战开始 | Gitee 项目推荐
- 轻量级埋点sdk搭建,便捷更全面(埋点sdk是什么)
- Spring Boot 实现文件秒传功能(springboot上传文件到指定文件夹)
- 项目中不用redis分布式锁,怎么防止用户重复提交?
- SpringBoot项目日志打印traceId生成
- 如何实现PC端网站扫码登录操作?(网页 扫码)
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)