今天,葡萄带你了解如何基于Vite+Vue3实现一套纯前端在线表格系统。

在正式开始项目介绍之前,首先咱们首先来介绍一下Vite和Vue3。

Vue3

2020年09月18日Vue.js 3.0发布,经历了两年时间的对细节的不断优化与调整,终于在今年2月正式成为新的默认版本。其作者尤雨溪将Vue3的目标描述为:

1、更快

2、更小

3、更易于维护

4、原生目标更容易

5、开发更轻松

只看上述内容,你可能感受不到Vue3究竟优化了什么。这里我们将它和Vue2来对比一下,为大家具体说明它的优越之处。

性能的提升

在官方文档中针对Vue2和Vue3之间的性能差异有具体的数据介绍:

1、SSR速度提高了2~3倍

2、Update性能提高1.3~2倍

其中性能提升的重要一点是Vue3中对diff算法进行了优化。

在Vue2中,每当数据发生变化,就会生成一个新的DOM树,并新DOM树与旧的DOM树进行对比,来判断节点异同,并进行更新。但完整遍历过程需要将两棵树所有节点进行比较,但实际情况中并不是所有节点内容都会变化,这就造成了性能的浪费。

Vue3新增了静态标记,仅对标记了的节点进行对比并进一步更新,无需再遍历整个节点,实现了性能提升。

组合式API

Vue2使用选项型API(Options API),这种方式下将代码分割为不同的属性:data、computed、methods 等,这些方法属性各司其职。

举个例子,当我们想实现一个列表视图功能,需要在data中写此功能相关的数据,在methods中写相关的逻辑判断和后端交互方法等;如果还希望有搜索和筛选,或者更多的功能,那么逻辑关注点会越来越多,导致组件变得难以理解和维护。(下图为示例组件)

组合式API(Composition API)正是为了解决原本Vue2项目中代码逻辑分散、不易理解和维护的问题。它使用方法(function)进行代码分割,使代码更为简洁。

生命周期函数变更

与Vue2相比,Vue3中生命周期函数也发生了变更,总结如下:

有需要的同学可以截图保存,以备不时之需。

按需打包模块

在Vue项目中有众多API和模块,但在一个项目中我们并不会用到全部内容, Vue3的按需打包模块,可以大幅度压缩打包后的内容体积。

根据官网对比示例,Vue2中如果仅写了Hello Word,未用到任何模块API,打包后大小约为32KB;而Vue3同理,打包后大小约为13.5KB,可以明显看出升级后的Vue3相较于Vue2打包体积大幅减小。

说完了Vue3的改进,接下来我们来看看Vite又有什么亮眼之处。

Vite

在Vue3正式发布之前,尤雨溪就提到做了一个新的前端构建工具-Vite。其本人更是对Vite青睐有加,引得Webpack开发者直喊大哥:

Vite究竟有什么样的魔力呢?它做到了本地快速开发启动:

  1. 快速冷启动,而不需要等待打包操作
  2. 即时的模块热更新
  3. 真正的按需编译,不用等待整个项目编译完成、

在使用Webpack时,会经历分析依赖 => 编译打包 => 交给开发服务器渲染 整个过程。也就是说,需要先打包,之后将打包结果提供给服务器进行加载。特别是随着模块的不断增多,打包的体积越来越大,造成热更新速度明显拖慢。

而Vite直接略过了打包步骤,直接启动开发服务器,请求具体的模块时再对该模块进行实时编译,大大提高了启动速度。

尤雨溪本人也在微博发言解释了其原理:“Vite,一个基于浏览器原生 ES imports 的开发服务器。利用浏览器去解析 imports,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。同时不仅有 Vue 文件支持,还搞定了热更新,而且热更新的速度不会随着模块增多而变慢。针对生产环境则可以把同一份代码用 rollup 打。虽然现在还比较粗糙,但这个方向我觉得是有潜力的,做得好可以彻底解决改一行代码等半天热更新的问题。”

