在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
安装脚本
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的使用集锦的更多相关文章
- 如何在 vue3 中使用 jsx/tsx?
我们都知道,通常情况下我们使用 vue 大多都是用的 SFC(Signle File Component)单文件组件模式,即一个组件就是一个文件,但其实 Vue 也是支持使用 JSX 来编写组件的.这 ...
- Vue2 到 Vue3,重温这 5 个常用的 API
距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等.虽然目前大多数开发者们在使用的仍旧以Vue2为准,但Vue3显然是Vue开发者们未来必须面对的,而且前不久V ...
- 【转载】vue3 中如何像 vue2 的 extend 一样挂载未挂载的组件,拿到标签本身($el)
原文地址:https://blog.csdn.net/qq_39953537/article/details/110437554 vue3 中如何像 vue2 的 extend 一样挂载未挂载的组件, ...
- Module Federation 模块联邦 在Vue3中使用Vue2搭建的微服务
前言: 备注:本文基于对webpack Module Federation有一定了解的情况下 一般情况下使用模块联邦都是会使用相同的版本,如Vue2的组件时在Vue2中使用,但我为什么会在Vue3项目 ...
- 关于在vue3中使用vuex与在vue2中使用vuex的区别
首先vue2中vuex版本是4.x以下,vue3中使用vuex需要保证vuex版本在4.x及以上. 以下说一说怎么在vue3中使用vuex,与vue2大同小异 首先在views新建一个store文件夹 ...
- vue2.x/vue3.0中使用ts
vue2.x(vue-cli3)中使用ts https://www.jianshu.com/p/3cbcdd766295 https://www.cnblogs.com/xiaohuizha ...
- vue3中使用axios如何去请求数据
在vue2中一般放在created中,但是在vue3中取消了created生命周期,请求方式有两种 直接在setup中去获取数据 setup(props) { const data = reactiv ...
- vue3中watch函数
watch 监听普通类型 let count = ref(1); const changeCount = () => { count.value+=1 }; watch(count, (newV ...
- vue 3 学习笔记 (七)——vue3 中 computed 新用法
vue3 中 的 computed 的使用,由于 vue3 兼容 vue2 的选项式API,所以可以直接使用 vue2的写法,这篇文章主要介绍 vue3 中 computed 的新用法,对比 vue2 ...
- 在vue3中使用router-link-active遇到的坑
在使用 router-link-active 设置链接激活时CSS类名时,发现在例如 /member/order 和 /member/order/:id 这两个都包含 /member/order的路由 ...
随机推荐
- GIT多场景下使用
git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便.但找工作面试和一些需彰显个人实力的场景, ...
- 使用git 将本地代码上传码市私用仓库操作
1 现在在登录码市建立项目 2 本地建立一个文件夹,然后使用git bash 3 初始化本地库 git init 4,进入刚刚在码云新建的项目里,复制框框里的路径 5,然后在回到本地新建的 ...
- 【问题解决】 网关代理Nginx 301暴露自身端口号
一般项目上常用Nginx做负载均衡和静态资源服务器,本案例中项目上使用Nginx作为静态资源服务器出现了很奇怪的现象,我们一起来看看. "诡异"的现象 部署架构如下图,Nginx作 ...
- docker-compose多服务器部署ELK
多服务器构建ELK es使用1主2从,logstash转发,kibana展现,本文ELK版本使用7.16.1 如果单机测试,请查看docker-compose单服务器部署ELK es-master:1 ...
- 曲线艺术编程 coding curves 第十二章 超级椭圆与超级方程(Superellipses and Superformulas)
第十三章 超级椭圆与超级方程(Superellipses and Superformulas) 原作:Keith Peters https://www.bit-101.com/blog/2022/11 ...
- 【后端面经-Java】HashMap详解
目录 1. HashMap的家族定位 2. HashMap的数据结构 2.1 Hash表的基本概念 2.2 Hash冲突 2.3 HashMap数据结构 3. HashMap的重要变量 3.1 常量 ...
- C++面试八股文:std::array如何实现编译器排序?
某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官:array熟悉吗? 二师兄:你说的是原生数组还是std::array? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生 ...
- PostgreSQL 12 文档: SQL 语法
SQL 命令 这部分包含PostgreSQL支持的SQL命令的参考信息.每条命令的标准符合和兼容的信息可以在相关的参考页中找到. 目录 ABORT - 中止当前事务 ALTER AGGREGATE ...
- Blazor前后端框架Known-V1.2.2
V1.2.2 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. 概述 基于C#和Blazor实现的快速开发框架,前后端分离,开箱即用. 跨平台,单 ...
- [ESP] 使用Ayla API Reference配网和连Ayla云
示例用的文档及链接 US Dev Dashboard(查看oem-id和oem-key) https://dashboard-dev.aylanetworks.com/ Ayla API Refere ...