如何在vue中使用jsx語(yǔ)法
為什么需要在vue中使用jsx
幾年前面試的時(shí)候,被問(wèn)過(guò)這個(gè)問(wèn)題,當(dāng)時(shí)我一臉懵,這兩個(gè)東西為啥要混用呢?
直到后來(lái),我遇到了這種場(chǎng)景。
tab切換展示組件,大部分組件展示表格,除了2個(gè)tab需要展示不同,這個(gè)不同,怎么處理呢?
當(dāng)然可以直接改封裝的tab組件,v-if條件渲染嘛
那如果后面再有其他需求,tab組件繼續(xù)寫if么
這個(gè)時(shí)候,組件就過(guò)于冗余啦
那怎么讓組件統(tǒng)一處理呢?當(dāng)然可以用render函數(shù)來(lái)抽象組件啦
render函數(shù)寫法有多惡心,想必大家都知道 => 不知道的看段簡(jiǎn)單的ul,li布局

with(this){ // this 就是 vm return _c( 'div', { attrs:{"id":"app"} }, [ _c( 'div', [ _c( 'input', { directives:[ { name:"model", rawName:"v-model", value:(title), expression:"title" } ], domProps:{ "value":(title) }, on:{ "input":function($event){ if($event.target.composing)return; title=$event.target.value } } } ), _v(" "), (!title) ? _c( 'button', { on:{ "click":add } }, [_v("submit")] ): _e() ] ), _v(" "), // 空字符串節(jié)點(diǎn) _c('div', [ _c( 'ul', _l((list),function(item){return _c('li',[_v(_s(item))])}) ) ] ) ] ) }這...日子沒(méi)法過(guò)了
于是我們就發(fā)現(xiàn)了jsx的好用,同樣上述代碼,可讀性更高,更加精簡(jiǎn)
在vue中如何使用jsx
主要是依賴babel插件
- 安裝babel依賴,
npm install babel-plugin-transform-vue-jsx babel-helper-vue-jsx-merge-props - 配置.babelrc文件
"plugins": [ [ "transform-vue-jsx" ] ] - 子組件是函數(shù)式組件
// content.js
export default {
name: 'content',
functional: true,
props: {
render: Function,
column: {
type: Object,
default: null
},
params: {
type: Object,
default: () => {}
}
},
render: (h, ctx) => {
const params = ctx.props.params
return ctx.props.render && ctx.props.render(h, params)
}
}- 父組件引入
<el-tabs
v-model="activeName">
<el-tab-pane
v-for="item in tabList"
:key="item.code"
:label="item.label">
<span v-if="item.render">
<content
:params="item.params"
:render="item.render"
></content>
</span>
</el-tab-pane>
</el-tabs>
<script>
import Content from './content'
components: {
Content
},
</script>template轉(zhuǎn)jsx的語(yǔ)法轉(zhuǎn)換
v-model,v-if,v-for,v-html,v-text,vue中的指令
- jsx語(yǔ)法是不會(huì)有對(duì)應(yīng)的指令的,所以我們就要實(shí)現(xiàn)這些指令的功能,對(duì)于
v-model
// 在vue中
<el-input
v-model="searchParams.searchVal">
</el-input>
// 對(duì)應(yīng)jsx語(yǔ)法
function _input (value) {
this.searchParams.searchVal = value
},
item.render = (h, params) => {
// 這里也可以從params傳入?yún)?shù)
return (
<el-input
value={this.searchParams.searchVal}
onInput={_input}>
</el-input>
)
}v-if其實(shí)就是判斷語(yǔ)句,用&&或三元表達(dá)式
// 在vue中
<el-button v-if="show"></el-button>
// 對(duì)應(yīng)jsx語(yǔ)法
item.render = (h, params) => {
return (
this.show && <el-button></el-button>
)
}v-for其實(shí)就是循環(huán)語(yǔ)句,用map
// 在vue中
<ul>
<li v-for="item in list">{{item.label}}</li>
</ul>
// jsx語(yǔ)法
item.render = (h, params) => {
return (
<ul>
{
list.map((item, index) => (
<li>{item.label}</li>
)
}
</ul>
)
}
v-html
item.render = (h, params) {
return (
<div> <div domPropsInnerHTML={htmlStr}></div> </div>
)
}vue中el-input組件上觸發(fā)原生enter事件,@keyup.enter.native對(duì)應(yīng)nativeOnKeyup
// 在vue中
<el-input
@keyup.enter.native="onSearch"
></el-input>
// 在jsx中
item.render = (h, params) => {
function _keyup (e) {
if (e.keyCode === 13) {
// 13為enter鍵的鍵盤碼
this.onSearch()
}
}
return (
<el-input
nativeOnKeyup={e => _keyup(e)}>
</el-input>
)
}vue中的插槽,在jsx中用scopedSlots
// 在vue中
<el-table
:data="tableData">
<el-table-column
v-for="column in columnData"
:key="column.value"
:prop="column.value"
:label="column.value"
sortable
:sort-change="change">
<template slot-scope="scope">
<span>{{scope.row[column.value]}}</span>
</template>
</el-table-column>
</el-table>
// 在jsx中
item.render = (h, params) => {
return (
<el-table
data={tableData}>
{
columnData.map((column, index) => (
<el-table-column
prop={column.value}
label={column.label}
sortable
onSort-change={(...args) => sortChange(...args)}
scopedSlots={{
default: (scope) => <span>{scope.row[column.value]}</span>
}}>
</el-table-column>
))
}
</el-table>
)
}組件用-分隔的事件,在jsx中在第一段on后大寫即可觸發(fā)
比如el-table的sort-change,在jsx中是onSort-change,第一段在on后大寫即可,見(jiàn)上個(gè)例子
到此這篇關(guān)于如何在vue中使用jsx語(yǔ)法的文章就介紹到這了,更多相關(guān)vue使用jsx語(yǔ)法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Vue響應(yīng)式數(shù)據(jù)已獲取而視圖不更新的問(wèn)題
這篇文章主要介紹了解決Vue響應(yīng)式數(shù)據(jù)已獲取而視圖不更新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Vue中ElementUI分頁(yè)組件Pagination的使用方法
這篇文章主要為大家詳細(xì)介紹了Vue中ElementUI分頁(yè)組件Pagination的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
vue項(xiàng)目index.html中使用環(huán)境變量的代碼示例
在Vue3中使用環(huán)境變量的方式與Vue2基本相同,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目index.html中使用環(huán)境變量的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
Composition API思想封裝NProgress示例詳解
這篇文章主要為大家介紹了Composition API思想封裝NProgress示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Vue3 setup語(yǔ)法糖銷毀一個(gè)或多個(gè)定時(shí)器(setTimeout/setInterval)
這篇文章主要給大家介紹了關(guān)于Vue3 setup語(yǔ)法糖銷毀一個(gè)或多個(gè)定時(shí)器(setTimeout/setInterval)的相關(guān)資料,vue是單頁(yè)面應(yīng)用,路由切換后,定時(shí)器并不會(huì)自動(dòng)關(guān)閉,需要手動(dòng)清除,當(dāng)頁(yè)面被銷毀時(shí),清除定時(shí)器即可,需要的朋友可以參考下2023-10-10
Vue實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12