(Vite具体的实现原理可参考文章:https://juejin.cn/post/6844904136299790349)

使用Vite初始化Vue3项目

在这里需要需要注意:根据官网文档说明,使用Vite需要node版本在12以上,请在创建项目前检查node版本

初始化项目命令:

  1. $ npm init vite-app <project-name> // (project-name 为项目名)创建vite项目脚手架包
  2. $ cd <project-name> //进入项目目录
  3. $ npm install //安装项目所需依赖
  4. $ npm run dev //启动项目

做个示例:搭建一个名为 myVue3 的项目。

执行命令:npm intit vite-app myVue3

可以看到,在Practice文件夹中已经搭建好了一个项目。项目结构如下:

执行命令:cd myVue3 进入项目目录

执行命令:npm install 安装相关模块。

项目结构如下:模块已下载成功。

最后执行命令:npm run dev 启动这个项目

进入地址,当我们看到这个页面时,说明项目已经成功启动了。



铺垫都准备好了,话不多说我们正式开始。

项目实战

了解了Vue3和Vite后,接下来我们用一个实际项目体验一下。

思路:

使用表格组件做一个简单的在线Excel填报系统。

其中A页面使用编辑器进行模板设计并保存。

B页面使用SpreadJS导入模板并进行填报上传。

实现机制为SpreadJS的数据绑定功能,大家可以先通过下方链接了解其作用

https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/data-binding/table-binding/purejs

主要代码如下:

先来安装需要的模块

  1. "dependencies": {
  2. "vue": "^3.0.4",
  3. "@grapecity/spread-sheets-designer-vue": "15.1.0",
  4. "@grapecity/spread-sheets-designer": "15.1.0",
  5. "@grapecity/spread-sheets-designer-resources-cn": "15.1.0",
  6. "@grapecity/spread-sheets": "15.1.0",
  7. "@grapecity/spread-sheets-resources-zh": "15.1.0",
  8. "@grapecity/spread-excelio": "15.1.0",
  9. "@grapecity/spread-sheets-barcode": "15.1.0",
  10. "@grapecity/spread-sheets-charts": "15.1.0",
  11. "@grapecity/spread-sheets-languagepackages": "15.1.0",
  12. "@grapecity/spread-sheets-print": "15.1.0",
  13. "@grapecity/spread-sheets-pdf": "15.1.0",
  14. "@grapecity/spread-sheets-shapes": "15.1.0",
  15. "@grapecity/spread-sheets-tablesheet": "15.1.0",
  16. "@grapecity/spread-sheets-pivot-addon": "15.1.0",
  17. "@grapecity/spread-sheets-vue": "15.1.0",
  18. "@types/file-saver": "^2.0.1",
  19. "vue-router": "^4.0.0-rc.5"
  20. }

运行命令 npm install 来安装所有依赖项目。

接下来我们来配置路由。

1、在src文件夹下新建文件。

  1. router/index.js

2、进行路由的配置

  1. import { createRouter, createWebHistory } from "vue-router";
  2. const routes = [
  3. {
  4. path: "/",
  5. name: "Designer",
  6. component: () => import("../views/Designer.vue"),
  7. },
  8. {
  9. path: "/spreadSheet",
  10. name: "SpreadSheet",
  11. component: () => import("../views/SpreadSheet.vue"),
  12. }
  13. ];
  14. export const router = createRouter({
  15. history: createWebHistory(),
  16. routes:routes
  17. });

3、在main.js引入

  1. import { createApp } from 'vue'
  2. import { router } from './router/index'
  3. import App from './App.vue'
  4. import './index.css'
  5. const app = createApp(App)
  6. app.use(router);
  7. app.mount('#app')

4、修改App.vue

  1. <template>
  2. <div id="app">
  3. <div>
  4. <router-link to="/">Designer</router-link> |
  5. <router-link to="/spreadSheet">SpreadSheet</router-link>
  6. </div>
  7. <router-view/>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. name: 'App',
  13. components: {
  14. }
  15. }
  16. </script>

