在Vue中使用JSX作为render

项目实训——实验平台(三) 学生提交作业 已截止任务 ExsMsgMapper.xml: 选择截止日期小于等于此时此刻的任务 <select id="getAllExList" resultType="org.jeecg.modules.demo.ExMsg.entity.ExMsg"> select * from ex_msg where sid = #{sid} and isvisiable = "是" and #{deadline} > deadline 阅读详情

ant-design-vue开源了一段时间后,收到了一些反馈,尤其是Form组件上线后,很多用户对JSX的使用感到迷惑和不习惯,为此专门介绍下Vue JSX的使用姿势及注意事项。

Form组件的自动收集校验功能需要在JSX下使用,当然如果不需要自动收集校验,你依然可以使用template

 

Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,就需要使用 render 函数,它比 template 更接近编译器。但是复杂的render函数书写异常痛苦,好在官方提供了一个 Babel 插件,可以将更接近于模板语法的JSX转译成JavaScript。

 

使用过React的同学对JSX肯定不陌生,但是Vue的JSX写法和React的还是有一些区别。

React中父子之间传递的所有数据都是属性,即所有数据均挂载在`props`下(style, className, children, value, onChange等等)。

 

Vue则不然,仅仅属性就有三种:组件属性props,普通html属性attrs,Dom属性domProps。

接下来我们通过一个示例来详细解释他们的区别:本文代码可在codesandbox查看运行

const ButtonCounter = {
  name: "button-counter",

  props: ["count"],

  methods: {
    onClick() {
      this.$emit("change", this.count + 1);
    },
  },

  render() {
    return (
      <button onClick={this.onClick}>You clicked me {this.count} times.</button>
    );
  },
};

export default {
  name: "button-counter-container",

  data() {
    return {
      count: 0,
    };
  },

  methods: {
    onChange(val) {
      this.count = val;
    },
  },

  render() {
    const { count, onChange } = this;

    return (
      <div>
        <ButtonCounter
          style={{ marginTop: "10px" }}
          count={count}
          type="button"
          onChange={onChange}
        />

        <ButtonCounter
          style={{ marginTop: "10px" }}
          count={count}
          type="button"
          domPropsInnerHTML={`hello ${this.count}.`}
          onChange={onChange}
        />
      </div>
    );
  },
};

 

组件属性props:指组件声明的属性,即上述示例中声明的props: ['count']。

普通html属性attrs: 指组件未声明的属性,即上述示例中的type="button",该属性默认会直接挂载到组件根节点的上,如果不需要挂载到根节点,可声明 inheritAttrs: false。

Dom属性domProps:指的Dom属性,如上述示例中的innerHTML,它会覆盖组件内部的children, 这类属性我们一般很少使用到。

同样事件属性也分了两种:on nativeOn

那么问题来了,组件是如何区分各类属性的呢?

答:正则则则...... ?,babel-plugin-transform-vue-jsx插件会通过正则匹配的方式在编译阶段将书写在组件上属性进行“分类”。

onXXX的均被认为是事件,nativeOnXXX是原生事件,domPropsXXX是Dom属性,

class,staticClass,style,key,ref,refInFor,slot,scopedSlots这些被认为是顶级属性,至于我们属性声明的props,以及html属性attrs,不需要加前缀,插件会将其统一分类到attrs属性下,然后在运行阶段根据是否在props声明来决定属性归属(即属于props还是attrs)。

 

在编译阶段通过正则来区分,毕竟不是很严谨,那么根据以上分类规则会有哪些问题呢?

第一、属性分类是编译阶段进行的分类,那么对于动态属性如何划分分类?

在React中所有属性都是顶级属性,直接使用{...props}就可以了,但是在Vue中,你需要明确该属性所属的分类,如一个动态属性value和事件change,你可以使用如下方式(延展属性)传递:

const dynamicProps = {
  props: {},

  on: {},
};

if (haValue) dynamicProps.props.value = value;

if (hasChange) dynamicProps.on.change = onChange;

const dynamicProps = {
  props: {},

  on: {},
};

if (haValue) dynamicProps.props.value = value;

if (hasChange) dynamicProps.on.change = onChange;

<Dynamic {...dynamicProps} />

当然你可以混合着使用:

<Dynamic {...dynamicProps} style="color: red"/>

