20行原生JS代码手写ElementUI表格组件

news2024/11/24 16:08:14

又是许久没有写博客了,这几年的疫情,总是居家,时间久了,慢慢的总会想很多。现在越发觉得想做的事情一定要尽早去做,不然总说等下一次,很多时候,就没有下一次了。

今天给大家分享一下如何用原生JS封装一个基础版的ElementUI表格组件。代码篇幅较短,所以有很大的拓展空间,有兴趣可以自己捯饬一下,让功能更加完善。比如增加获取数据和设置数据的功能,再比如增加删除一行、添加一行的操作,以及整合一个分页组件,这些都是可以实现的,大家需要的话,后续有空再慢慢分享。

一、分析需求

今天要做的功能是一个用原生JS代码去手写一个基础版的ElementUI表格组件,任何一个需求做之前不要忙慌着去写,我们可以先构思一下。比如这个表格组件,要实现的话怎么样写更加简便呢?

既然打算用原生梭哈,那么html结构肯定是采用tabel,表格内又分为thead和tbody,还有一点是我们需要做到让表格的内容自动渲染,毕竟我们在使用表格的时候,数据都是从接口来的。有了大致的思路之后就可以着手去写代码了,这里我在一个文件夹下创建了四个文件,大家嫌麻烦的话也可以少写点。创建四个文件,index.html、index.js、tabel.js、tabel.css

二、直接上代码了

1、index.html中的内容只有css的引入和script标签的引入,其实这里css最好是在tabel.js中引入,做好模块化。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="table.css">
    <script src="https://unpkg.com/axios@1.2.0/dist/axios.min.js"></script>
</head>
<body>
    <div id="main"></div>
    <script type="module" src="./index.js"></script>
</body>
</html>

2、tabel.css就是很简单的样式,所以就写在前面了。

table {
    border-collapse: collapse;
}
table, th, td {
    font-size: 14px;
    color: #606266;
    padding: 10px 20px;
    border: 1px solid #ebeef5;
}

3、tabel.js就是今天的核心代码了

/**
* @class 基础版ElementUI组件
* @description 该组件可自定义标题内容、按钮文字内容、以及弹窗展示内容
* @param { Object } config 
* @param { Array } config.el -绑定的元素
* @param { Array } config.column -列
* @param { Array } config.tableData -行数据
*/
export class Table { // 封装要点:数据驱动视图
    constructor(config) {
        let { el, column, tableData } = config
        var thHtml, tdHtml, trHtml = `` // 表头, 每行单元格, 表格每行
        tableData.forEach(tdItem => { // 遍历每一行
            thHtml = tdHtml = ``
            column.forEach(item => { // 遍历每一列
                thHtml += `<th>${item.label}</th>` // 表头html
                tdHtml += `<td>${tdItem[item.prop]}</td>` // 单元格html
            })
            trHtml += `<tr>${tdHtml}</tr>` // 每行
        })
        // console.log(trHtml)
        this.initHTML = `<table><tr>${thHtml}</tr>${trHtml}</table>`
        document.getElementById(`${el}`).innerHTML = this.initHTML
    }
}

4、index.js中使用tabel组件

import { Table } from './Table.js'

let table = new Table({
    el: 'main',
    column : [
        { prop: "date", label: '日期' }, // prop为每行数据渲染字段,label为每列表头
        { prop: "name", label: '姓名' },
        { prop: "address", label: '地址' }
    ],
    tableData : [
        {
            date: '2016-05-02',
            name: '王小虎1',
            address: '上海市普陀区金沙江路 1518 弄'
        },
        {
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1517 弄'
        },
        {
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄'
        },
        {
            date: '2016-05-06',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1520 弄'
        },
        {
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1516 弄'
        }
    ]
})

代码效果如下:

这里用的是静态数据, 未免有点low,我们就来请求一下接口看看吧,检验一下自己封装的组件能否做到自动渲染。

修改index.js中的代码如下:

import { Table } from './Table.js'

let table = {
    el: 'main',
    column : [
        { prop: "id", label: 'ID' },
        { prop: "userId", label: '用户ID' },
        { prop: "title", label: '标题' },
        { prop: "body", label: '内容' }
    ],
    tableData : []
}

