技术标签: Web vue js vue3 javascript jsx
直入正题,vue3 对 jsx 和 ts 的支持更加完善,看一下 vue3 的 jsx 官方文档部分:
非常的简陋了,但是他给我们指引了 vue3 中 jsx 的 babel 转换插件 jsx-next 。
感兴趣的可以看一下他的 README,下面开始安装使用一下~
实际上 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 不报错。
注:
loader
的目标组件必须是返回一个 Promise
的函数,使用 () => import()
可以达到相同的效果(他会使用一个 Promise
帮你包裹组件),这里我们为了主动延时才手写了 Promise
。loadingComponent
需要是一个同步组件。有关更多异步组件 defineAsyncComponent
的选项可以查看官方文档的中文社区翻译版:defineAsyncComponent
定义完组件就是 setup
了,为什么不用 vue2 的 template 呢?那就不是 jsx 了。
有关这部分该如何使用,请看 官方文档 即可。
在 defineComponent
组件块内,完全和 vue3 新语法等同,还可以使用 props
对上层传入进行限制、指定,以及使用 name
等关键词:
const Demo = defineComponent({
name: 'demo',
props: {
key1: {
type: String,
required: true
}
}
}
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 插件
前几天在折腾将项目代码的编译问题,打算使用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定义:Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统再会将网址提交DNS域名解析服务器进行IP地址的解析。 Hosts文件的工作方式:我
Code is cheap,show me the code. --LinusTorvalds继上一篇博文 浅谈微服务之Springcloud ,讲述到微服务的背景以及它的一些核心理念,本篇博文着重从代码和理论两方面对springcloud服务治理的核心组件–Eureka做一个详细的讲解。Eureka的前世今生在上一篇博文当中提及服务治理以及它主要解决的问题,那么当...
RTL设计可以边写边完善自己的思路,然后一点点修改,循序渐进
参考网上几篇Glide源码的介绍,也想看看Glide内部怎么实现的,顺便膜拜下Google大佬们的设计思想,话不多说,来吧~本篇不介绍Glide的具体使用,后面的操作符也只代表glide的常用功能,详细使用可以参考官方文档。本文主要介绍了以下几个方面:glide是什么,它能干什么,为什么是它?和之前的图片加载框架的比较Glide的操作符1.glide是什么,它能干什么,为什么是它?...
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上,推出JavaScript 2.0。 ECMAScript和JavaScript到底是什么关系?简单来说,ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的实现。 1996年11月,J...
Altium Designer -- 精心总结 置顶 聚优致成 2016-08-13 15:28:46 ...
关于关联模型ThinkPHP 3.2.3 的关联模型(手册地址)一般处理关联数据表的 CURD 操作,例如关联读取、关联写入、关联删除等。实例博客管理模块关于博客有 4 张数据表:博客表 crm_blog:CREATE TABLE `crm_blog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `t...
项目简介:项目采用nodejs+express+typescript+mongodb技术搭建主要功能:1.用户注册2.用户登录3.文章管理模块4.图片管理模块5.token认证6.密码加密7.https服务8.七牛图片云存储9.pm2项目发布管理项目源码:https://github.com/zha...
管理应用程序的安全部署和配置密钥库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程序,不但可以一个一个分析,还可以批量读取,有自动搜索功能,可灵活选择参数。此软件只是试用版功能,某些功能已限制。但应用也很强大。此程序不实现具体的文件格式转换,但可提供通用接口。转成EXCEL等数据库文件点第一个按钮,可以直接分析单个的KML文件。在弹出的对话框中选择KML文件则”显示KML元素列表框中可以出现被分析的KML元素。标签。点击标签则可石下面的文本框中...
出现这种错误原因就是字符串截取越界,解决方法就是加判空如:if(a.length=0){return false;}