先别高兴太早,如果你没有深入使用过Vue JSX,不建议你使用混合方式,因为Vue会对其进行属性合并,至于合并的规则官方也并没有详细的文档,文档中有一处示例,我在这再举一个例子:

const dynamicProps2 = { on: { change: onChange2 } };

<Dynamic
  {...{ on: { change: onChange1 } }}
  {...dynamicProps2}
  onChange={onChange3}
/>;

上例中的onChange1、onChange2、onChange3都会触发,而你想要的可能仅仅是onChange3。其它属性的合并规则我就不一一列举了,总之,我不建议你使用混合方式,除非你及你的团队其他小伙伴对其规则了解的足够透彻。

注:理想情况你不应该需要动态属性,在业务开发中也比较少的使用动态属性,但如果你尝试开发一些通用性比较强的组件,就很难逃过动态属性的使用。

 

第二、如果声明的属性就是onXXX怎么处理?

首先我不建议你这么做,但如果真的需要,你必须明确该属性的分类,如下所示:

<div>
  <Dynamic value="获取到value,然而并不能获取到onXXX" onXXX="?" />

  <Dynamic {...{ props: { onXXX: "获取到onXXX,但不建议使用" } }} />
</div>;

 

第三、函数式组件的props如何处理?

关于函数式组件的相关概念可查看官方文档,文档中有如下一段内容:

注意:在 2.3.0 之前的版本中,如果一个函数式组件想要接受 props,则   props 选项是必须的。在 2.3.0 或以上的版本中,你可以省略   props 选项,所有组件上的属性都会被自动解析为 props。

 

props和attrs之间存在着很微妙的关系,在普通组件中,只要明确声明的属性会被划分到props分类中,剩下的均在attrs中。而对于函数式组件,只要省略了props选项,传参时不管是否明确分类,最终context.props获取到的都是全部属性,如果你需要获取明确的分类情况,可以在context.data下查看。

总之,在函数式组件中,推荐省略props选项。

 

第四、指令是否还可用?

很不幸的告诉你,大多数指令并不能在JSX中使用,对于原生指令,只有v-show是支持的。

大部分指令在JSX中可以使用表达式来替代,如:条件运算符(?:)替代v-if、array.map替代v-for

对于自定义的指令,可以使用如下方式使用:

const directives = [{ name: "my-dir", value: 123, modifiers: { abc: true } }];

return <div {...{ directives }} />;

 

更多Vue JSX的知识,可以查看官方文档。

 

总结:

说了那么多,其实只要记住一点,尽量使用明确分类的方式传递属性,而不是要babel插件帮你分类及合并属性。

Vue.js 渲染函数(Render Functions)与 JSX 深度研究 Vue.js 提供了两种主要的方式来声明组件的渲染输出:基于 HTML 的模板语法和基于 JavaScript 的渲染函数(Render Functions)。模板语法是 Vue 最核心和最广为人知的功能,它允许开发者使用类似 HTML 的声明式语法来描述 UI 结构,这种方式直观、易读,并且对于大多数应用场景来说已经足够强大。模板在编译阶段会被 Vue 的编译器转换成渲染函数,这意味着渲染函数是更接近 Vue 底层实现的、更原始和灵活的方式。 阅读详情

相关推荐

【Macbook-Latex安装部署教程】【Win-Texlive镜像下载】【简单易上手】MacTex+Vscode/Texstudio

该教程记录自己在mac()上安装部署Latex环境的经验,整个教程操作简单,配置要求少,易上手。教程分成三部分:Mactex下载与安装,Vscode插件下载与配置文件修改,Texstudio安装。

sunriseOvO的博客 2569

vue3的新特性custom renderer

文章转自:https://blog.51cto.com/15077561/2594771 默认的目标渲染平台 在vue3中允许用户自定义目标渲染平台,以往的版本中目标渲染被局限于浏览器dom平台,而现在可以把 vue 的开发模型扩展到其他平台。点击进入官网 Tips:以往解决把 vue 的开发模型扩展到其他平台(Canvas、iOS、Android等等)的方式之一是借助第三方工具例如WEEX(点击进入官网) 我们先来弄懂vue是如何定义默认的目标渲染平台的,也就是说如何将目标渲染

liubangbo的专栏 5911

关系代数表达式优化步骤

