Vue JSX 上手指南

news2024/9/30 7:18:31

JSX 简介

JSX = Javascript + XML。在 Javascript 里写 XML,同时拥有 Javascript 的灵活性和 HTML 的语义化。

Template vs JSX

template 是 Vue 的默认写法,也更推荐。因为 template 语法是固定的,Vue 在编译层面为它做了很多静态标记的优化。JSX 虽然性能不如 template,但更加灵活。

Vue 会将 template 解析为 render 函数,运行时,通过 render 函数返回虚拟 dom。可通过 Vue Devtools 的 “show render code” 看到组件编译后的结果
在这里插入图片描述
在这里插入图片描述
_c: createElement、_v: createTextNode、_s: toString
在这里插入图片描述
通过 @vue/babel-preset-jsx( babel 7+)或 vuejs/babel-plugin-transform-vue-jsx(Babel 6)可以在 Vue 里去转换 jsx 语法,最终转换为 createElement 调用的形式。可在 render 里直接返回,或者写在 methods 里,不建议写在 computed 里,会缓存。
在这里插入图片描述
附个 render 生命周期:
在这里插入图片描述

babel-preset-jsx 的安装和配置

JSX 语法

建议先学习下 Vue 的渲染函数
JSX 的使用可从 createElement 的数据对象上借鉴,亲测都可用,下面来自官方:

{
  // 与 `v-bind:class` 的 API 相同,
  // 接受一个字符串、对象或字符串和对象组成的数组
  'class': {
    foo: true,
    bar: false
  },
  // 与 `v-bind:style` 的 API 相同,
  // 接受一个字符串、对象,或对象组成的数组
  style: {
    color: 'red',
    fontSize: '14px'
  },
  // 普通的 HTML attribute
  attrs: {
    id: 'foo'
  },
  // 组件 prop
  props: {
    myProp: 'bar'
  },
  // DOM property
  domProps: {
    innerHTML: 'baz'
  },
  // 事件监听器在 `on` 内,
  // 但不再支持如 `v-on:keyup.enter` 这样的修饰器。
  // 需要在处理函数中手动检查 keyCode。
  on: {
    click: this.clickHandler
  },
  // 仅用于组件,用于监听原生事件,而不是组件内部使用
  // `vm.$emit` 触发的事件。
  nativeOn: {
    click: this.nativeClickHandler
  },
  // 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
  // 赋值,因为 Vue 已经自动为你进行了同步。
  directives: [
    {
      name: 'my-custom-directive',
      value: '2',
      expression: '1 + 1',
      arg: 'foo',
      modifiers: {
        bar: true
      }
    }
  ],
  // 作用域插槽的格式为
  // { name: props => VNode | Array<VNode> }
  scopedSlots: {
    default: props => createElement('span', props.text)
  },
  // 如果组件是其它组件的子组件,需为插槽指定名称
  slot: 'name-of-slot',
  // 其它特殊顶层 property
  key: 'myKey',
  ref: 'myRef',
  // 如果你在渲染函数中给多个元素都应用了相同的 ref 名,
  // 那么 `$refs.myRef` 会变成一个数组。
  refInFor: true
}

上面的直接搬到 JSX 中:

render (h) { // 最好带个 h,否则无法生效
  const data = {
    ref: 'myRef',
    // 指令
    directives: [{
      name: 'my-custom-directive',
	  value: '2'
	}],
	// 接受一个字符串、对象或字符串和对象组成的数组
   'class': {
	  foo: true,
	  bar: false
	},
	props: {
	  level: this.level
	},
	on: {
	  'click': this.clickHandler
	}
  }
	
  // 也可以分开写, 插件会智能合并
  return <div class="a" {...data}></div>
}

或者

<custom-button
  id="custom-button"
  style={{ marginTop: "10px" }}
  count={count}
  type="button"
  domPropsInnerHTML={`hello ${this.count}.`}
  onChange={onChange}
/>

class,staticClass,style,key,ref,refInFor,slot,scopedSlots 这些被认为是顶级属性,而 props、html 的 attrs 属性,不需要加前缀,插件会统一分类到 attrs 属性下,在运行阶段根据是否 props 声明,再决定归属是 props 还是 attrs。

上面没有覆盖到的用法,如下

v-model

如果安装了 babel-preset-jsx,可直接用

<custom-dialog vModel={this.visible}></custom-dialog>

如果不支持 vModel,可以用事件监听的方式

<custom-dialog on-input={(val) => this.visible = val} value={this.visible}></custom-dialog>

若 custom-dialog 使用的是自定义 model

 model: {
    prop: 'visible',
    event: 'change'
  }

那么,prop 和 event 都要改为对应的

<custom-dialog on-change={this.handleChange} visible={this.dialogVisible}></custom-dialog>

.sync

