当前位置:   article > 正文

使用vite插件编写tsx文件_vite tsx

vite tsx

一般情况下,我们在template标签里去写静态页面模板。现在可以扩展另一种书写风格 tsx,类似react的jsx语法。vue2 的时候就已经支持jsx写法,只不过不是很友好,随着vue3对typescript的支持度增高,tsx写法越来越被接受。

使用参阅:@vitejs/plugin-vue-jsx

1、安装

npm i @vitejs/plugin-vue-jsx -D

可能会出现插件与vite版本不兼容的问题:

解决办法:添加 --force 参数,强制安装即可。

 

2、配置vite.config.ts

  1. import vueJsx from '@vitejs/plugin-vue-jsx';
  2. // https://vitejs.dev/config/
  3. export default defineConfig({
  4. plugins: [vueJsx()]
  5. })

3、 配置tsconfig.json

添加以下信息在compilerOptions配置项中:

  1. "jsx": "preserve",
  2. "jsxFactory": "h",
  3. "jsxFragmentFactory": "Fragment",

这样就可以编写tsx文件了。 

4、新建xxx.tsx测试

第一种编写方式,内容如下;

  1. export default function() {
  2. return (<div>hello world!</div>)
  3. }

像引入组件一样,在App.vue中 import,使用:

  1. import AppTsx from './App' // 后缀可省略
  2. ...
  3. <AppTsx></AppTsx>

显示结果:

 

5、使用defineComponent编写tsx

第二种编写方式,该语法类似react的class component书写方式,属于Optional API。

  1. import { defineComponent } from 'vue'
  2. export default defineComponent({
  3. data () {
  4. return {
  5. name: "Tom",
  6. age: 23
  7. }
  8. },
  9. render () {
  10. return (<div>{ this.name } is { this.age } years old. </div>)
  11. }
  12. })

注意:在render函数中使用data函数定义的变量时,用的是单花括号‘{ xxx }’进行渲染。

页面效果:

 

6、setup函数模式编写tsx

  1. import { defineComponent } from 'vue'
  2. export default defineComponent({
  3. setup () {
  4. return () => (<div>Setup!</div>)
  5. }
  6. })

7、指令使用变化

支持使用v-show的指令:

  1. setup () {
  2. const flag = false
  3. return () => (<div v-show={flag}>Setup!</div>)
  4. }

Setup!字样是正常隐藏了的。但如果给变量flag使用ref包装一下,v-show就失效了?如下:

 这是因为在ts里{xx},对于响应式数据的解析不能自动.value拆包,需要手动写上.value。

不支持v-if指令:

解决:采取另一种编程思想(如js的三元表达式):

个人感觉这种结构读性较差。

不支持v-for指令:

采用数组遍历方式渲染,map()代替v-for:

 

v-bind 可以用 '{}' 替代:

 8、Props接收值

  1. // App.tsc 定义接口类型
  2. type Props = {
  3. title?:string
  4. }
  5. export default defineComponent({
  6. props: {
  7. title:String
  8. },
  9. // setup接收props参数
  10. setup(props:Props) {
  11. return () => (
  12. <>
  13. <div> Props: { props?.title }</div>
  14. <hr />
  15. </>
  16. );
  17. }
  18. });
  19. ......
  20. // App.vue 传值
  21. <AppTsx title="我是标题"></AppTsx>

结果:

 9、emit派发事件

  1. ...
  2. const fun = () => {
  3. console.log('click!');
  4. }
  5. return () => (
  6. <>
  7. {/* <div onClick={fun()}> Props: { props?.title }</div> */}
  8. <div onClick={() => fun()}> Props: { props?.title }</div>
  9. <hr />
  10. </>
  11. );
  12. ...

不是以@开头的事件书写,注意{xx}不能直接调用函数,它会自动执行,需要改写为回调函数形式:onClick={() => xxx()}。

 传参:

  1. const fun = (num:number) => {
  2. console.log('click!', '参数: ', num);
  3. }
  4. ...
  5. <div onClick={() => fun(666)}> Props: { props?.title }</div>
  6. ...

触发父组件事件:

  1. setup(props:Props, { emit }) {
  2. ...
  3. }
  4. ...
  5. const fun = (num:number) => {
  6. console.log('click!', '参数: ', num);
  7. emit('on-click', num)
  8. }
  1. // App.vue
  2. const getNum = (num:number) => {
  3. console.log('父组件接收emit: ', num);
  4. }
  5. ...
  6. <AppTsx @on-click="getNum" title="我是标题"></AppTsx>
  7. ...

10、插槽slots

  1. // 定义一个子组件
  2. const A = (_, { slots }) => (
  3. <>
  4. <h1>{ slots.default ? slots.default() : '默认插槽' }</h1>
  5. <h2>{ slots.foo?.() }</h2>
  6. </>
  7. );
  8. ...
  9. setup(props:Props, { emit }) {
  10. const slot = {
  11. default: () => (<div>hello - default slots</div>),
  12. foo: () => (<div>world - foo slots</div>),
  13. }
  14. return () => (
  15. <>
  16. <A v-slots={slot}></A>
  17. <hr />
  18. </>
  19. );
  20. }
  21. });
  22. ...

 11、表单双向数据绑定

支持v-model指令:

  1. const v = ref<string>('')
  2. ...
  3. return () => (
  4. <>
  5. <input v-model={v.value} type="text" />
  6. <div>{ v.value }</div>
  7. </>
  8. );
  9. ...

 

 

参考: https://xiaoman.blog.csdn.net/article/details/123172735

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/797217
推荐阅读
相关标签
  

闽ICP备14008679号