关系代数表达式优化步骤 本篇主要讲解怎么画查询语法树并对其优化,因为我在学关系代数的语法树的时候,在网上找不到比较详细的教法或者技巧,最后通过答案反推原理,所以想写一篇技巧来描述一下这类题的解题方法。 先上书内讲解 1、构造查询树 第一步:把用高级语言定义的查询转换为关系代数表达式 ★ 以 SELECT子向对应投影操作,以FROM字向对应笛卡尔积以 WHERE子句对应选择操作,生成原始查询树 ★ SQL语句转化为原始查询树 第二步:把关系代数表达式转换为查询树。 注: 查询树是一种表示关系代数表达式的树形结

m0_51718449的博客 7016

Vue Ant Design Vue table customRender()函数 + h()函数

生成复杂数据的渲染函数,参数分别为当前行的值,当前行数据,行索引。

m0_48968874的博客 1万+

ESD 防护深度解析:模型、等级、系统设计与防护策略

本文系统阐述了静电放电(ESD)防护的核心技术体系。首先对比分析了HBM(人体模型)和CDM(充电设备模型)两种基础ESD模型的物理特性、测试标准及分级要求,指出相同电压下CDM的破坏性是HBM的15-20倍。其次详细解析了IEC61000-4-2系统级ESD标准,包括接触/空气放电测试方法及判定等级。重点提出了系统级防护的三层架构:空间隔离(≥10mm间距)、电气隔离(地平面分割)和TVS管选型(响应时间<1ns),并对比了MOV、SCR等防护器件特性。针对不同应用场景(消费电子、工业控制等)给出了差异化

bother3000的博客 1883

告别SD卡!手把手教你用NVMe硬盘盒给Jetson Orin Nano离线烧录Ubuntu系统

本文详细介绍了如何利用NVMe硬盘盒为Jetson Orin Nano离线烧录Ubuntu系统,替代传统SD卡方案。通过硬件选择、系统镜像准备到烧录命令的全流程解析,帮助开发者提升存储性能与系统稳定性,特别适合嵌入式开发场景。

weixin_30808693的博客 459

vue中customRender的作用

定义:customRender通常是一个函数,它接收当前单元格的数据(如文本、对象等)以及可能的其他参数(如当前行的数据、行索引等),并返回一个虚拟DOM节点或字符串,用于渲染该单元格的内容。作用:通过customRender,开发者可以灵活地控制表格、列表等组件中数据的展示方式,如格式化数字、添加链接、显示图标、根据条件改变样式等,从而提升用户体验和数据可读性。

qq_73882890的博客 2249

使用Xpath语法爬取豆瓣读书Top250

使用Xpath语法爬取豆瓣读书Top250 使用的软件是Spyder 网页地址:https://book.douban.com/top250?start=0 直接上代码: # -*- coding: utf-8 -*- """ Created on Thu Apr 30 18:35:17 2020 @author: ASUS """ import requests import csv fr...

weixin_43987253的博客 2081

vue的h渲染函数和customRender在ant design vue的table组件的使用

【代码】vue的h渲染函数和customRender在ant design vue的table组件的使用。

动感超人的博客 5296

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 461

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 183

深入解析:Vue 中的 Render 函数、JSX 与 @vitejs/plugin-vue-jsx 实践指南

Vue渲染机制对比:Render函数与JSX 摘要:Vue提供了两种渲染模式:底层render函数和JSX语法。render函数作为核心机制,通过h()创建VNode,具备极致灵活性但代码冗长。JSX作为语法糖,将类HTML结构编译为render函数,兼具开发效率和动态性。二者本质相同,JSX通过Babel编译最终生成render函数,但在复杂场景下JSX更易维护。JSX尤其适合逻辑复杂组件和类型化开发。

Yue 2484

米哈游运维面试题及参考答案

Linux 系统运行级别是用于定义系统启动时所需要达到的功能状态。运行级别 0:表示系统停机状态,用于关闭系统,是系统的关机级别。当系统切换到这个级别时,会停止所有的服务和进程,然后关闭系统。运行级别 1:也称为单用户模式。在这个级别下,系统只启动基本的系统服务和必要的进程,仅允许 root 用户登录系统进行维护操作,常用于系统出现故障需要紧急修复的情况,比如修复文件系统错误、重置 root 密码等。运行级别 2:多用户模式,但不支持网络文件系统(NFS)。

大模型大数据攻城狮的专栏 746

vue render & JSX