需要改为事件的写法

<custom-dialog 
  on: {{
    'update:visible': val => {
      this.dialogVisible= val
    }
  }}
  visible={this.dialogVisible}
></custom-dialog>

v-if 和 v-for

只要在原生 Javascript 能够实现的,Vue 的 JSX 就不会有专门的替代方案,比如 v-if 和 v-for :
v-if:

return type ? <div> type 1 </div> :  <div> type 0 </div>
// 或
if (type) {
  return <div> type 1 </div>
} else {
  return <div> type 0 </div>
}

v-for:

<div>
  { arr.length ? arr.map(item => <li>item</li>) : <li>empty</li> }
</div>

默认插槽、具名插槽、作用域插槽

需要借由 this.$slots 或 this.$scopedSlots 来传入
默认插槽:

<div> {this.$slots.default} </div>

具名插槽:

<div> {this.$slots.title} </div>

作用域插槽:

<div> {this.$scopedSlots.title({text:'hello scope'})} </div>

引入图片

 <img src={require('../images/icon.svg')} alt="图片" />

函数式组件

这里直接看 Vue 官方文档 就很详尽了。需要注意下,render 的第二个参数 context 的传入,组件的一切需要都是通过 context 参数传递的

Vue.component('my-component', {
  functional: true,
  // Props 是可选的
  props: {
    // ...
  },
  // 为了弥补缺少的实例
  // 提供第二个参数作为上下文
  render: function (createElement, context) {
    // ...
  }
})

事件 & 按键修饰符

事件 & 按键修饰符

以上是平常使用时,踩过的坑。后续有新增的再往里补充。友情提醒,官方文档也过几眼,能解决大部分问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL简介及常用引擎介绍

MySQL 由 My 和 SQL 组成&#xff0c;其中的 SQL 部分即为&#xff1a;Structured Query Language&#xff0c;意为结构化查询语⾔&#xff0c;是访问数据库的最常⻅的标准化语⾔。 MySQL 是一款优秀的、开源的数据库管理系统&#xff0c;同时 MySQL 也是一款可移植的数据库&a…

【WSL】[02] windows subsytem linux 配置和使用

第【2】章前言&#xff1a; 上一篇我们已经安装好了ubuntu在WSL下的GUI的桌面&#xff1a;我们现在继续进一步进行配置工作。同时也把&#xff0c;运用WSL的流程摸一把&#xff0c;以备后用。 1 在windows的PowerShell终端进行配置和查询&#xff1a; 1.1 查询所有支持的可以…

极小尺寸,超低功耗,高度集成,天翼物联NB-IoT云芯模组

数字经济时代&#xff0c;物联网已融入我们的日常生活。比如&#xff0c;智能抄表代替人工上门抄表&#xff0c;运动手环实时传输心率情况&#xff0c;烟感报警器远程告警……这些高科技背后都有一颗小而强大的芯片在支撑。 天翼物联云芯模组依托天翼物联网平台&#xff08;AIo…

制造业项目管理软件如何帮助企业做好项目管理?

项目产品、采购、销售、BOM变更管理不全面&#xff1b; 项目进度追踪管理难&#xff1b; 项目进度款管不清、项目尾款管不到&#xff1b; … … 而以上仅仅是生产制造企业所面临的项目管理问题的“冰山一角”。 采用“项目制”生产模式的制造企业&#xff0c;需要做到项目…

理解XaaS(SaaS、Baas、Paas、Iaas)

XaaS : XX as a Service 参考原文 以电商来举例 一套电商系统需要的开发资料 产品经理&#xff1a;设计电商系统 前端工程师&#xff1a;开发页面 后端工程收&#xff1a;开发后端 运维工程师&#xff1a;搭建环境&#xff0c;部署到服务器&#xff0c;负责后期维护等 服务器…

指南解读:急性心力衰竭中国急诊管理指南(2022)

心力衰竭&#xff08;heart failure&#xff0c;HF 简称心衰&#xff09;是由于心脏结构和 / 或功能异常导致心室充盈和/或射血能力受损的一组临床综合征&#xff0c;其病理生理学特征为肺淤血和/或体循环淤血、伴或不伴有组织器官低灌注&#xff0c;主要临床表现为呼吸困难、乏…

美容门店信息化管理系统该如何搭建?不妨参考一下百数

随着人们的生活水平越来越高&#xff0c;人们在解决了温饱问题之后有了更多的追求。其中美容正在成为不少人新的必做项目&#xff0c; 迎合了人们对于爱美的需求。目前我国美容机构市场规模已超过4500亿元&#xff0c;行业从业人员超过3000万。据国家工商联统计数字显示&#x…

JS_fetch请求数据

