因为typescript
增加了代码的可读性和可维护性而被越来越多的公司所接受,现在很多公司都用typescript
。vue
作为国内最流行框架,一直都对typescript
拓展不太友好,现在借助vue-class-component
和vue-property-decorator
这两个拓展插件,我们也可以在vue
中轻松用typescript+JSX
模板来编写我们vue
程序了。
起步
使用vue-cli4
初始化项目,记得要勾选typescript这一项
,然后新建名为test.tsx
的文件,编写下面的代码,这样我们就可以使用JSX
模板来写我们的代码了,可是,vue里的有些指令在JSX
模板中是用不了,需要灵活变通一下,接下来会举一些例子来看一下vue
的一些指令在JSX
模板中的使用。
计算属性computed
和侦听器watch
这里的监听事件要借助vue-property-decorator
的Watch
函数实现监听。
v-show
、v-if
,v-for
属性
更正一下,v-show
指令在jsx模板中是可以使用的
事件处理
可以看到one
修饰符事件在处理上要使用~click
,还有一些事件修饰符要灵活变通一下,具体参考vue在渲染函数中的事件 & 按键修饰符,还有阻止默认事件和阻止冒泡事件也需要自己在事件中处理,不能使用修饰符。
prop
属性
子组件button.tsx
父组件test.tsx
这里要注意,如果你直接<TestButton text="传值" />
是会报错,因为不符合组件规范
slot
属性
子组件Button.tsx
父组件test.tsx
可以看到插槽传值要使用scopedSlots
,具体可以看vue官网
上的插槽在渲染函数使用
使用this.$scopedSlots as any
是为了防止typescript
报错,因为在typescript
上没有识别出this.$scopedSlots上
的msgslot
是什么类型的,同时定义vm.$refs上的事件时也要做类似的处理,比如ref上有个事件handleEvent,要触发这个事件可以用下面的写法。
const ref: any = this.$refs.ref;
ref.handleEvent()
$emit
使用
子组件Button.tsx
父组件test.tsx
具体可参考@Emit使用
这里要注意,如果父组件要调用子组件的原生事件不能直接写成
<Test-Button onMouseenter={handleEvent}>
我是按钮
</Test-Button>
而是要用nativeOn
,,而是要使用下面的形式:
<Test-Button nativeOn={{ mouseenter:handleEvent }}>
我是按钮
</Test-Button>
具体可以看vue深入数据对象
mixins
属性
Mixin.tsx
test.tsx
可以看到,这里要借助vue-class-component
插件来完成mixins
混入,更多用法可以参考这里这里mixins使用
结语
多参考vue官网上的渲染函数 & JSX,我们就可以在vue中更好的使用jsx模板
。但是使用jsx模板
代替template模板
,vue的有些指令在jsx
中用不了,很多指令都需要灵活变通,写法也更加繁琐了,vue的一些指令可以快速开发我们的程序,然而jsx模板有利于代码提示,提高代码的可读性和可维护性,增强团队之间的开发。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。