博客
关于我
在线电子表格
阅读量:229 次
发布时间:2019-02-28

本文共 3537 字,大约阅读时间需要 11 分钟。

利用MVVM,很多非常复杂的前端页面编写起来就非常容易了。这得益于我们把注意力放在Model的结构上,而不怎么关心DOM的操作。

本节我们演示如何利用Vue快速创建一个在线电子表格:

mini-excel

首先,我们定义Model的结构,它的主要数据就是一个二维数组,每个单元格用一个JavaScript对象表示:

data: {    title: 'New Sheet',    header: [ // 对应首行 A, B, C...        { row: 0, col: 0, text: '' },        { row: 0, col: 1, text: 'A' },        { row: 0, col: 2, text: 'B' },        { row: 0, col: 3, text: 'C' },        ...        { row: 0, col: 10, text: 'J' }    ],    rows: [        [            { row: 1, col: 0, text: '1' },            { row: 1, col: 1, text: '' },            { row: 1, col: 2, text: '' },            ...            { row: 1, col: 10, text: '' },        ],        [            { row: 2, col: 0, text: '2' },            { row: 2, col: 1, text: '' },            { row: 2, col: 2, text: '' },            ...            { row: 2, col: 10, text: '' },        ],        ...        [            { row: 10, col: 0, text: '10' },            { row: 10, col: 1, text: '' },            { row: 10, col: 2, text: '' },            ...            { row: 10, col: 10, text: '' },        ]    ],    selectedRowIndex: 0, // 当前活动单元格的row    selectedColIndex: 0 // 当前活动单元格的col}

紧接着,我们就可以把Model的结构映射到一个<table>上:

<table id="sheet">    <thead>        <tr>            <th v-for="cell in header" v-text="cell.text"></th>        </tr>    </thead>    <tbody>        <tr v-for="tr in rows">            <td v-for="cell in tr" v-text="cell.text"></td>        </tr>    </tbody></table>

现在,用Vue把Model和View关联起来,这个电子表格的原型已经可以运行了!

下一步,我们想在单元格内输入一些文本,怎么办?

因为不是所有单元格都可以被编辑,首行和首列不行。首行对应的是<th>,默认是不可编辑的,首列对应的是第一列的<td>,所以,需要判断某个<td>是否可编辑,我们用v-bind指令给某个DOM元素绑定对应的HTML属性:

<td v-for="cell in tr" v-bind:contenteditable="cell.contentEditable" v-text="cell.text"></td>

在Model中给每个单元格对象加上contentEditable属性,就可以决定哪些单元格可编辑。

最后,给<td>绑定click事件,记录当前活动单元格的row和col,再绑定blur事件,在单元格内容编辑结束后更新Model:

<td v-for="cell in tr" v-on:click="focus(cell)" v-on:blur="change" ...></td>

对应的两个方法要添加到VM中:

var vm = new Vue({    ...    methods: {        focus: function (cell) {            this.selectedRowIndex = cell.row;            this.selectedColIndex = cell.col;        },        change: function (e) {            // change事件传入的e是DOM事件            var                rowIndex = this.selectedRowIndex,                colIndex = this.selectedColIndex,                text;            if (rowIndex > 0 && colIndex > 0) {                text = e.target.innerText; // 获取td的innerText                this.rows[rowIndex - 1][colIndex].text = text;            }        }    }});

现在,单元格已经可以编辑,并且用户的输入会自动更新到Model中。

如果我们要给单元格的文本添加格式,例如,左对齐或右对齐,可以给Model对应的对象添加一个align属性,然后用v-bind:style绑定到<td>上:

<td v-for="cell in tr" ... v-bind:style="{ textAlign: cell.align }"></td>

然后,创建工具栏,给左对齐、居中对齐和右对齐按钮编写click事件代码,调用setAlign()函数:

function setAlign(align) {    var        rowIndex = vm.selectedRowIndex,        colIndex = vm.selectedColIndex,        row, cell;    if (rowIndex > 0 && colIndex > 0) {        row = vm.rows[rowIndex - 1];        cell = row[colIndex];        cell.align = align;    }}// 给按钮绑定事件:$('#cmd-left').click(function () { setAlign('left'); });$('#cmd-center').click(function () { setAlign('center'); });$('#cmd-right').click(function () { setAlign('right'); });

现在,点击某个单元格,再点击右对齐按钮,单元格文本就变成右对齐了。

类似的,可以继续添加其他样式,例如字体、字号等。

MVVM的适用范围

从几个例子我们可以看到,MVVM最大的优势是编写前端逻辑非常复杂的页面,尤其是需要大量DOM操作的逻辑,利用MVVM可以极大地简化前端页面的逻辑。

但是MVVM不是万能的,它的目的是为了解决复杂的前端逻辑。对于以展示逻辑为主的页面,例如,新闻,博客、文档等,不能使用MVVM展示数据,因为这些页面需要被搜索引擎索引,而搜索引擎无法获取使用MVVM并通过API加载的数据。

所以,需要SEO(Search Engine Optimization)的页面,不能使用MVVM展示数据。不需要SEO的页面,如果前端逻辑复杂,就适合使用MVVM展示数据,例如,工具类页面,复杂的表单页面,用户登录后才能操作的页面等等。

参考源码

转载地址:http://ltes.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>
NIH发布包含10600张CT图像数据库 为AI算法测试铺路
查看>>
Nim教程【十二】
查看>>
Nim游戏
查看>>
NIO ByteBuffer实现原理
查看>>
Nio ByteBuffer组件读写指针切换原理与常用方法
查看>>
NIO Selector实现原理
查看>>