vue3中怎么巧妙的去运用jsx?

文章目录

    • 概要
    • JSX / TSX?
    • 安装
    • 配置
    • 封装JsxRender.vue
    • 使用JsxRender.vue
    • 怎么巧妙的去使用它?
    • Demo下载

概要

我们都知道vue3是支持用jsx/tsx,但是好像从来都没有人告诉我们应该怎么运用到项目当中,下面是我觉得不错的一种使用方式,分享给大家。

JSX / TSX?

GTP:

在Vue中,通常使用JSX来描述组件的模板。JSX是JavaScript XML的缩写,它允许你在JavaScript中编写类似HTML的代码,用于描述UI。TSX则是TypeScript的扩展,用于在TypeScript中编写JSX。虽然Vue通常使用单文件组件(.vue文件),但是你也可以选择使用JSX来编写Vue组件。 TSX则是用于在TypeScript中编写JSX的文件扩展名。

vue3官网 #JSX / TSX:传送门

安装

我们先把plugin-vue-jsx安装到项目中

npm i @vitejs/plugin-vue-jsx -D

or

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

配置

提示:文章会以vue3 + vite + ts项目诉说

安装完插件后,我们需要在vite.config.tsplugins中配置一下,之后就可以正常使用了。

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx';

export default defineConfig({
  plugins: [
    vue(),
    vueJsx()
  ]
})

封装JsxRender.vue

我们先封装一个用来渲染jsx的组件

src
	|-components
		|-JsxRender
			|-JsxRender.vue

代码很简单,就抛出一个render回调钩子去渲染jsx

<script lang="ts">
export default {
    props: {
        params: {
            type: Object,
        },
        render: {
            type: Function,
        },
    },
    render() {
        return this.render(this.params)
    },
}
</script>

使用JsxRender.vue

封装完之后,我们可以轻而易举的以组件的形式去渲染jsx了,是不是特别简单?需要注意的是script标签里的语言要写成lang="tsx",另外demo项目用来unplugin-vue-components,所以components文件夹下的组件不用引入就可直接使用,没用过的后续可以下载我的demo看看

代码:

<script setup lang="tsx">
const jsxRenderParams = {
  title: '这是jsx渲染出来的文本'
}
function renderFn(data) {
  return <p class="jsx-render">{data.title}</p>
}
</script>

<template>
  <jsxRender :params="jsxRenderParams" :render="renderFn" />
</template>

<style lang="scss" scoped>
.jsx-render {
  color: #41B883;
}
</style>

效果:
在这里插入图片描述

怎么巧妙的去使用它?

比方说我们做项目经常用到的element table表单,我们就可以留一个口子给jsx去动态的设置el-table-column,代码如下:

src
	|-components
		|-JsxTable
			|-JsxTable.vue

JsxTable.vue:

<script lang="ts" setup>
interface Columns {
  prop: string
  label: string
  renderCell?: Function
}
interface Props {
  columns: Columns[]
  data: Record<string, any>[]
}
const props = withDefaults(defineProps<Props>(), {
  columns: () => [],
  data: () => [],
})

</script>

<template>
  <el-table :data="props.data">
    <el-table-column v-for="item in props.columns" :key="item.prop" :label="item.label">
      <template #default="{ row }">
        <jsxRender v-if="item.renderCell" :params="row" :render="item.renderCell" />
        <span v-else>{{ row[item.prop] }}</span>
      </template>
    </el-table-column>
  </el-table>
</template>

接着我能就可以在columns属性绑定的数组对象里写jsx代码了,我们JsxTable组件里封装的渲染函数叫renderCell,所以当我们想要动态渲染某一列时,只需要在renderCell方法里返回jsx代码就好了,
代码如下:

<script setup lang="tsx">
const columns = [
  {
    prop: 'num',
    label: '序号',
  },
  {
    prop: 'tooltip',
    label: 'el-tooltip',
    renderCell: (row) => {
      return (
        <el-tooltip
          content={row.tooltip.content}
        >
          <span>{row.tooltip.name}</span>
        </el-tooltip>
      )
    }
  },
  {
    prop: 'progress',
    label: 'el-progress',
    renderCell: (row) => {
      return (
        <el-progress percentage={row.progress.percentage} status={row.progress.status} />
      )
    }
  },
  {
    prop: 'operate',
    label: '操作',
    renderCell: (row) => {
      return (
        <el-button type="primary" link onClick={() => clickOperate(row)}>编辑</el-button>
      )
    }
  }
]
const tableData = [
  {
    num: '1',
    tooltip: {
      name: '雷总',
      content: '雷军造车,天命所归,雷字带电,军字带车。'
    },
    progress: {
      percentage: 100,
      status: 'success'
    },
    msg: '这TMD绝对是捣乱的是吧'
  },
  {
    num: '2',
    tooltip: {
      name: '卢总',
      content: '新手还在看小米,老手已经开始等红米汽车了'
    },
    progress: {
      percentage: 50,
      status: ''
    },
    msg: '干翻友商小米'
  },
]
function clickOperate(item) {
  ElMessage({
    message: item.msg,
    type: 'success',
  })
}
</script>

<template>
  <JsxTable :columns=columns :data=tableData />
</template>

demo效果:(之后如果你遇到类似的组件如el-descriptions,你就可以根据这个风格去封装组件了٩(๑❛ᴗ❛๑)۶)
在这里插入图片描述

Demo下载

有积分交一下公粮,没积分的去gitee

❀CSDN:vue3-tsx 传送门

❀Gitee:vue3-tsx 传送门

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二级路由的配置以及注意项

二级路由 比如说LayOut组件是父亲&#xff0c;LayOut和ArtComp是儿子&#xff0c;那我们怎么给儿子配路由呢&#xff1f; 1、首先在router下的index.js导入组件&#xff0c;配置规则&#xff0c;详细如下 // 导入路由相关组件 import LayOut from /views/LayOut import UserC…

IntelliJ IDEA常用快捷键

【1】创建内容&#xff08;新建&#xff09;&#xff1a;altinsert 【2】main方法&#xff1a;psvm 【3】输出语句&#xff1a;sout 【4】复制行&#xff1a;ctrld 【5】删除行&#xff1a;ctrly&#xff08;很多编辑器ctrly是前进操作&#xff0c;如果选择 Delete Line&…

C++内联函数与引用(超详细)

文章目录 前言一、内联函数1.为什么会存在内联函数2.什么是内联函数3.内联函数注意事项 二、引用1.什么是引用2.引用的特性3.常引用4.引用使用场景5.引用与指针 总结 前言 一、内联函数 1.为什么会存在内联函数 &#x1f9d0;&#x1f9d0;首先我们介绍内联函数之前&#xf…

NVMe over Fabrics:概念、应用和实现

对于大部分人来说&#xff0c;NVMe over Fabrics&#xff08;简称NVMf&#xff09;还是个新东西&#xff0c;因为其第一个正式版本的协议在今年6月份才发布。但是这并不影响人们对NVMf的关注&#xff0c;因为这项依托于NVMe的技术很可能继续改变存储市场格局。 NVMf的贡献在于…

USB -- STM32F103复合设备(HID+MassStorage)传输讲解(十)

目录 链接快速定位 前沿 1 描述符讲解 1.1 设备描述符 1.2 配置描述符 1.3 接口描述符 1.4 功能描述符 1.5 端点描述符 1.6 字符串描述符 1.7 报告描述符 2 运行演示 链接快速定位 USB -- 初识USB协议&#xff08;一&#xff09; 源码下载请参考链接&#xff1a;…

vivado CDC约束-“设置总线倾斜”对话框

“设置总线倾斜”对话框 在AMD Vivado™ IDE中&#xff0c;可以通过多种方式设置总线偏斜约束&#xff1a; •通过时间约束编辑器。选择窗口 → 时间限制 → 断言 → 设置总线倾斜。从“时序约束编辑器”中&#xff0c;可以添加、删除或修改总线扭曲约束。 注意&#…

【VSCode】关闭双击shift出现搜索

原因 有时候总是手滑按两下shift&#xff0c;每次都会弹出如下图的搜索框&#xff0c;导致很不方便 解决办法 找到该文件 C:\Users\admin\.vscode\extensions\k--kato.intellij-idea-keybindings-1.5.12\package.json&#xff08;admin是自己的用户名&#xff09; 然后关键字…

【MySQL视图特性】