看到这里大家应该会发现,路由的配置以及 main.js 引入的方式较Vue2有所不同了。简而言之,Vue Router的Vue3版本的主要区别在于我们必须导入新方法才能使代码正常工作。其中最重要的是createRouter 和 createWebHistory。总体来说,它仍然与vue2非常相似,但是通过这些更改,可以更好的支持Typescript和进行优化。

代码中也体现出vue3 组合式API的特点。相较于vue2选项型API(将代码分割为 data、methods等),vue3在setup方法内部定义数据和方法,将业务逻辑抽离为函数,并通过return返回,使代码逻辑更为简洁清晰。

配置完路由之后,我们开始集成组件化表格编辑器(Designer)和SpreadJS。

一、 集成Designer

代码如下所示:

  1. <template>
  2. <div>
  3. <div id="ssDesigner" style="height:700px;width:100%;text-align: left;"></div>
  4. </div>
  5. </template>
  6. <script>
  7. import {onMounted, ref, reactive} from "vue";
  8. import '@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css';
  9. import '@grapecity/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css';
  10. import "@grapecity/spread-sheets-shapes";
  11. import '@grapecity/spread-sheets-pivot-addon';
  12. import "@grapecity/spread-sheets-tablesheet";
  13. import GC from '@grapecity/spread-sheets'
  14. import "@grapecity/spread-sheets-resources-zh";
  15. GC.Spread.Common.CultureManager.culture("zh-cn");
  16. import "@grapecity/spread-sheets-designer-resources-cn";
  17. import "@grapecity/spread-sheets-designer";
  18. import {designerConfig} from '../files/config'
  19. //import {myBudget } from '../files/budget.js';
  20. import {myBudget} from '../files/right_demo.js';
  21. export default {
  22. name: 'Designer',
  23. props: {
  24. },
  25. setup() {
  26. let designer;
  27. let spreadDom;
  28. let spread;
  29. onMounted(() => {
  30. designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("ssDesigner"), designerConfig);
  31. spreadDom = designer.getWorkbook().getHost();
  32. spread = GC.Spread.Sheets.findControl(spreadDom);
  33. //spread.fromJSON(myBudget);
  34. })
  35. return {
  36. designer,
  37. spread
  38. };
  39. }
  40. }
  41. </script>
  42. <style scoped>
  43. </style>

1、在模板中添加一个div,这个div就是设计器的容器,可以通过css设置容器的宽高位置等,也就是自定义了设计器的显示大小及位置。

2、导入设计器所需要的依赖。

3、在setup函数中初始化designer

这时页面就可以加载显示设计器了,说明我们已经成功将设计器集成在项目中。

Designer的页面与Excel类似,利用工具栏提供的UI按钮和特有的数据绑定功能,我们可以轻松实现模板设计。

当然也可以通过导入按钮或者使用接口(fromJSON)直接加载预设好的模板。

完成模板设计后点击保存按钮进行提交,这里我们先将数据保存至sessionStorage,方便后面的获取。



注:

原生Designer并未包含保存按钮,我们可以利用其强大的自定制能力根据业务需求来执行相关代码逻辑,保存按钮的代码逻辑如下图:

自定制组件完整代码可以参考文章末尾的demo,这里不再一一介绍了。

到此Designer的集成与模板设计完成,接下来看下如何集成表格控件并进行数据的填报和收集。

二、 集成SpreadJS

