在Vue2和Vue3中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

安装脚本

cmd 复制代码
npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props

配置.babelrc文件

javascript 复制代码
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语法

javascript 复制代码
<el-input v-model="value" />

JSX语法

javascript 复制代码
<el-input v-model={this.value} />

事件绑定

变量绑定由data中的数据由 @input="inputChange"或v-on:input="inputChange" 变为 onInput={this.inputChange}或on-input={this.inputChange}

template语法

javascript 复制代码
<el-input v-model="value" @input="inputChange" v-on:click="inputClick" />

JSX语法

javascript 复制代码
<el-input v-model={this.value} onInput={this.inputChange} on-click={this.inputClick} />

条件渲染

条件渲染由 v-if变为插入JSX 语句段

template语法

javascript 复制代码
<el-input v-model="value" v-if="show" @input="inputChange" v-on:click="inputClick" />

JSX语法

javascript 复制代码
{
	if(this.show){
		return <el-input v-model={this.value} onInput={this.inputChange} on-click={this.inputClick} />
	}
}

列表渲染

变量绑定由data中的数据由 v-for变为插入JSX 语句段

template语法

javascript 复制代码
<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语法

javascript 复制代码
<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语法

html 复制代码
<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

javascript 复制代码
<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语法

html 复制代码
<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语法

html 复制代码
<!-- 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

javascript 复制代码
render(h){
    return (
	    <el-form
	        ref="elForm"
	        class="rule-form"
	        props={{ model:this.form}} >
	    </el-form>
    )
}
相关推荐
故事不长丨13 小时前
【Java SpringBoot+Vue 实现视频文件上传与存储】
java·javascript·spring boot·vscode·后端·vue·intellij-idea
咚咚咚小柒21 小时前
【前端】Webpack相关(长期更新)
前端·javascript·webpack·前端框架·node.js·vue·scss
老华带你飞2 天前
房屋租赁|房屋出租|房屋租赁系统|基于Springboot的房屋租赁系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·vue·论文·毕设·房屋租赁系统
前端摸鱼匠2 天前
Vue 3 事件修饰符全解析:从 .stop 到 .passive,彻底掌握前端交互的艺术
前端·vue.js·node.js·vue·交互
Crazy Struggle2 天前
.NET 8.0 + Vue 企业级在线培训系统(开源、免费、支持多种主流数据库)
vue·.net 8.0·后台管理系统
韩立学长3 天前
【开题答辩实录分享】以《植物病虫害在线答疑小程序的设计与实现》为例进行答辩实录分享
spring boot·小程序·vue
whltaoin3 天前
【JAVA全栈项目】弧图图-智能图床 SpringBoot+Vue3 :[框架开荒:一文全步骤打通前后端项目全流程]
java·spring boot·vue·开源项目·全栈·cos
清灵xmf5 天前
Vue + TSX 中使用 class 报错 解决方法
vue
专注前端30年6 天前
Vue2 中 v-if 与 v-show 深度对比及实战指南
开发语言·前端·vue
专注前端30年6 天前
【Vue2】基础知识汇总与实战指南
开发语言·前端·vue