1、axios 比如常用的需求中&#xff0c;想要请求A接口的数据再去请求B接口的数据&#xff0c;axios的做法是需要先请求A接口&#xff0c;然后在A接口的成功的回调函数里面去请求B接口。 fetch使用的情况并不多&#xff0c;主要是由于存在兼容性问题&#xff0c;在企业中就不会…

南大通用数据库-Gbase-8a-学习-29-常用函数介绍

一、测试环境 名称值cpu12th Gen Intel Core™ i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2Gbase-8a数据库版本9.5.3.27 二、函数介绍 1、HEX &#xff08;1&#xff09;说明 将数字或字符串转换成十六进制形式。 &#xff08;2&#xff09;例…

2022年我去过最喜欢的16座城市

欢迎关注「苏南下」分享我的旅行、摄影心得感悟2022 年我去了 16 个城市地区&#xff0c;拍了 40条旅行短片。又是很久没更新&#xff0c;2022 年过得好快&#xff0c;马上就是 2023 了。如果用一个关键词来总结我这一年&#xff0c;我觉得可以是&#xff1a;运气好。从年初 1 …

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主角…

捷报频传 | Bonree ONE获2022科技赋能金融业场景金融建设突出贡献奖

近日&#xff0c;由《金融电子化》杂志社主办的“2022第十三届金融科技应用创新奖”评选结果正式揭晓。本次评奖围绕项目先进性、项目创新点、项目对推动数字化转型及提升服务能力的作用、社会及经济效益等维度展开。博睿数据一体化智能可观测平台Bonree ONE再次脱颖而出&#…

【 Tomcat服务器】

文章目录二、Web服务器2.1 概念2.1.1 什么是Web2.1.2 什么是Web服务器2.2 常见Web服务器2.3 Tomcat服务器2.3.1 Tomcat的下载2.3.2 Tomcat的安装2.3.3 Tomcat的目录结构2.3.4 Tomcat的启动2.3.5 Tomcat的停止运行所需jar包2.3.5 Tomcat的停止2.3.6 修改Tomcat端口号2.3.7 项目部…

有关文件IO操作的错误(error)提示

在编程中&#xff0c;我们一般都是要讲究一定的使用规范的。按照一定的规范编写代码&#xff0c;返回运行提示&#xff0c;在代码运行出现问题时能方便我们能快速的定位到问题的所在。 特别是在使用库函数或者系统调用的API的时候&#xff0c;我们最好也要关注函数的返回值所能…

INTENT2022--一道包含12个反调试反虚拟机操作的ctf题解

作者&#xff1a;selph 从一道Re题学习12种反调试反虚拟技术 题目&#xff1a;AntiDebuggingEmporium 来源&#xff1a;INTENT CTF 2022 Re 这个题目很有意思&#xff0c;里面出现了总共12个反调试反虚拟机的操作&#xff0c;本文内容分两部分&#xff0c;前部分是题解&…

六西格玛奠基人之张驰染阳杂记

中招第1天&#xff1a; 上周四从外地出差回来&#xff0c;落地就觉得有点全身乏力&#xff0c;晚上开始发冷&#xff0c;预感可能中招了。大数据预测深圳第一波疫情高峰发生在12月20日&#xff0c;陆续接到深圳同事亲友中招的消息&#xff0c;感慨真是神预测。 因为头晕目眩&…

LeetCode419.甲板上的战舰

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码&#x1f4dc;题目描述 给你一个大小为 m x n 的矩阵 board 表示甲板&#xff0c;其中&#xff0c;每个单元格可以是一艘战舰 X 或者是一个空位 . &#xff0c;返回在甲板board上放置的 战舰 的数量…

Elasticsearch 日志能否把全部请求打印出来?

1、实战问题请问一下球主&#xff0c;es怎么配置可以把请求日志都打印出来。就是不管是调用借口&#xff0c;还是kibana查询数据&#xff0c;es能打印dsl的请求日志吗&#xff1f;&#xff1f;求指导。怎么配置&#xff1f;——问题来源&#xff1a;https://t.zsxq.com/09vv8rq…

现代细胞计数分析平台丨OMIQ简介

单细胞分析&#xff0c;变得简单 OMIQ是一个现代细胞计数分析平台&#xff0c;它将机器学习和分析管道与经典手动分析的世界连接起来。它允许研究人员在一个软件中完成他们的整个工作流程&#xff0c;从原始数据到统计意义&#xff0c;使用他们自己的专业知识和熟悉的工具与数…

java养老系统养老院系统养老院网站源码

简介 本系统是养老院系统&#xff0c;主要是老人入住养老院的业务逻辑&#xff0c;有护工和医生对老人进行护理看病记录等信息管理&#xff0c;缴费入住外出记录管理等。 演示视频 https://www.bilibili.com/video/BV18i4y1Z7je/?share_sourcecopy_web&vd_sourceed0f04fb…