Vue2安裝JSX支持 有時候,我們使用渲染函數(render function)來抽象組件,而渲染函數使用Vue的h函數來編寫Dom元素相對template語法差別較大,體驗不佳,這個時候就派 JSX 上場了。然而在Vue3中預設是帶了JSX支持的,而在 Vue2 中使用 JSX,需要安裝並使用 ...
Vue2安裝JSX支持
有時候,我們使用渲染函數(render function)來抽象組件,而渲染函數使用Vue的h函數來編寫Dom元素相對template語法差別較大,體驗不佳,這個時候就派 JSX 上場了。然而在Vue3中預設是帶了JSX支持的,而在 Vue2 中使用 JSX,需要安裝並使用 Babel 插件:
- @vue/babel-preset-jsx
- @vue/babel-helper-vue-jsx-merge-props
安裝腳本
npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
配置.babelrc文件
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset',
['@vue/babel-preset-jsx',
{
'injectH': false
}]
]
}
template和JSX的使用差異
針對方向
變數綁定
變數綁定由data中的數據由 v-model="value"變為 v-model={this.value}
template語法
<el-input v-model="value" />
JSX語法
<el-input v-model={this.value} />
事件綁定
變數綁定由data中的數據由 @input="inputChange"或v-on:input="inputChange"變為 onInput={this.inputChange}或on-input={this.inputChange}
template語法
<el-input v-model="value" @input="inputChange" v-on:click="inputClick" />
JSX語法
<el-input v-model={this.value} onInput={this.inputChange} on-click={this.inputClick} />
條件渲染
條件渲染由 v-if變為插入JSX 語句段
template語法
<el-input v-model="value" v-if="show" @input="inputChange" v-on:click="inputClick" />
JSX語法
{
if(this.show){
return <el-input v-model={this.value} onInput={this.inputChange} on-click={this.inputClick} />
}
}
列表渲染
變數綁定由data中的數據由 v-for變為插入JSX 語句段
template語法
<el-select v-model={this.form.formula} clearable>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.label">
</el-option>
</el-select>
JSX語法
<el-select v-model={this.form.formula} clearable>
{
this.options.map(item =>{
return (
<el-option
key={item.value}
label={item.label}
value={item.value}>
</el-option>
)
}
}
</el-select>
插槽的使用
命名插槽
組件名稱:BaseLayout
template語法
<div class="container">
<header>
<!-- 具名插槽 -->
<slot name="header"></slot>
</header>
<main>
<!-- 匿名插槽 -->
<slot></slot>
<!-- 作用域插槽 -->
<slot :main="mainData"></slot>
</main>
<footer>
<!-- 具名插槽 -->
<slot name="footer"></slot>
</footer>
</div>
JSX語法
註意:$slots在Vue2.6版本起才支持,在之前使用的是$slotScopeds
<div class="container">
<header>
{
//具名插槽
this.$slots.header
}
</header>
<main>
{
//匿名插槽
this.$slots.default
}
{
//作用域插槽
() => this.$slots.main(this.mainData)
}
</main>
<footer>
{
//具名插槽
this.$slots.footer
}
</footer>
</div>
使用插槽
template語法
<base-layout>
<template #header>
<div>我是頭部</div>
</template>
<template #default>
<div>匿名插槽</div>
</template>
<!-- vue2.6之後使用方式 -->
<template #main="mainData">
<div>作用域插槽:{{mainData}}</div>
</template>
<!-- vue2.6之前使用 -->
<template slot="main" slot-scope="mainData">
<div>作用域插槽:{{mainData}}</div>
</template>
<template #footer>
<div>具名插槽</div>
</template>
</base-layout>
JSX語法
<!-- vue2.6之後使用方式 -->
<base-layout>
{{
default: () => <div>匿名插槽</div>,
header: () => <div>我是頭部</div>,
main: (mainData) => <div>作用域插槽:{mainData}</div>,
footer: () => <div>具名插槽</div>
}}
</base-layout>
<!-- vue2.6之前使用方式 -->
<base-layout
slotScoped={{
default: () => <div>匿名插槽</div>,
header: () => <div>我是頭部</div>,
main: (mainData) => <div>作用域插槽:{mainData}</div>,
footer: () => <div>具名插槽</div>
}}>
</base-layout>
JSX中el-form
el-form需要綁定通過props={{ model:this.form}}來綁定form對象,不能使用model={this.form} ,否則就會出現報錯Invalid handler for event “input“: got undefined
render(h){
return (
<el-form
ref="elForm"
class="rule-form"
props={{ model:this.form}} >
</el-form>
)
}