在 vue3 中优雅的使用 jsx/tsx

2023-04-19 17:23:27
2023-06-05 03:02:31

安装插件(@vitejs/plugin-vue-jsx)

pnpm add @vitejs/plugin-vue-jsx -D

配置vite.config.ts

import vueJsx from "@vitejs/plugin-vue-jsx";

export default defineConfig({
  plugins: [
    vueJsx(),
  ]
})

插值

// vue3模板语法
<span>{{ a + b }}</span>

// jsx/tsx
<span>{ a + b }</span>

class与style 绑定

// 模板字符串
<div className={`header ${ isBg ? 'headerBg' : '' }`}>header</div>
//数组
<div class={ [ 'header', isBg && 'headerBg' ] } >header</div>
const color = 'red'
const element = <sapn style={{ color, fontSize: '16px' }}>style</sapn>

条件渲染

setup() {
       const isShow = false
       const element = () => {
           if (isShow) {
               return <span>我是if</span>
           } else {
               return <span>我是else</span>
           }
       }
       return () => (
           <div>
               <span v-show={isShow}>我是v-show</span>
               {
                   element()
               }
               {
                   isShow ? <p>我是三目1</p> : <p>我是三目2</p>
               }
           <div>
       )
   }

列表渲染

setup() {
   const listData = [
       {name: 'Tom', age: 18},
       {name: 'Jim', age: 20},
       {name: 'Lucy', age: 16}
   ]
   return () => (
       <div>
           <div class={'box'}>
               <span>姓名</span>
               <span>年龄</span>
           </div>
           {
               prop.listData.map(item => {
                   return <div class={'box'}>
                       <span>{item.name}</span>
                       <span>{item.age}</span>
                   </div>
               })
           }
       </div>
   )
}

事件处理

setup() {
    const clickBox = val => {
        console.log(val)
    }
    return () => (
        <div class={'box1'} onClick={() => clickBox('box1')}>
            <span>我是box1</span>
            <div class={'box2'} onClick={() => clickBox('box2')}>
                <span>我是box2</span>
                <div class={'box3'} onClick={withModifiers(() => clickBox('box3'), ['stop'])}>我是box3</div>
            </div>
        </div>
    )
}

v-model

// 正常写法
<input v-model="value" /> // vue
<input v-model={value} /> // jsx

// 指定绑定值写法
<input v-model:modelValue="value" /> // vue
<input v-model={[value,'modelValue']} /> // jsx

// 修饰符写法
<input v-model:modelValue.trim="value" /> // vue
<input v-model={[value,'modelValue',['trim']]} /> // jsx

slot插槽

定义插槽

import { renderSlot } from "vue"
export default defineComponent({
    // 从ctx中解构出来 slots
    setup(props, { slots }) {
        return () => (
            <div>
                { renderSlot(slots, 'default') }
                { slots.title?.() }
            </div>
        )
    }
})

使用插槽

import Vslot from './slotTem'
export default defineComponent({
    setup() {
        return () => (
            <div class={'box'}>
                <Vslot v-slots={{
                    title: () => {
                        return <p>我是title插槽</p>
                    },
                    default: () => {
                        return <p>我是default插槽</p>
                    }
                }} />
            </div>
        )
    }
})
目录
qq

qq

回复
亚太地区 - 0
Chrome113.0.0.0
Windows10
2023-06-04 07:51:47
小白龙

大佬猛

回复
广东省 - 广州市
Chrome113.0.0.0
Windows10
2023-05-23 21:35:48
梅西

下届带你踢世界杯

回复
广东省 - 广州市
Edge113.0.1774.35
Windows10
2023-05-11 16:32:27
1
回复
11

1

111

回复
0 - 内网IP
Chrome113.0.0.0
Windows10
2023-06-03 14:12:43
11
回复
1

111

111

回复
亚太地区 - 0
Chrome113.0.0.0
Windows10
2023-06-03 13:58:47
1
回复
大白龙

111

测试新版本

回复
亚太地区 - 0
Chrome113.0.0.0
Windows10
2023-06-03 13:58:14
大白龙
回复
大白龙

测试新版本

我要回复小白龙

回复
广东省 - 广州市
Chrome113.0.0.0
Windows10
2023-05-27 17:12:38
大白龙
回复
小白龙

我要回复小白龙

可以哇

回复
0 - 内网IP
Chrome112.0.0.0
Windows10
2023-05-11 22:10:32
小白龙

可以哇

回复
广东省 - 广州市
Chrome112.0.0.0
Windows10
2023-05-11 21:26:09
贝克汉姆

明天带你踢世界杯

回复
广东省 - 广州市
Edge113.0.1774.35
Windows10
2023-05-11 16:24:56
开飞机能记录吗?

**哈哈

回复
广东省 - 广州市
Edge113.0.1774.35
Windows10
2023-05-11 15:13:01
测试

浏览器版本,系统版本

回复
广东省 - 广州市
Chrome112.0.0.0
Windows10
2023-05-09 23:26:38
爱慕你的大舅哥

太崇拜了

回复
中国|0|广东省|广州市|移动
未知
未知
2023-04-19 13:47:05
test

12345

回复
中国|0|上海|上海市|联通
未知
未知
2023-03-17 14:41:07
IP地址

IP地址

回复
中国|0|辽宁省|大连市|联通
未知
未知
2023-03-08 16:32:12
怎么没有人留言

为什么为什么为什么

回复
中国|0|广东省|广州市|电信
未知
未知
2023-02-21 08:32:35
  • 1
  • 2
  • 3
  • 4

运营需要亿点资金维持,您的支持,是小白龙创作的动力!!!