axios.get("https://jsonplaceholder.typicode.com/posts").then(res => {
    console.log(res.data);
    table.tableData = res.data
    new Table(table)
})

实现效果如下,这里用的是 jsonplaceholder提供的接口。

本文为原创内容,如需转载,请注明出处,谢谢

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

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

相关文章

从0到1完成一个Vue后台管理项目(十七、使用Echarts:柱状图、折线图)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

DB性能跟不上,加缓存就够了?

服务端软件开发时&#xff0c;通常会把数据存储在DB。而服务端系统遇到的第一个性能瓶颈&#xff0c;往往发生在访问DB时。 这时大部分开发会拿出“缓存”&#xff0c;通过使用Redis在DB前提供一层缓存数据&#xff0c;缓解DB压力&#xff0c;提升服务端性能。 在数据库前添加…

nohup后台运行,进程查看与终止(ubuntu)

1.nohup用途&#xff1a;不挂断地运行命令。语法&#xff1a;nohup Command [ Arg … ] [ & ]无论是否将 nohup 命令的输出重定向到终端&#xff0c;输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写&#xff0c;输出重定向到 $HOME/nohu…

threejs 学习一

前提 threejs官网&#xff1a;https://threejs.org/ 由于官网访问慢&#xff0c;可以github下载压缩包解压后本地启动 github地址&#xff1a;https://github.com/mrdoob/three.js/ 下载好后解压 安装依赖 npm install 启动&#xff1a;npm start 目录介绍&#xff1a; …

语音识别技术简叙述

语音识别技术简述 语音识别的概念 语音识别技术都是让智能设备能够听懂人类语言&#xff0c;其实一门涉及数学信号处理、人工智能、语言学、数理统计学、声学、情感学及心理学等多学科交叉的学科。这项技术可以提供比如自动客服、自动语音翻译、命令控制&#xff0c;语音验证…

【vue】关于vue2和vue3响应式原理的区别

我们都知道&#xff0c;在Vue2中的数据响应式原理存在许多缺陷。 例如无法对新增和直接删除的数据做到响应式&#xff0c;无法直接操作数组进行响应式处理等等。 而在Vue3中&#xff0c;作者很好的解决了这些缺陷&#xff0c;让我们来对比一下Vue2与Vue3对数据响应式处理的具体…

前端如何保证设置的font-family成功生效?

背景 最近开发的一个新页面&#xff0c;在产品验收的时候跟我反馈说页面里的字体跟设计稿中的字体不一样&#xff1b; 问题的关键是我明明记得我有单独设置过 font-family属性&#xff0c;于是我通过Chorme浏览器的调试工具查看了一下DOM的生效样式&#xff1b; 明明是已经设…

IDEA、TortoiseSVN,TortoiseGit提交忽略文件或文件夹

使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件&#xff1a; 1、IDEA 1、idea设置<<--File Types<<--ignore files and folders 原有的过滤条件&#xff1a;*.hprof;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store…

yolov3-tiny的darknet权重转onnx

前言 之前一直鸽了yolov3-tiny的onnx模型修复&#xff0c;今天终于把最后一个bug解决了&#xff0c;如果想直接享受成果的&#xff0c;直接点我的github仓库下载&#xff0c;使用说明都写了&#xff0c;这篇文章呢主要是给大家分享一下思路和过程&#xff0c;希望能够启发更多…

初识Linux

文章目录初识Linux操作系统概述硬件和软件操作系统常见操作系统总结初识LinuxLinux的诞生Linux内核Linux发行版总结虚拟机介绍虚拟机总结远程连接Linux系统图形化、命令行使用命令行学习Linux系统远程连接工具总结初识Linux 操作系统概述 硬件和软件 我们所熟知的计算机是由…

领域驱动设计:微服务设计为什么要选择DDD?

我们知道&#xff0c;微服务设计过程中往往会面临边界如何划定的问题&#xff0c;我经常看到项目团队为微服务到底应该拆多小而争得面红耳赤。不同的人会根据自己对微服务的理解而拆分出不同的微服务&#xff0c;于是大家各执一词&#xff0c;谁也说服不了谁&#xff0c;都觉得…