vue在绝大多数使用template是没问题的,但在某些场合下,使用render更适合。 一、render函数 1.createElement 参数 createElement 可接受三个参数 1){String | Object | Function},一个 HTML 标签字符串,组件选项对象,或者函数,必选参数 2){Object},一个包含模板相关属性的数据对象,可以在 templ...

weixin_30656145的博客 174

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Vue 的 render 函数如何与 JSX 结合使用

JSX 是一种强大的语法扩展,它可以与 Vue 的 render 函数结合使用,提供更灵活的视图层编写方式。通过 JSX,我们可以更直观地表达组件的结构和逻辑,同时享受 JavaScript 的全部能力。

Judy1623 746

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

vue render JSX写法

vue render JSX写法 一、为什么要用JSX写法 JSX写法相比render写法,更接近html语法; 遇到变量, 用{},{}里面写变量, <script type="text/jsx"> export default { data() { return { } }, watch: { }, co...

zhangjing1019的博客 1397

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

vue render jsx 事件绑定 条件渲染 slots 插槽

前文 vue中使用 render写一些展示组件 通过实现一个简单的单元 cell 组件, 来了解render jsx 在vue的使用 将 h 作为 createElement 的别名是 Vue 生态系统中的一个通用惯例,实际上也是 JSX 所要求的。从 Vue 的 Babel 插件的 3.4.0 版本开始,我们会在以 ES2015 语法声明的含有 JSX 的任何方法和 getter 中...

南思琼海 8471

来聊聊Vue中使用Render函数和JSX

Render函数render函数是组件渲染的重要核心,它跟template模板开发一样,只不过这种形式开发,它(render)更接近底层,这样能让Vue编译时少转换一次。让我们来看一下哪里...

Yvette Lau的专栏 1578

vue中jsx的render用法,return中使用循环代替v-for

vue中使用jsx语法的注意项,如何在columns中使用render语句并且return中使用类似v-for循环的方法,解决无法在return中写vue的v-for语句

weixin_54515240的博客 2167

vue2.0 render()渲染函数及jsx

render()函数通过虚拟DOM 来渲染页面 因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,及其子节点。我们把这样的节点描述为“虚拟节点 (Virtual Node)”,也常简写它为“VNode”。“虚拟 DOM”是我们对由 Vue 组件树建立起来的整个 VNode 树的称呼。 –来源:https://cn.vuejs.org/v2/guide/render-function....

fly_wugui的博客 1379

VUE_在render函数使用JSX

vue使用JSX

小歪博客 601

Vue之render渲染函数和JSX的应用

一.模板缺陷 模板的最大特点是扩展难度大,不易扩展。可能会造成逻辑冗余 <Level :type="1">哈哈</Level> <Level :type="2">哈哈</Level> <Level :type="3">哈哈</Level> Level组件需要对不同的type产生不同的标签 <template...

weixin_30624825的博客 734

你需要知道的vue2 jsx render函数

通常开发vue我们使用的是模板语法,其实还有和react相同的语法,那就是render函数,同样支持jsx语法。 Vue 的模板实际是编译成了 render 函数。 0 传统的createElement方法 createElement( 'anchored-heading', { props: { level: 1 } }, [ ...

weixin_30445169的博客 135

02 Vue进阶 render和jsx语法使用

Vue render使用和jsx语法详讲; 如: this.$slots.default

qq_37550440的博客 1178

Render函数与JSX在Vue中的运用:当模板不再满足你时

Vue开发中,当模板语法无法满足复杂需求时,Render函数和JSX提供了更灵活的解决方案。文章分析了模板语法的局限性,如动态组件切换和复杂条件嵌套场景,并详细介绍了Render函数的底层原理和动态渲染能力,包括条件渲染、属性绑定和函数式组件开发。同时探讨了JSX的语法特性、配置方法和高级应用,对比了两者的优缺点。最后通过动态表单生成器案例,展示了JSX在实际项目中的运用。这些技术为处理高度动态化UI和组件库开发提供了有效工具。

510

Vue渲染—深入VNode(h函数、JSX、render函数)

本文讲述了关于h函数、jsx、render函数的作用和用法

m0_65519288的博客 1049
上一篇: div在body中可以任意拖动
下一篇: Vue 自定义指令实现点击DOM元素以外触发事件
哈哈hyc
博客等级 码龄8年 131粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值