与集成Designer类似,首先先创建一个名为SpreadSheet的vue页面。

  1. <template>
  2. <div>
  3. <div>
  4. <button :style="{margin: '20px'}" @click="importTemplate()">导入模板</button>
  5. <button @click="setDataSource()">绑定数据源</button>
  6. <button @click="saveTemplate()">保存</button>
  7. </div>
  8. <div id="ss" style="height:700px;width:100%;text-align: left;"></div>
  9. </div>
  10. </template>
  11. <script>
  12. import { onMounted, ref} from "vue";
  13. import "../../node_modules/@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css"
  14. import GC from "@grapecity/spread-sheets"
  15. import "@grapecity/spread-sheets-resources-zh";
  16. export default {
  17. name: 'SpreadSheet',
  18. components: {
  19. },
  20. setup(){
  21. let spread, sheet;
  22. onMounted(() => {
  23. let workbook = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
  24. let spreadDom = workbook.getHost();
  25. spread = GC.Spread.Sheets.findControl(spreadDom);
  26. });
  27. let importTemplate = () => {
  28. const json = JSON.parse(sessionStorage.getItem("templateJson"));
  29. spread.fromJSON(json);
  30. };
  31. let setDataSource = () => {
  32. sheet = spread.getActiveSheet();
  33. let table = sheet.tables.all()[0];
  34. table.allowAutoExpand(true);
  35. table.expandBoundRows(true);
  36. let data = {
  37. budget: [
  38. {item:"部门活动", Jan: 15, Feb: 25, Mar: 10, Apr: 25, May: 13, Jun: 15},
  39. {item:"差旅费", Jan: 15, Feb: 25, Mar: 10, Apr: 25, May: 13, Jun: 15},
  40. {item:"办公费", Jan: 15, Feb: 25, Mar: 10, Apr: 25, May: 13, Jun: 15},
  41. {item:"广告费", Jan: 15, Feb: 25, Mar: 10, Apr: 25, May: 13, Jun: 15},
  42. {item:"招待费", Jan: 15, Feb: 25, Mar: 10, Apr: 25, May: 13, Jun: 15}
  43. ]
  44. }
  45. let datasource = new GC.Spread.Sheets.Bindings.CellBindingSource(data);
  46. sheet.setDataSource(datasource);
  47. };
  48. let saveTemplate = () => {
  49. let source = sheet.getDataSource().getSource();
  50. sessionStorage.setItem("dataSource", JSON.stringify(source));
  51. console.log(source);
  52. alert("保存填报数据成功");
  53. };
  54. return {
  55. spread,
  56. importTemplate,
  57. setDataSource,
  58. saveTemplate
  59. }
  60. }
  61. }
  62. </script>

1、在模板中添加一个div,这个div就是spread的容器,可以通过css设置容器的宽高位置等,也就是自定义了spread的显示大小及位置。

2、添加导入模板、绑定数据源、保存按钮。

3、导入此组件所需要的依赖。

4、在setup方法中初始化spread。

5、实现各按钮对应的代码逻辑。

importTemplate 方法中使用fromJSON方法来加载Designer设计好的模板。

setDataSource中利用数据绑定功能绑定了预设好的数据源,或者你也可以修改或手动填报。

saveTemplate方法中获取修改/填报后的数据源,并可将数据源保存至后台数据库(本例保存至sessionStorage,仅作示例作用)。后期做填报汇总时就可以直接从后台数据库直接读取该数据源了。

至此,一个简单的在线Excel填报系统完成,感兴趣的小伙伴可以下载下方工程代码自己尝试一下。

https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MjIzMDM0fGIyODc2MDlmfDE2NTg4MjgyNzB8NjI2NzZ8OTk3MTg%3D

如果大家对更多实例感兴趣可以查看:

https://demo.grapecity.com.cn/spreadjs/gc-sjs-samples/index.html