Day855.生产者-消费者模式 -Java 并发编程实战

生产者-消费者模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于生产者-消费者模式的内容。 Worker Thread 模式类比的是工厂里车间工人的工作模式。 但其实在现实世界&#xff0c;工厂里还有一种流水线的工作模式&#xff0c;类比到编程领域&#xff0c;就是生…

RoboMaster EP 实用功能开发(三): 基于树莓派的ROS2机器人系统搭建

功能&#xff1a;在树莓派4b上安装ros2系统&#xff0c;引入robomaster sdk&#xff0c;搭建一个基于ROS2的机器人系统&#xff0c;用于ROS系统的学习、开发和实践。 硬件&#xff1a;RobotMaster EP、树莓派4b 系统平台&#xff1a;Ubuntu 20.04、ROS2&#xff08;Foxy&…

Selenium【Selenium环境搭建与Junit5】

Selenium【Selenium环境搭建与Junit5】&#x1f34e;一. 自行下载谷歌浏览器或者火狐浏览器&#x1f352;1.1 安装好之后需要去掉谷歌(火狐)浏览器自动更新(建议)&#x1f352;1.2下载谷歌(火狐)驱动&#x1f34e;二.Selenium下载与配置&#x1f352;2.1Selenium下载&#x1f3…

服务案例|SQL Server数据库监控反复重启问题

监控平台对主流数据库的监控&#xff0c;能够及时发现异常&#xff0c;快速响应&#xff0c;保障业务系统的稳定。平台通过对SQL Server数据库监控&#xff0c;帮助用户在数据库出现异常时事件处理。 SQL Server数据库监控内容如下 1 、数据库服务器基本性能监控。包括&#…

Hive/MaxCompute SQL性能优化(三):数据倾斜优化实战

SQL性能优化系列&#xff1a;Hive/MaxCompute SQL性能优化(一)&#xff1a;什么是数据倾斜Hive/MaxCompute SQL性能优化(二)&#xff1a;如何定位数据倾斜前面介绍了如何定位数据倾斜&#xff0c;本文介绍如果遇到各种数据倾斜的情况该怎样优化代码。Map长尾优化一、Map读取数据…

ArcGIS如何将Excel表格转换为SHP格式

概述数据的获取渠道是多种多样的&#xff0c;获取的数据格式也是多种多样&#xff0c;作为一名GISer&#xff0c;需要熟练掌握各种格式的数据之间的转换&#xff0c;例如本文要介绍的Excel格式的数据&#xff0c;经常会遇到&#xff0c;这里为大家介绍一下转换方法&#xff0c;…

区块链基础知识(二)

密码学与安全技术 参考书籍 《区块链原理、设计与应用》 Hash算法 加解密算法 混合加密机制 离散对数与Diffie-Hellman秘钥交换协议 消息认证码 数字签名 PKI体系 PKI基本组件 证书签发 证书的撤销 Merkle tree结构 默克尔树逐层记录哈希值的特点&#xff0c;让它具有了一些独特…

【我的渲染技术进阶之旅】关于C++轻量级界面开发框架Dear ImGui介绍

文章目录一、怎么知道ImGui的1.1 Filament中有使用ImGui1.2 其他很多渲染框架都有使用ImGui二、ImGui介绍2.1 ImGui风格2.2 Imgui介绍2.2.1 Imgui简介2.2.2 Imgui用法2.2.3 Demo示例2.2.4 集成2.2.5 更多案例2.3 查看Imgui实例源代码2.3.1 运行demo2.3.2 项目结构分析2.3.3 示例…

TCP/IP网络编程(2)——套接字类型与协议设置

文章目录二、套接字类型与协议设置2.1 套接字协议及数据传输特性2.1.1 创建套接字2.1.2 协议族&#xff08;Protocol Family&#xff09;2.1.3 套接字类型&#xff08;Type&#xff09;2.1.4 套接字类型1&#xff1a;面向连接的套接字&#xff08;SOCK_STREAM&#xff09;2.1.5…