首页 > 其他分享 >在线电子表格12

在线电子表格12

时间:2023-03-14 14:32:27浏览次数:35  
标签:10 12 在线 MVVM text 单元格 电子表格 col row

MVVM优点

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

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

在线电子表格12_数据

首先,我们定义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展示数据,例如,工具类页面,复杂的表单页面,用户登录后才能操作的页面等等。

标签:10,12,在线,MVVM,text,单元格,电子表格,col,row
From: https://blog.51cto.com/u_15692628/6120411

相关文章

  • NXP S32K312从零开发资源查找记录
    首先就是下载开发环境(40条消息)小猫爪:S32K3学习笔记01-S32K3RTD【MCAL&SDK】的使用和环境搭建_mcal开发sdk开发_小猫爪的博客-CSDN博客上述网址在安装S32DS.3.4_b201......
  • 【230314-2】已知:12^a=18 求:2^(2a-1/a-2)=?
    ......
  • selenium---浏览器F12的正确用法
    前言测试过程中经常会进行抓包来查看一些错误内容,判断是前端的问题还是后端的问题,常见的抓包工具有Fiddler,Charles,还有web端的F12。今天安静来介绍下如何通过F12进行抓包......
  • Python3.12中的新功能
    什么是3.12.0a6Python3.12仍在开发中。但是今天我们将看看Python3.12.0a6,这是七个计划中的alpha版本中的第六个。alpha版本的目的是更轻松地测试新功能和错误修复的......
  • 代码随想录训练营day 12||232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、104
    232.用栈实现队列题目链接:232.用栈实现队列思路使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关......
  • 第129篇:JS模块化开发
    好家伙,本篇为《JS高级程序设计》第二十六章“模块”学习笔记 JS开发会遇到代码量大和广泛使用第三方库的问题。解决这个问题的方案通常需要把代码拆分成很多部分,然后......
  • 自己动手从零写桌面操作系统GrapeOS系列教程——12.QEMU+GDB调试
    学习操作系统原理最好的方法是自己写一个简单的操作系统。写程序不免需要调试,写不同的程序调试方式也不同。如果做应用软件开发,相应的程序调试方式是建立在有操作系统......
  • Linux在线扩容
    数据盘/dev/sda空间不够申请在线扩容4T(大于2T),从原来的4T扩展到了8T,需要将新增4T空间添加至vg中,为谨慎起见先在测试环境中经过测试如何容量扩展,现将扩展过程步骤记录下来。......
  • 2023/03/12(日)多云;うわばきあらい,还没收拾完
    大宝是真能睡,不叫估计还能睡到中午;昨天回来蒸了米饭,结果都没吃晚饭,大宝说今天要吃炒米饭,我说好,又煎了鸡肉串;小宝说想吃烤贝壳,我说你原来在北京怎么不爱吃呀?他说有沙子,不......
  • 转载自 https://blog.csdn.net/m0_52165864/article/details/126218082
    Linux系列之系统监控命令 目录1、top命令的使用1、系统统计信息2、系统进程信息2、free命令使用:内存3、df命令的使用:磁盘4、ps命令的使用5、crontab命令6、查看端口的......