Vue3使用JSX的方法實(shí)例(筆記自用)
1. Vue3 中 JSX 的基本應(yīng)用
- 使用 .jsx 格式文件和 defineComponent
- defineComponent 可傳入 setup 函數(shù) 或 組件的配置
- 插值使用單括號(hào) {}
1.1 在 .vue 文件中使用 jsx
// 父
<template>
<div class="home">
<JSXDemo1 />
</div>
</template>
<script>
import JSXDemo1 from '@/components/JSXDemo1.vue'
export default {
name: 'HomeView',
components: {
JSXDemo1
}
}
</script>
// JSXDemo1.vue
<script>
import { ref } from 'vue'
export default {
setup () {
const countRef = ref(200)
const render = () => {
return <p>DEMO1--{countRef.value}</p> // jsx就是js語法,所以要加 .value
}
return render
}
}
</script>1.2 .jsx文件格式
// 父組件
import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'
export default defineComponent(() => { // 傳入 setup 函數(shù)
const countRef = ref(300)
const render = () => {
return <>
<p>DEMO2--{countRef.value}</p>
<JSXChild a={countRef.value + 100}></JSXChild>
</>
}
return render
})
// 子組件 JSXChild.jsx
import { defineComponent } from 'vue'
export default defineComponent({ // 傳入組件配置
props: ['a'],
setup (props) {
const render = () => {
return <>
<p>child {props.a}</p>
</>
}
return render
}
})2. JSX 和 template 的區(qū)別
- 語法上有很大區(qū)別:
- JSX 本質(zhì)就是 js 代碼,可以使用 js 的任何能力
- template 只能嵌入簡單的 js 表達(dá)式,其他需要指令,如 v-if
- JSX 已經(jīng)成為 ES 規(guī)范,template 還是 Vue 自家規(guī)范
- 本質(zhì)是相同的:
- 都會(huì)被編譯為 js 代碼(render 函數(shù))
2.1 插值
- template 使用雙括號(hào) {{ }}
- jsx 使用單括號(hào) { }
// template
<template>
<p>{{ name }} -- {{ age }}</p>
</template>
// jsx
const render = () => {
return <>
<p>child {props.a}</p>
</>
}2.2 自定義組件
- template 組件名使用時(shí)可改變大小寫或是駝峰,jsx 不可更改
- 引入動(dòng)態(tài)參數(shù),template使用冒號(hào)+參數(shù)名(:msg='msg'),jsx 不需要冒號(hào)
// template
<template>
<div class="home">
<watch-effect :msg="msgRef"/>
</div>
</template>
<script>
import { ref } from 'vue'
import WatchEffect from '@/components/WatchEffect.vue'
export default {
name: 'HomeView',
components: {
WatchEffect,
},
setup () {
const msgRef = ref('123')
return {
msgRef
}
}
}
</script>
// jsx 組件名稱不可變,要和引入名字保持一致
import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'
export default defineComponent(() => {
const countRef = ref(300)
const render = () => {
return <>
<p>DEMO2--{countRef.value}</p>
<JSXChild a={countRef.value + 100}></JSXChild>
</>
}
return render
})2.3 屬性和事件
template 區(qū)分屬性和事件的寫法,jsx 不區(qū)分
// jsx 屬性和事件的寫法一樣
import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'
export default defineComponent(() => {
const countRef = ref(300)
function onChange () {
console.log('onChange')
}
const render = () => {
return <>
<p>DEMO2--{countRef.value}</p>
<JSXChild a={countRef.value + 100} change={onChange}></JSXChild>
</>
}
return render
})2.4 條件和循環(huán)
條件 template 使用 v-if 指令,jsx 在表達(dá)式中使用 && (類似 if( a && b))
// template v-if
<template>
<p v-if="flagRef">template demo</p>
<button @click="changeFlagRef">click</button>
</template>
<script>
import { ref } from 'vue'
export default {
setup () {
const flagRef = ref(true)
function changeFlagRef () {
flagRef.value = !flagRef.value
}
return {
flagRef,
changeFlagRef
}
}
}
</script>
// jsx &&符號(hào)判斷
import { defineComponent, ref } from 'vue'
import JSXChild from './JSXChild.jsx'
export default defineComponent(() => {
const flagRef = ref(true)
function changeFlagRef () {
flagRef.value = !flagRef.value
}
const render = () => {
return <>
<p onClick={changeFlagRef}>DEMO2--{flagRef.value.toString()}</p>
{flagRef.value && <JSXChild a={flagRef.value}></JSXChild>}
</>
}
return render
})循環(huán) template 使用 v-for 指令,jsx 使用數(shù)組的 .map 函數(shù)
// template v-for
<template>
<ul>
<li v-for="item in state.list" :key="item">{{ item }}</li>
</ul>
</template>
<script>
import { reactive } from 'vue'
export default {
setup () {
const state = reactive({
list: ['a', 'b', 'c']
})
return {
state
}
}
}
</script>
// jsx 數(shù)組 .map 函數(shù)
import { defineComponent, reactive } from 'vue'
export default defineComponent(() => {
const state = reactive({
list: ['a1', 'b1', 'c1']
})
const render = () => {
return <>
<ul>
{state.list.map(item => <li>{item}</li>)}
</ul>
</>
}
return render
})3. JSX 和 slot (體會(huì) JSX 的優(yōu)越性)
- slot 是 Vue 發(fā)明的概念,為了完善 template 的能力
- slot 一直是 Vue 初學(xué)者的“噩夢”,特別是:作用域 slot
- 但使用 JSX 將很容易理解,因?yàn)?JSX 本質(zhì)就是 js
總結(jié)
到此這篇關(guān)于Vue3使用JSX的文章就介紹到這了,更多相關(guān)Vue3使用JSX內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目前端加前綴(包括頁面及靜態(tài)資源)的操作方法
這篇文章主要介紹了vue項(xiàng)目前端加前綴(包括頁面及靜態(tài)資源)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
使用VUE實(shí)現(xiàn)一鍵復(fù)制內(nèi)容功能
這篇文章主要介紹了使用VUE實(shí)現(xiàn)一鍵復(fù)制內(nèi)容功能,功能就是當(dāng)我們點(diǎn)擊復(fù)制按鈕時(shí),會(huì)提示“復(fù)制成功”,這樣復(fù)制的內(nèi)容就可以在其他地方使用了,感興趣的朋友可以學(xué)習(xí)一下2023-04-04
vue?ElementUI級(jí)聯(lián)選擇器回顯問題解決
這篇文章主要介紹了vue?ElementUI級(jí)聯(lián)選擇器回顯問題解決,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
vue3+luckysheet實(shí)現(xiàn)在線編輯Excel的項(xiàng)目實(shí)踐
本文介紹了使用Luckysheet實(shí)現(xiàn)在線Excel表格功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
Vue項(xiàng)目從webpack3.x升級(jí)webpack4不完全指南
前段時(shí)間,泡面將自己的一個(gè)Vue-cli構(gòu)建的前端框架從webpack3.x升級(jí)到了4.x版本,現(xiàn)在才拉出來記錄一下,已備忘之用,也和大家分享一下,需要的朋友可以參考下2019-04-04
利用vue+turn.js實(shí)現(xiàn)翻書效果完整實(shí)例
這篇文章主要給大家介紹了關(guān)于利用vue+turn.js實(shí)現(xiàn)翻書效果的相關(guān)資料,turn.js是使用了jquery書寫的,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
vue for循環(huán)出來的數(shù)據(jù)實(shí)現(xiàn)用逗號(hào)隔開
HTML(HyperText Markup Language)是用于創(chuàng)建網(wǎng)頁的標(biāo)準(zhǔn)標(biāo)記語言,正確的HTML編碼和結(jié)構(gòu)對(duì)于網(wǎng)頁的正確顯示至關(guān)重要,當(dāng)HTML代碼正確無誤時(shí),網(wǎng)頁的效果圖將與設(shè)計(jì)師的預(yù)期相符,反之則可能出現(xiàn)布局錯(cuò)亂、樣式失效等問題2024-10-10

