如何在 Vue 中使用 JSX 以及使用它的原因
myzbx 2025-06-13 15:33 5 浏览
作者:JT 译者:前端小智 来源:https://scotch.io/
Vue.js 具有简单的 API 和几个选项,可用于在我们的组件中定义HTML模板。
我们可以使用<template>标签选项,在根组件实例上定义template属性,或者使用单文件组件。
上面的选项很棒并且可以完美地工作,但是,在您的应用程序的生命周期中,有时会感到笨拙,设计过度或非常不灵活。
那么,我们为什么要使用 JSX 而不是其他模板定义呢?
- JSX 更易读, 的写法一看就是比 this.$createElement('div', {}, […])简洁很多。
- JSX 也是 JavaScript。
- Vue支持JSX。
- JSX 使自定义 Vue 组件更容易导入和管理。
简介
先举一个例子来说明为什么 JSX 是好的。
我们要构建一个<TextField/>组件,该组件可以是普通的单行文本输入或多行输入(文本区域)。我们的模板声明可能看起来像这样。
typeof 10;
// => 'number'typeof 'Hello'; // => 'string'typeof false; // => 'boolean'typeof { a: 1 }; // => 'object'typeof undefined; // => 'undefined'typeof Symbol(); // => 'symbol'
从上面的代码片段中可以看到,我们很快就会遇到一些问题,比如重复代码等等。想象一下,必须支持input上面所列的各种属性。上面的这个小片段将会增长并成为一个难以维护的噩梦。
要解决这个问题,我们需要使用Vue进行降级处理,因此需要使用理接近Vue的内部API来解决这个问题。
render() 方法
注意:这里并不是说没有JSX就没有一种简单的方法来处理上面的问题,只是说将这个逻辑移动到带有JSX的render()方法可以使组件更直观。
我们在 Vue 中创建的每个组件都有一个render方法。这个就是 Vue 选择渲染组件的地方。即使我们不定义这个方法,Vue 也会为我们做这件事。
这意味着当我们在 Vue 中定义 HTML 模板时,Vue 的模板编译器将其编译为一个createElement函数,该函数带有几个参数并从render函数返回结果。
为了修复上一节中的代码,我们删除了template属性或template标签,并在组件上定义了render()方法。如果在组件上定义了render方法,则 Vue 将忽略template定义。
class Cat { }const myCat = new Cat();myCat instanceof Cat; // => true
上面的代码做了几件事:
- render方法从Vue获取一个createElement助手。
- 我们以编程方式定义我们的标签。
- 然后,我们创建标签并将其属性,类等作为对象传递。我们可以传递给createElement的选项很多。
- 我们返回新创建的元素进行渲染。
我们为 Vue 组件定义的每个模板都将转换为可返回createElement函数的render方法。因为这个原因,render方法将优先于模板定义。
举个例子:
// HTML
<div>
<p>Only you can stop forest fires</p>
</div>
模板编译器将把上面的 HTML 转换成:
...
render (createElement) {
return createElement(
'div',
{},
createElement(
'p',
{},
'Only you can stop forest fires'
)
)
}
...
现在你可能会问这个问题:“对可读性来说这不好吗?” 答案是肯定的。一旦定义了具有许多元素嵌套级别或具有多个同级元素的组件,我们就会遇到这个新问题。
这就是 JSX 出现的原因,它可以很好的解决此类问题。
JSX 是什么
JSX 是 Facebook 工程团队创造的一个术语。
JSX 是 JavaScript 的类似XML的语法扩展,没有任何定义的语义。
JSX 不打算由引擎或浏览器实现。相反,我们将使用 Babel 之类的转置器将JSX转换成常规的 JS 。
// 此行是JSX的示例
const heading = <h1>Welcome to Scotch</h1>;
基本上,JSX 允许我们在 JS 中使用类似 Html 的语法。
配置 Vue 以使用 JSX
如果使用的 Vue-cli 大于或等于 3.0 版本,那么就直接可以使用JSX的语法了。
如果您使用的是不支持 JSX 的Vue-cli较旧版本,则可以通过安装babel-preset-vue-app来添加它,并将其添加到您的.babelrc文件中。
# Using npm
npm install --save-dev babel-preset-vue-app
# Using yarn
yarn add --dev babel-preset-vue-app
在.babelrc文件中,添加:
{
"presets": ["vue-app"]
}
我们现在可以在组件的render函数中使用 JSX。
在 Vue 中使用 JSX 需要注意的地方
在 Vue 中使用JSX需要注意几点。
要监听 JSX 中的事件,我们需要“on”前缀。例如,将onClick用于单击事件。
render (createElement) {
return (
<button onClick={this.handleClick}></button>
)
}
要修改事件,请使用
render (createElement) {
return (
<button onClick:prevent={this.handleClick}></button>
)
}
绑定变量,注意这里不是使用 :
render (createElement) {
return (
<button content={this.generatedText}></button>
)
}
将HTML字符串设置为元素的内容,使用domPropsInnerHTML而不是使用v-html
render (createElement) {
return (
<button domPropsInnerHTML={htmlContent}></button>
)
}
我们也可以展开一个大对象:
render (createElement) {
return (
<button {...this.largeProps}></button>
)
}
在 render 中使用JSX
回到我们最初的“TextField”组件。现在我们已经在 Vue 应用程序中启用了 JSX,我们现在可以这样做了。
render (createElement) {
const inputAttributes = {
class: 'input-field has-outline', // class definition
onClick: this.handleClick // event handler
backdrop: false // custom prop
}
const inputMarkup = this.multiline
? <textarea {...inputAttributes}></textarea>
: <input {...inputAttributes}/>
return inputMarkup
}
导入 Vue JS 组件
在 Vue 中使用JSX的另一个好处是,我们不再需要注册所需的每个组件。我们只是导入和使用。
import {Button} from '../components'
export default {
render (createElement) {
return <Button primary={true}>Edit</Button>
}
}
如何使 JSX 与 TypeScript 一起使用
TypeScript 用作一种向 JavaScript添加类型检查的机制。要在 JSX 支持 TypeScript中,需要修改 tsconfig.json。
要在 TypeScript 中启用 JSX,请先将该文件另存为.tsx文件,然后将tsconfig.json修改为包括:
{
"compilerOptions": {
....
"jsx": "preserve",
}
}
将jsx选项设置为“preserve”意味着 TypeScript 不应处理JSX。这样做使 Babel 可以控制所有JSX 和 TypeScript 坚持使用类型,因为它尚不支持 Vue JSX。
然后在项目中创建一个jsx.d.ts文件,并为 Vue 添加 TypeScript JSX 声明。
import Vue, {VNode} from 'vue'
declare global {
namespace JSX {
interface Element extends VNode {}
interface ElementClass extends Vue {}
interface ElementAttributesProperty {
$props: {}
}
interface IntrinsicElements {
[elemName: string]: any
}
}
}
确保 TypeScript 可以加载声明文件。或者,可以通过以下方式在tsconfig.json中为其添加自动加载功能:
{
"compilerOptions": {
...
"typesRoot": ["./node_modules/@types", "./types"]
}
}
原文:
https://scotch.io/tutorials/using-jsx-with-vue-and-why-you-should-care
相关推荐
- vue 基础-组件中事件的触发和监听
-
前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)vue中单纯的事件调用,你一定不陌生...
- JMH基准测试和JMH-Visual-chart可视化
-
原文地址:https://github.com/Sayi/sayi.github.com/issues/68如何度量一段代码的性能,换种实现方式会有更佳的性能表现吗?你或许想知道fastjson是否正...
- 一文轻松看懂丰田汽车的电路图(丰田车电路图识读技巧)
-
丰田汽车电路图符号、含义丰田汽车电路图识读说明电路图中字母是注释标号,其各部分的含义如下:注释标号A:表示系统标题,在电路图上方用横线划分,区域内用文字和系统符号表示下方电路系统的名称。注释标号B:表...
- 杭州高级中学发文言文版校庆公告引热议——全文932字,74处注释
-
阅读提示校方回应:我们期待以这种‘复古’的方式引起公众注意,也算是为树立起大众的文化自信、唤起大众对传统文化的关注作出一点贡献。5月14日,杭州高级中学官方微信发布了一篇文言文版的校庆公告。几个小...
- Python 和 JS 有什么相似?(python和js哪个快)
-
Python是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有Python的身影。作为一名前端开发者,也了解ES6中的很多特性借鉴自Python(比如默认参数、解构赋值、...
- 阿里卖家 Flutter for Web 工程实践
-
作者:马坤乐(坤吾)Flutter自2015年初次亮相以来,经过了多年的发展已经相当成熟,在阿里、美团、拼多多等互联网公司都有广泛的应用。在ICBU阿里卖家上90+%的新业务使用Flu...
- 诗经275思文押韵、注释、古音、今韵
-
诗经275-1思文押韵(备注:□=非韵、■=i韵、●=o/u韵、◆=ng韵、=i/o二象性)「」1.思文后稷,克配彼天。立我烝民,莫菲尔极。贻我来牟,帝命率育。无此疆尔界,陈常于时夏。□□□■,...
- SolidWorks中常用命令快捷键(solidworks有哪些快捷键)
-
1.A:中心线2.B:镜向3.C:画圆4.D:智能标柱尺寸5.E:删除6.F:草图倒圆角7.G:画直线8.H:从装配制作工程9.I:等距实体10.J:从装配制作装配11.K:多边形12.L:延伸13....
- 第一章、TS语言简介(tsl语言)
-
TypeScript(简称TS)是微软公司开发的一种基于JavaScript(简称JS)语言的编程语言。它的目的并不是创造一种全新语言,而是增强JavaScript的功能,使其更适合多人合...
- 为什么要用JMH?何时应该用?(日本jmh地面分析图网站)
-
if快还是switch快?HashMap的初始化size要不要指定,指定之后性能可以提高多少?各种序列化方法哪个耗时更短?无论出自何种原因需要进行性能评估,量化指标总是必要的。在大部分场合...
- 雅虎“YSlow - 23 条规则”详尽阐释
-
以下乃是雅虎“YSlow-23条规则”的详尽阐释,旨在优化网页之性能以及用户之体验,乃是结合技术之原理与实践之方法梳理而成:1.减少HTTP请求次数说明:每一次HTTP请求皆会增添延迟...
- JavaScript 运算符(js ~运算符)
-
JavaScript运算符JS变量JS算数JavaScript运算符实例向变量赋值,并把它们相加:varx=7;//向x赋值5vary=8;//向y赋值2...
- 在Notebook中使用Sublime Text 快捷键
-
编程派微信号:codingpy前几天,我在公众号上发布了两篇译文,对JupyterNotebook做了一些基础性的介绍。虽然说比较基础,而且第二篇阅读量并不高,但是我认为对于其他对于Noteb...
- 晨光静好时!2 道 JS 与 TS 面试题解析,开启惬意学习日
-
当第一缕晨光温柔地唤醒窗台的绿植,泡上一杯清香四溢的茉莉花茶,坐在洒满阳光的角落。此刻,放下对面试的焦虑,让我们像聊生活趣事般,轻松拆解两道JavaScript和TypeScript的高频面试...
- 2024年CSPJ题目解析,语法基本功>算法!
-
前言:每次有家长来找我们咨询报课,说孩子学了一年了,竞赛成绩不理想,问怎么才能强化,提升,我们经过一番询问,发现这类孩子普遍都是在算法上已经花了非常多的时间了,但是语法根本不过关。对这种孩子我们普遍建...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)