如何在 Vue 中使用 JSX 以及使用它的原因

更新日期: 2019-11-16 阅读: 3.3k 标签: jsx

vue.js 具有简单的 api 和几个选项,可用于在我们的组件中定义html模板。

我们可以使用<template>标签选项,在根组件实例上定义template属性,或者使用单文件组件。

上面的选项很棒并且可以完美地工作,但是,在您的应用程序的生命周期中,有时会感到笨拙,设计过度或非常不灵活。

那么,我们为什么要使用 JSX 而不是其他模板定义呢?

  • JSX 更易读,<div></div> 的写法一看就是比 this.$createElement('div', {}, [...]) 简洁很多。
  • JSX 也是 JavaScript。
  • Vue支持JSX。
  • JSX 使自定义 Vue 组件更容易导入和管理。


简介

先举一个例子来说明为什么 JSX 是好的。

我们要构建一个<TextField/>组件,该组件可以是普通的单行文本输入或多行输入(文本区域)。 我们的模板声明可能看起来像这样。

 <div>
   <textarea v-if="multiline" v-model="content" :name="name" :placeholder="placeholder" :aria-invalid="false">
   <input v-else v-model="content" :name="name" :placeholder="placeholder" :aria-invalid="false">
 </div>

从上面的代码片段中可以看到,我们很快就会遇到一些问题,比如重复代码等等。想象一下,必须支持input上面所列的各种属性。上面的这个小片段将会增长并成为一个难以维护的噩梦。

要解决这个问题,我们需要使用Vue进行降级处理,因此需要使用理接近Vue的内部API来解决这个问题。


render() 方法

注意:这里并不是说没有JSX就没有一种简单的方法来处理上面的问题,只是说将这个逻辑移动到带有JSX的render()方法可以使组件更直观。

我们在 Vue 中创建的每个组件都有一个render方法。这个就是 Vue 选择渲染组件的地方。即使我们不定义这个方法,Vue 也会为我们做这件事。

这意味着当我们在 Vue 中定义 HTML 模板时,Vue 的模板编译器将其编译为一个createElement函数,该函数带有几个参数并从render函数返回结果。

为了修复上一节中的代码,我们删除了template属性或template标签,并在组件上定义了render()方法。 如果在组件上定义了render方法,则 Vue 将忽略template定义。

...
 export default {
     name: 'TextField',
     render (createElement) {
         const tag = this.multiline ? 'textarea' : 'input'

        return createElement(tag, {
             class: {
                 'text-input': true,
                 'is-disabled': false
             },
             attrs: {
                 name: this.name,
                 placeholder: this.placeholder,
                 'aria-invalid': false
             }
         })
     } 
 }
...

上面的代码做了几件事:

  1. render方法从Vue获取一个createElement助手。
  2. 我们以编程方式定义我们的标签。
  3. 然后,我们创建标签并将其属性,类等作为对象传递。 我们可以传递给createElement的选项很多。
  4. 我们返回新创建的元素进行渲染。

我们为 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/

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/7459

相关推荐

jsx是什么?_JSX语法简介

JSX就是Javascript和XML结合的一种格式,利用HTML语法来创建虚拟DOM。将XML语法直接加入JS中,通过代码而非模板来高效的定义界面。之后JSX通过翻译器转换为纯JS再由浏览器执行。

JSX 这么6?

本文会先解释一下JSX的工作原理,再介绍一下如何用不寻常的方式来使用JSX。

react本质:JSX如何转化为javascript

react中基本都使用JSX来开发,但JSX其实是javascript的一种语法糖。语法糖就是提供了一种全新的方式书写代码,但是其实现原理与之前的写法相同。

vue2.0写组件使用jsx语法_webpack在vue项目中支持jsx

Vue 2.0中的render中使用JSX,由于Vue框架并没有特意地去支持JSX,Vue和JSX为什么能配合在一起使用呢? 很简单, 因为Vue支持虚拟DOM, 你可以用JSX或者其他预处理语言,只要能保证render方法正常工作即可。

如何在iview组件中使用jsx

最近选用的框架iview表单组件的render写法让人有点不习惯,尤其是在写比较复杂的逻辑的时候,还是感觉模 板式的写法比较方便且可读性较强。而render函数除了支持配置写法外,还支持jsx的写法。由于之前有用过react,因此对jsx并不陌生,可以直接上手。

Vue中jsx的最简单用法

JSX就是Javascript和XML结合的一种格式。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析.

React和JSX基础

脚手架工具:选用React官方推荐的脚手架工具create-react-app,安装npm install create-react-app -g。项目初始化步骤:

JSX在render函数中的应用

JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模版语言,但它具有 JavaScript 的全部功能。Babel 会把 JSX 转译成一个名为 React.createElement() 函数调用。

可替代的JSX

不仅仅是在React(或受JSX启发模板),对于在各种框架中进行模板化,JSX是如今一个非常受欢迎的选择。然而,如果你不喜欢使用JSX,或者你的项目想避免使用它,又或者只是受好奇心驱使

React中JSX和虚拟dom

这被称为 JSX,是一个 JavaScript 的语法扩展。建议在 React 中配合使用 JSX,JSX 可以生成 React “元素”,而且JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模版语言,但它具有 JavaScript 的全部功能。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!