在Vue3.0中使用JSX的简单入门_vue3 setup jsx_咲奈的博客-程序员秘密

技术标签: Web  vue  js  vue3  javascript  jsx  

JSX

直入正题,vue3 对 jsx 和 ts 的支持更加完善,看一下 vue3 的 jsx 官方文档部分:

非常的简陋了,但是他给我们指引了 vue3 中 jsx 的 babel 转换插件 jsx-next

感兴趣的可以看一下他的 README,下面开始安装使用一下~

安装 jsx-next

实际上 vue-cli 建立的 vue3 项目中已经内置了 jsx 的这个编译插件,如果你不需要自定义配置,是不需要安装就可以即开即用 jsx 的,可谓是非常贴心了。

安装过程如下:

	yarn add -D @vue/babel-plugin-jsx

安装后在 package.json 看到目前是 rc 状态,还没有正式发布,我们只是简单体验一下。

之后在 babel.config.js 内配置该插件:

module.exports = {
    
  // 这是原来的预设,cli 搭建项目就有的
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  // 需要配置的插件
  plugins: ['@vue/babel-plugin-jsx']
}

之后就可以使用 jsx 了!

使用

建立一个 views/Demo.jsx

import {
     defineComponent, ref } from 'vue'

const Demo = defineComponent({
    
  name: 'demo',
  setup (props) {
    
    const input = ref(null)

    const click = (e) => {
    
      console.log(e)
      console.log(input.value)
    }
    return {
    
      click,
      input
    }
  },
  render () {
    
    return (
      <>
        <div>test</div>
        <button onClick={
    this.click}>点击</button>
        <input v-model={
    this.input} placeholder="啊这"/>
      </>
    )
  }

})

export default Demo

demo 的大致框架如上所示,不需要在意上面的 demo 写了什么,只需要在意整体的结构如下:

定义组件

defineComponent() 定义组件,这是为了使得 ts 和 ide 能进行类型推断,从而获得代码提示功能,在配置路由的时候可选用 () => import() 进行懒加载:

{
    
  path: '/demo',
  name: 'demo',
  component: () => import(/* webpackChunkName: "demo" */ '../views/Demo.jsx')
}

注:如果你没有代码提示,那一定是没有使用 defineComponent() ,有了这个东西,你才能获得代码提示。

异步组件

我们手写一个异步组件的使用例子:

import Demo from '../views/Demo'
  // ......
  // 路由
  {
    
    path: '/async',
    name: 'async',
    component: defineAsyncComponent({
    
      // 工厂函数
      loader: Async,
      // 加载异步组件时要使用的组件
      loadingComponent: Demo
    })
  }

这里的 loadingComponent 就是组件 loading 时要显示的内容,而 loader 就是要加载的异步组件。

建立一个 views/Async.jsx

import {
     defineComponent } from 'vue'

const Async = () => new Promise((resolve, reject) => {
    
  setTimeout(() => {
    
    resolve(defineComponent({
    
      render () {
    
        return <div>async component</div>
      }
    }))
  }, 3000)
})

export default Async

这段代码只是把 webpack 给我们的 () => import() 变成手写 Promise 了,在 resolve() 内你可以返回你需要加载的组件,当然我们还要用 defineComponent() 以获得代码提示功能保证 eslint 不报错。

注:

  1. loader 的目标组件必须是返回一个 Promise 的函数,使用 () => import() 可以达到相同的效果(他会使用一个 Promise 帮你包裹组件),这里我们为了主动延时才手写了 Promise
  2. loadingComponent 需要是一个同步组件。

有关更多异步组件 defineAsyncComponent 的选项可以查看官方文档的中文社区翻译版:defineAsyncComponent

setup

定义完组件就是 setup 了,为什么不用 vue2 的 template 呢?那就不是 jsx 了。

有关这部分该如何使用,请看 官方文档 即可。

props, name …

defineComponent 组件块内,完全和 vue3 新语法等同,还可以使用 props 对上层传入进行限制、指定,以及使用 name 等关键词:

const Demo = defineComponent({
    
  name: 'demo',
  props: {
    
    key1: {
    
      type: String,
      required: true
    }
  }
}

render

render 才是 jsx 的核心部分,所有的 jsx 要在此处顶层返回。

和 react 的函数式相比,在 render 内的 jsx ,你还需要使用 this 取得 setup 阶段返回的值。

总结

如果实际体验一下,会发现和 react 的函数式组件还是有天壤之别,Vue 本来就不是为 jsx 而生的,template 它不香吗。

附:

官方 Vue3 文档:Vue3 Guide

民间中文版 Vue3 文档:Vue3 文档

JSX 插件已经内置到 vue-cli 创建的项目中的 issue :这个已经内置到cli 里面去了?

更多 Vue JSX 的用法请看官方 babel 插件的 README :Vue 3 Babel JSX 插件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21567385/article/details/108965319

智能推荐

黑马程序员:毕向东java视频之基础篇_Jason_time的博客-程序员秘密

一、学习java预备工作:1、dos命令行dir:列出当前目录下的文件和文件夹md:创建目录rd:删除目录del:删除文件exit::推出dos命令行2、java特性:与平台无关原理:在运行java应用程序的操作系统上安装java虚拟机(JVM)3、java语言的环境搭建一劳永逸方式:电脑->属性->高级->path路

thrifty-compiler maven插件_10km的博客-程序员秘密

之前写过一篇文章介绍如何用thrifty-compiler 通过IDL生成client代码《Microsoft/thrifty:解决thrifty-compiler.jar运行报错不能编译IDL生成java class代码问题》但是Microsoft/thrifty官方并没有提供maven插件用于在maven中调用thrifty-compiler,我的项目是用maven组织的所以在pom....

Hi3520D UART2和UART3是如何加载到内核的_谁de如花的博客-程序员秘密

参考资料:海思Hi3515的UART2和UART3是如何被加载到内核中的http://blog.163.com/softtwo_2/blog/static/27007702201272364522572/Hi3520D和Hi3515有些不一样的地方;Hi3520D的UART驱动位于linux-3.0.y/drivers/tty/serial/amba-pl011.c

《人工神经网络原理》读书笔记(五)-Hopfield神经网络_及时行樂_的博客-程序员秘密

全部笔记的汇总贴:《人工神经网络原理》-读书笔记汇总Hopfield神经网络丢弃了“层次”概念,创造出无层次的全互联型神经网络。引入了“能量函数”的概念,阐明了神经网络与动力学之间的关系,使得神经网络的运行稳定性判断有了可靠而简便的依据。两种形式离散型连续型连续型Hopfield神经网络与电子电路存在明显对应关系,便于用集成电路实现。一、离散型Hopfield神经网络离散型Hopfield神经网络结构有反馈的单层全互联结构nnn个神经元之间相互双向连接,神经元iii与神经元jjj之间

Java 8 Stream Api 中的 map和 flatMap 操作_码农小胖哥的博客-程序员秘密

1.前言Java 8 提供了非常好用的 Stream API ,可以很方便的操作集合。今天我们来探讨两个 Stream 中间操作 map(Function

随便推点

Cartographer ROS上的编译安装和配置_catogarper ros_知者智者的博客-程序员秘密

Cartographer是google推出的基于激光雷达的SLAM算法。Cartographer官方的编译安装步骤可以在https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html#上查看。但是在国内由于网络的原因,这个步骤并不适用。这里介绍它在国内网络环境下的安装和配置。首先需要安装ROS,这里就不涉及,可以参考ROS的文档进行。ROS具体的版本没有影响,可以是Kinetic或者Melodic。

Netty -08- Google Protobuf_迷雾总会解的博客-程序员秘密

编码和解码的基本介绍编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据 时就需要解码codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节 码数据,decoder 负责把字节码数据转换成业务数据Netty 本身的编码解码的机制和问题分析Netty 自身提供了一些 codec(编解码器)Netty 提供的编码器StringEncoder,对字符串数据进

Python使用gdal实现影像镶嵌_python遥感影像镶嵌_P0级推荐算法工程师的博客-程序员秘密

Python使用gdal实现影像镶嵌如果要对某个文件夹下的多景影像进行镶嵌,我们需要知道镶嵌后影像的行列数目,以及该影像的六个地理变换参数,(值得特别注意的是,无论是影像的重采样还是镶嵌,都需要特别关注影像的6个地理变换参数),关于这六个地理变换参数,请参考我的另一篇博文:https://blog.csdn.net/SunStrongInChina/article/details/1042629...

java中float与byte[]的互转_风灵寒的博客-程序员秘密

FROM:http://tjmljw.iteye.com/blog/1767716起因:想把一个float[]转换成内存数据,查了一下,下面两个方法可以将float转成byte[]。 方法一 Java代码  import java.nio.ByteBuffer;  import java.util.ArrayList;    float buff

周记-20191223_SkydivingWang的博客-程序员秘密

一周匆匆, 上周开始坚持跑步了, 然后学了学python, 跟媳妇的冷战仍然继续, 昨天是冬至, 昨天和PH出去买了面包了饺子,猪肉大葱, 挺香的, 我最近心态慢慢的从婚姻失败中一点点的走出来, 今天早晨跑步的时候, 在公园碰到一个大妈在用播放器播放什么善恶福报的事情, 现在中国好多人也在修传统的各个门派, 感觉中国很浮躁, 急功近利, 反而心神不安, 不过信仰总是好的, 信仰能让人们朝着自己的心...