有时候,我们使用渲染函数(render function)来抽象组件,而渲染函数使用Vue的h函数来编写Dom元素相对template语法差别较大,体验不佳,这个时候就派 JSX 上场了。然而在Vue3中默认是带了JSX支持的,而在 Vue2 中使用 JSX,需要安装并使用 Babel 插件:
npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
module.exports = { presets: [ '@vue/cli-plugin-babel/preset', ['@vue/babel-preset-jsx', { 'injectH': false }] ] }
变量绑定由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>
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> ) }