目录&#xff1a; 前言视图基本使用创建视图查看视图内容修改内容测试删除视图 视图规则和限制 前言 剑指offer&#xff1a;一年又12天 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图也是带有名称的列和行内容&#xff0c;对视图内容的…

Java集合/泛型篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、说说List,Set,Map三者的区别二、Array与ArrayList有什么不一样?三、Map有什么特点四、集合类存放于 Java.util 包中, 主要有几 种接口前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

系列四、Eureka自我保护

一、Eureka自我保护 1.1、故障现象 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式&#xff0c;Eureka Server将会尝试保护其服务注册表中的信息&#xff0c;不再删除服务注册表中的数据&#xff0c;也就是不会注销任何微服务。如…

学生信息管理系统winform+sqlserver

学生信息管理系统winformsqlserver Winform作为一个强大的桌面应用程序开发工具&#xff0c;具有丰富的图形化界面编程组件&#xff0c;可以快速构建出用户友好的界面。使用这个工具&#xff0c;我能够轻松设计出适合学生信息管理系统的各类窗体&#xff0c;比如学生信息录入窗…

------- 计算机网络基础

1.1概述 是什么? 答出独立计算机通信线路连接实现资源共享 计算机网络组成 从组成部分看: 硬件软件协议 从工作方式看: 边缘部分和核心部分 从功能组成看: 通信子网和资源子网 计算机网络性能指标 速率是指数据传输的物理速度&#xff0c;吞吐量是指实际的数据传输…

Redis:原理速成+项目实战——Redis的Java客户端

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis常见命令&#xff08;数据结构、常见命令总结&#xff09; &#x1f4da;订阅专栏&…

Qt Creator可视化交互界面exe快速入门5

上一期介绍了加法计算器,本期介绍QObject定时器。 首先一样先建个工程,比如我这项目名为QObject 本期的任务就是制作图片在界面上显示,然后每秒定时切换,点击另一个暂停按钮,可以定格当前图片,即取消定时切换功能。 显示图片的我们可以使用显示里面的label 这个用于显示…

STM32+Codesys工业软件PLC解决方案

工业控制系统在现代制造和自动化领域扮演着关键角色, 基于IEC 61131-3 标准的控制器编程开发软件平台CODESYS&#xff0c;适用于多种行业的控制系统的开发,使用户方便快捷地对自动化工程进行编程和配置&#xff0c;完成项目开发、软件测试和应用调试。 本次STM32联合合作伙伴C…

设计模式(4)--对象行为(8)--状态

1. 意图 允许一个对象在其内部状态改变时改变它的行为。 2. 三种角色 上下文环境(Context)、抽象状态(State)、具体状态(Concrete State) 3. 优点 3.1 将与特定状态相关的行为局部化&#xff0c;并且将不同状态的行为分割开来。 3.2 使得状态转换显式化。 3.3 State对象可被共…

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 搭建环境说明 不同版本模型性能对比 不同版本对比 参数解释 模型解释 训练 训练示意代码 训练数据与.yaml配置方法 .yaml配置 数据集路径 标签数据说明 训练参数说明 训练过程示意及输出…

低代码开发中业务蓝图的重要性:业务需求与系统实现的桥梁

在低代码应用开发领域&#xff0c;业务蓝图是一个至关重要的工具&#xff0c;它提供了组织业务流程需求的详细信息。它类似于一份指导开发人员进行应用开发的路线图&#xff0c;确保与业务的战略目标和需求保持一致。 低代码方法学&#xff0c;顾名思义&#xff0c;即减少了传…

基于AM62x的ARM+FPGA+Codesys低成本软PLC解决方案

GPMC并口简介 GPMC(General Purpose Memory Controller)是TI处理器特有的通用存储器控制器接口&#xff0c;支持8/16bit数据位宽&#xff0c;支持128MB访问空间&#xff0c;最高时钟速率133MHz。GPMC是AM62x、AM64x、AM437x、AM335x、AM57x等处理器专用于与外部存储器设备的接口…

交叉验证的种类和原理(sklearn.model_selection import *)

交叉验证的种类和原理 所有的来自https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation-iterators并掺杂了自己的理解。 文章目录 前言一、基础知识1.1 交叉验证图形表示1.2 交叉验证主要类别 二、部分交叉验证函数&#xff08;每类一个&#xff0…