手把手带你实现基于 Vite+Vue3 的在线Excel表格系统的更多相关文章

  1. 如何开发一款基于 Vite+Vue3 的在线表格系统(上)

    今天,葡萄带你了解如何基于Vite+Vue3实现一套纯前端在线表格系统. 在正式开始项目介绍之前,首先咱们首先来介绍一下Vite和Vue3. Vue3 Vue是什么?大多前端开发者对这个词已毫不陌生了 ...

  2. 如何开发一款基于 vite+vue3 的在线表格系统(下)

    在上篇内容中我们为大家分享了详细介绍Vue3和Vite的相关内容.在本篇中我们将从项目实战出发带大家了解Vite+Vue3 的在线表格系统的构建. 使用Vite初始化Vue3项目 在这里需要注意:根据 ...

  3. 基于Vite+React构建在线Excel

    Vite是随着Vue3一起发布的一款新型前端构建工具,能够显著的提升前端开发体验,它主要由两部分组成: (1)一个开发服务器,它基于**原生ES模块提供了丰富的内建功能,如速度快到惊人的 模块热更新( ...

  4. 基于java开发的在线题库系统tamguo

    简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...

  5. 基于 Next.js实现在线Excel

    如果要从头开始使用 React 构建一个完整的 Web 应用程序,需要哪些步骤? 这当然不像把大象装进冰箱那么简单,只需要分成三步:打开冰箱,拿起大象,塞进冰箱就好. 我们需要考虑细节有很多,比如: ...

  6. 3分钟手把手带你搭建基于selenium的自动化框架

    1 .什么是seleniumSelenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Sel ...

  7. 一篇带你了解如何使用纯前端类Excel表格构建现金流量表

    现金流量表(Cash Flow Statement),是指反映企业在一定会计期间现金和现金等价物流入和流出的报表.现金流量表是企业财务报表的三个基本报告之一(另外两个是资产负债表和损益表). 为了全面 ...

  8. 基于JSP+Servlet开发在线租车系统 java 源码

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以.IDE环境: Eclipse,Myeclipse,IDEA都可以tomcat环境: Tomcat 7.x,8. ...

  9. 基于 vite 创建 vue3 全家桶项目(vite + vue3 + tsx + pinia)

    vite 最近非常火,它是 vue 作者尤大神发布前端构建工具,底层基于 Rollup,无论是启动速度还是热加载速度都非常快.vite 随 vue3 正式版一起发布,刚开始的时候与 vue 绑定在一起 ...

随机推荐

  1. 软件项目管理 ——1.2.PMBOK与软件项目管理知识体系

    软件项目管理 --1.2.PMBOK与软件项目管理知识体系 归档于软件项目管理初级学习路线 第一章 软件项目管理基本概念 <初级学习路线合集 > @ 目录 软件项目管理 --1.2.PMB ...

  2. 【深入理解计算机系统CSAPP】第六章 存储器层次结构

    6 存储器层次结构 存储器系统(memory system)是一个具有不同容量.成本和访问时间的存储设备的层次结构.CPU 寄存器保存着最常用的数据.靠近 CPU 的小的.快速的高速缓存存储器(cac ...

  3. python初识数据类型(字典、集合、元组、布尔)与运算符

    目录 python数据类型(dict.tuple.set.bool) 字典 集合 元组 布尔值 用户交互与输出 获取用户输入 输出信息 格式化输出 基本运算符 算术运算符 比较运算符 逻辑运算符 赋值 ...

  4. 爬虫Ⅱ:scrapy框架

    爬虫Ⅱ:scrapy框架 step5: Scrapy框架初识 Scrapy框架的使用 pySpider 什么是框架: 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中) scr ...

  5. Python报错 ImportError: DLL load failed while importing win32api: %1 不是有效的 Win32 应用程序 的解决方法

    今天在用jupyter notebook 的时候发生了kernel error,点开之后提示了以下报错信息 Traceback (most recent call last): File " ...

  6. VBA驱动SAP GUI实现办公自动化(一)

    小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...

  7. TypeScript(3)基础类型

    基础类型 TypeScript 支持与 JavaScript 几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用. 布尔值 最基本的数据类型就是简单的true/false值,在JavaScri ...

  8. MySQL 千万数据库深分页查询优化,拒绝线上故障!

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 优化项目代码过程中发现一个千万级数据深分页问题,缘由是这样的 库里有一张耗材 MCS_PROD 表,通过同步 ...

  9. 程序分析与优化 - 7 静态单赋值(SSA)

    本章是系列文章的第七章,终于来到了鼎鼎大名的SSA,SSA是编译器领域最伟大的发明之一,也是影响最广的发明. 本文中的所有内容来自学习DCC888的学习笔记或者自己理解的整理,如需转载请注明出处.周荣 ...

  10. 28.MysQL的日志管理及备份与恢复

    MySQL 索引.事务与存储引擎 目录 MySQL 索引.事务与存储引擎 MySQL 索引 索引的概念 索引的作用及副作用 索引的作用 索引的副作用 创建索引的原则依据 索引的分类和创建 普通索引 唯 ...