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. 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)

    文章首发 [重学C++]05 | 说透右值引用.移动语义.完美转发(下) 引言 大家好,我是只讲技术干货的会玩code,今天是[重学C++]的第五讲,在第四讲<[重学C++]04 | 说透右值引 ...

  2. 驱动开发:内核LoadLibrary实现DLL注入

    远程线程注入是最常用的一种注入技术,在应用层注入是通过CreateRemoteThread这个函数实现的,该函数通过创建线程并调用 LoadLibrary 动态载入指定的DLL来实现注入,而在内核层同 ...

  3. Gazebo、Rviz 结合 ORB-SLAM3 实现运动规划及定位

    博客地址:https://www.cnblogs.com/zylyehuo/ 基于以下内容,详见博客链接 基于机器人自主移动实现SLAM建图 - zylyehuo - 博客园 (cnblogs.com ...

  4. LeetCode 周赛 350(2023/06/18)01 背包变型题

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 348 场 · 数位 DP ...

  5. 写博文之必备技能MarkDown

    前言 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版.它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML.PDF 以及本身的 .md 格式的文 ...

  6. 这样看C函数才对

    什么是函数?从定义来看,函数就是一段可以重复使用的代码块,比如下面这样 void hanshu() { int a = 0; int b = 3; } 这时候就应该有人要跳出来了,这是什么**!确实, ...

  7. 零基础如何自学C#?

    前言 本文来源于知乎的一个提问,提问的是一个大一软件工程专业的学生,他想要自学C#但是不知道该怎么去学,这让他感到很迷茫,希望有人能给他一些建议和提供一些学习方向. 个人建议 确认目标:自学C#首先你 ...

  8. 【技术积累】JavaScript中的基础语法【二】

    JavaScript编写方式 JavaScript是一种脚本语言,用于为网页添加交互性和动态功能.它可以直接嵌入到HTML中,并通过浏览器解释执行.下面是一些常见的JavaScript编写方式和相应的 ...

  9. TrustZone——(一)

    本文内容主要来源于网络,综合了网上的多篇文章,也加入了一些自己的理解,重新组织了文章结构使其便于理解. 主要参考的文章包括: 一篇了解TrustZone TrustZone领域先行者 TrustZon ...

  10. 【持续更新】C++ 并不完全是 C 的超集!

    一些容易被忽略的 C 与 C++ 的不兼容特性 头文件和命名空间 C 标准库头文件名在 C++ 中通常去除扩展名,并加上 c 前缀,如: stdio.h -> cstdio stdlib.h - ...