在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

智能推荐

gcc下使用tcmalloc(gperftools)2.4的注意事项_10km的博客-程序员秘密

前几天在折腾将项目代码的编译问题,打算使用tcmalloc内存池来管理内存分配。无意中在pgerftools的说明文档README中看到了这段话: NOTE: When compiling with programs with gcc, that you plan to link with libtcmalloc, it’s safest to pass in the flags

hosts_liyongxxyy的博客-程序员秘密

Hosts定义:Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统再会将网址提交DNS域名解析服务器进行IP地址的解析。  Hosts文件的工作方式:我

深入浅出服务治理-Eureka_Asyncer的博客-程序员秘密

Code is cheap,show me the code. --LinusTorvalds继上一篇博文 浅谈微服务之Springcloud ,讲述到微服务的背景以及它的一些核心理念,本篇博文着重从代码和理论两方面对springcloud服务治理的核心组件–Eureka做一个详细的讲解。Eureka的前世今生在上一篇博文当中提及服务治理以及它主要解决的问题,那么当...

(3)异步FIFO设计及仿真验证(中)_少卿不在大理寺的博客-程序员秘密

RTL设计可以边写边完善自己的思路,然后一点点修改,循序渐进

Glide源码探究 (一)关于Glide_glide dimensions_路漫-其修远兮的博客-程序员秘密

参考网上几篇Glide源码的介绍,也想看看Glide内部怎么实现的,顺便膜拜下Google大佬们的设计思想,话不多说,来吧~本篇不介绍Glide的具体使用,后面的操作符也只代表glide的常用功能,详细使用可以参考官方文档。本文主要介绍了以下几个方面:glide是什么,它能干什么,为什么是它?和之前的图片加载框架的比较Glide的操作符1.glide是什么,它能干什么,为什么是它?...

什么是 ES6 ?_微风--轻许--的博客-程序员秘密

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上,推出JavaScript 2.0。  ECMAScript和JavaScript到底是什么关系?简单来说,ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的实现。  1996年11月,J...

随便推点

Altium Designer设计PCB总结(干货)_altium designerpcb_冷冷阿的博客-程序员秘密

Altium Designer -- 精心总结 置顶 聚优致成 2016-08-13 15:28:46 ...

ThinkPHP 3.2.3 关联模型的使用_weixin_30408309的博客-程序员秘密

关于关联模型ThinkPHP 3.2.3 的关联模型(手册地址)一般处理关联数据表的 CURD 操作,例如关联读取、关联写入、关联删除等。实例博客管理模块关于博客有 4 张数据表:博客表 crm_blog:CREATE TABLE `crm_blog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `t...

nodejs+express blog项目分享_akx95428的博客-程序员秘密

项目简介:项目采用nodejs+express+typescript+mongodb技术搭建主要功能:1.用户注册2.用户登录3.文章管理模块4.图片管理模块5.token认证6.密码加密7.https服务8.七牛图片云存储9.pm2项目发布管理项目源码:https://github.com/zha...

ZA303学习笔记六管理应用程序的安全(密钥保管库,托管标识,管理应用程序,CA证书)_风车带走过往的博客-程序员秘密

管理应用程序的安全部署和配置密钥库Azure Key Vault密钥库Azure Key Vault密钥库作用Key Vault 对象Azure密钥保管库高可用性Azure Key Vault软删除(多重保护)部署和配置Azure AD托管标识托管标识类型托管标识术语在Azure AD中注册和管理应用程序Azure AD应用程序管理Azure AD应用程序管理存在的目的是为了单一登录(SSO)部署和配置密钥库Azure Key Vault密钥库Azure Key Vault是一个用于安全地存储和访问机

kml文件转成cvs_Kml文件转换成EXCEL、MIF、MID文件下载_Kml文件转换成EXCEL、MIF、MID文件官方下载-太平洋下载中心..._灵芝zaswe的博客-程序员秘密

它可以灵活自动的读取和转化KML程序,不但可以一个一个分析,还可以批量读取,有自动搜索功能,可灵活选择参数。此软件只是试用版功能,某些功能已限制。但应用也很强大。此程序不实现具体的文件格式转换,但可提供通用接口。转成EXCEL等数据库文件点第一个按钮,可以直接分析单个的KML文件。在弹出的对话框中选择KML文件则”显示KML元素列表框中可以出现被分析的KML元素。标签。点击标签则可石下面的文本框中...

StringIndexOutOfBoundsException: String index out of range: -1_计算机界的小学生的博客-程序员秘密

出现这种错误原因就是字符串截取越界,解决方法就是加判空如:if(a.length=0){return false;}

推荐文章

热门文章

相关标签