vue3使用jsx語(yǔ)法詳解
雖然最早是由 React 引入,但實(shí)際上 JSX 語(yǔ)法并沒(méi)有定義運(yùn)行時(shí)語(yǔ)義,并且能被編譯成各種不同的輸出形式。如果你之前使用過(guò) JSX 語(yǔ)法,那么請(qǐng)注意 Vue 的 JSX 轉(zhuǎn)換方式與 React 中 JSX 的轉(zhuǎn)換方式不同,因此你不能在 Vue 應(yīng)用中使用 React 的 JSX 轉(zhuǎn)換。與 React JSX 語(yǔ)法的一些明顯區(qū)別包括:
- 可以使用 HTML attributes 比如
class和for作為 props - 不需要使用className或htmlFor。 - 傳遞子元素給組件 (比如 slots) 的方式不同。
添加的配置
1?? tsconfig
{
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "vue"
}
}
2?? vite.config.ts
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
export default {
plugins: [vue(), vueJsx()]
}
代碼演示
在 vue文件 中
<script setup lang="tsx">
import { computed, defineComponent, ref } from 'vue'
const count = ref(0)
// 1. 定義一個(gè) JSX 片段或小組件
const RenderHeader = () => (
<header>
<h2>這是 JSX 渲染的標(biāo)題</h2>
<p>當(dāng)前計(jì)數(shù): {count.value}</p>
</header>
)
// 2. 這是一個(gè)返回 VNode 的計(jì)算屬性。搭配 component 使用
const renderContent = computed(() => {
return count.value > 5 ? (
<span>已達(dá)到上限</span>
) : (
<button onClick={() => count.value++}>增加</button>
)
})
// 3. 普通組件, setup返回一個(gè)渲染函數(shù)
const Bbb = defineComponent({
name: 'Bbb',
setup() {
return () => <div>11111</div>
},
})
</script>
<template>
<RenderHeader />
<component :is="renderContent" />
<Bbb />
</template>
注意:lang的值是 tsx
在 tsx文件 中
// 函數(shù)式組件
export default () => {
return <div class={styles.name}>hello world</div>
}
export const Aaa = defineComponent({
setup() {
const t = ref(Date.now())
// 返回渲染函數(shù)
return () => <div>aaa {t.value}</div>
},
})
樣式方案選型
使用 JSX/TSX,CSS Modules 或 Tailwind CSS 是更好的搭檔。Scoped CSS 是專(zhuān)為 Template 設(shè)計(jì)的。
在 vue文件 中,使用 CSS Modules
<style module>
.header {
color: blue;
}
.content {
color: green;
}
.bbb {
color: red;
}
</style>
eslint
要在 vue文件 中使用tsx,應(yīng)添加 configureVueProject 的配置
configureVueProject({ scriptLangs: ['ts', 'tsx'] })
export default defineConfigWithVueTs(
{
name: 'app/files-to-lint',
files: ['**/*.{ts,mts,tsx,vue}'],
},
globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
pluginVue.configs['flat/essential'],
vueTsConfigs.recommended,
skipFormatting,
)
參考
- https://cn.vuejs.org/guide/extras/render-function#jsx-tsx
- https://www.npmjs.com/package/@vue/eslint-config-typescript?activeTab=dependents
到此這篇關(guān)于vue3使用jsx語(yǔ)法詳解的文章就介紹到這了,更多相關(guān)vue3 jsx語(yǔ)法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3-KeepAlive,多個(gè)頁(yè)面使用keepalive方式
這篇文章主要介紹了Vue3-KeepAlive,多個(gè)頁(yè)面使用keepalive方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
vue?demi支持sfc方式的vue2vue3通用庫(kù)開(kāi)發(fā)詳解
這篇文章主要為大家介紹了vue?demi支持sfc方式的vue2vue3通用庫(kù)開(kāi)發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
vue基于element-china-area-data插件實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng)
省市區(qū)聯(lián)動(dòng)在日常開(kāi)發(fā)中用的非常多,本文就介紹一下vue基于element-china-area-data插件實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的可以了解一下2022-04-04
Vue組件庫(kù)ElementUI實(shí)現(xiàn)表格加載樹(shù)形數(shù)據(jù)教程
這篇文章主要為大家詳細(xì)介紹了Vue組件庫(kù)ElementUI實(shí)現(xiàn)表格加載樹(shù)形數(shù)據(jù)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
在vue項(xiàng)目中使用element-ui的Upload上傳組件的示例
本篇文章主要介紹了在vue項(xiàng)目中使用element-ui的Upload上傳組件的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Vue.js刷新當(dāng)前頁(yè)面的常見(jiàn)方法
這篇文章主要介紹了Vue.js刷新當(dāng)前頁(yè)面的常見(jiàn)方法,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12
Vue 使用v-model實(shí)現(xiàn)控制子組件顯隱效果
v-model 可以實(shí)現(xiàn)雙向綁定的效果,允許父組件控制子組件的顯示/隱藏,同時(shí)允許子組件自己控制自身的顯示/隱藏,本文給大介紹Vue 使用v-model實(shí)現(xiàn)控制子組件顯隱,感興趣的朋友一起看看吧2023-11-11
基于vue cli 通過(guò)命令行傳參實(shí)現(xiàn)多環(huán)境配置
這篇文章主要介紹了vue項(xiàng)目通過(guò)命令行傳參實(shí)現(xiàn)多環(huán)境配置(基于@vue/cli)的相關(guān)資料,需要的朋友可以參考下2018-07-07
vue+Element-ui實(shí)現(xiàn)登錄注冊(cè)表單
這篇文章主要為大家詳細(xì)介紹了vue+Element-ui實(shí)現(xiàn)登錄注冊(cè)表單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11

