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>
)
}

在Vue2和Vue3中JSX的使用集锦的更多相关文章

  1. 如何在 vue3 中使用 jsx/tsx?

    我们都知道,通常情况下我们使用 vue 大多都是用的 SFC(Signle File Component)单文件组件模式,即一个组件就是一个文件,但其实 Vue 也是支持使用 JSX 来编写组件的.这 ...

  2. Vue2 到 Vue3,重温这 5 个常用的 API

    距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等.虽然目前大多数开发者们在使用的仍旧以Vue2为准,但Vue3显然是Vue开发者们未来必须面对的,而且前不久V ...

  3. 【转载】vue3 中如何像 vue2 的 extend 一样挂载未挂载的组件,拿到标签本身($el)

    原文地址:https://blog.csdn.net/qq_39953537/article/details/110437554 vue3 中如何像 vue2 的 extend 一样挂载未挂载的组件, ...

  4. Module Federation 模块联邦 在Vue3中使用Vue2搭建的微服务

    前言: 备注:本文基于对webpack Module Federation有一定了解的情况下 一般情况下使用模块联邦都是会使用相同的版本,如Vue2的组件时在Vue2中使用,但我为什么会在Vue3项目 ...

  5. 关于在vue3中使用vuex与在vue2中使用vuex的区别

    首先vue2中vuex版本是4.x以下,vue3中使用vuex需要保证vuex版本在4.x及以上. 以下说一说怎么在vue3中使用vuex,与vue2大同小异 首先在views新建一个store文件夹 ...

  6. vue2.x/vue3.0中使用ts

    vue2.x(vue-cli3)中使用ts      https://www.jianshu.com/p/3cbcdd766295 https://www.cnblogs.com/xiaohuizha ...

  7. vue3中使用axios如何去请求数据

    在vue2中一般放在created中,但是在vue3中取消了created生命周期,请求方式有两种 直接在setup中去获取数据 setup(props) { const data = reactiv ...

  8. vue3中watch函数

    watch 监听普通类型 let count = ref(1); const changeCount = () => { count.value+=1 }; watch(count, (newV ...

  9. vue 3 学习笔记 (七)——vue3 中 computed 新用法

    vue3 中 的 computed 的使用,由于 vue3 兼容 vue2 的选项式API,所以可以直接使用 vue2的写法,这篇文章主要介绍 vue3 中 computed 的新用法,对比 vue2 ...

  10. 在vue3中使用router-link-active遇到的坑

    在使用 router-link-active 设置链接激活时CSS类名时,发现在例如 /member/order 和 /member/order/:id 这两个都包含 /member/order的路由 ...

随机推荐

  1. python学习之-------OS 文件夹和文件操作

    # OS模块 :查看一个文件夹下所有文件,这个文件夹有文件夹,不能用walk# -- coding: UTF-8 --import osimport sys#C:\Users\Administrato ...

  2. qq飞车端游最全按键指法教学

    目录 起步篇 超级起步 弹射起步 段位起步 基础篇 点飘 撞墙漂移 撞墙点喷 进阶篇 双喷 叠喷 断位漂移 段位双喷 侧身漂移 快速出弯 CW WCW CWW 牵引 甩尾点飘 甩尾漂移 右侧卡 左侧卡 ...

  3. tar 命令压缩时报错 Removing leading `/' from member names 解决方法

    原文:https://www.cnblogs.com/operationhome/p/9802554.html 在使用tar命令进行压缩打包的时候我们常常会遇到下面的错误.虽然它不会影响我们最后的压缩 ...

  4. 为什么 Biopython 的在线 BLAST 这么慢?

    用过网页版本 BLAST 的童鞋都会发现,提交的序列比对往往在几分钟,甚至几十秒就可以得到比对的结果:而通过调用 API 却要花费几十分钟或者更长的时间!这到底是为什么呢? NCBIWWW 基本用法 ...

  5. JavaWeb入门必备JavaEE规范!

    前言 对于学习 Java 的同学,大都是 Web 方向的.我们学习 JavaWeb 开发肯定是一个循序渐进的过程,学习前有一些前置知识要掌握,比如 JavaSE 相关知识,HTML.CSS.JavaS ...

  6. Gitlab版本升级

    Gitlab docker部署命令 docker run -d -p 8443:443 -p 30080:80 -p 9444:22 --name gitlab --restart always \ ...

  7. JavaScript 显示数据

    JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML ...

  8. Typora 主题Mo Dark 样式

    Mo Dark 主题样式 html { font-size: 16px; } /*加粗字体样式*/ strong { -webkit-background-clip: text; -webkit-te ...

  9. Apple、AWS 这些科技巨头,已悄然入局隐私计算

    随着数字化时代的到来,数据已经成为企业竞争的重要资源.然而,与此同时,数据隐私泄露的风险也在不断增加,这已经成为了公共安全和个人权利保护的重要问题.为了解决这个问题,科技巨头谷歌.苹果.亚马逊纷纷入局 ...

  10. 2 opencv-python核心库模块core

    core模块定义了opencv中的基础数据结构和基础运算,是整个库的核心模块.而mat数据结构是opencv中最重要的数据结构,是opencv中图像最常用的存储格式. 1 基本数据结构 opencv的 ...