Vue + ElementUI 后台管理系统项目心得(一)

最近参与了公司的 Vue + ElementUI 后台管理系统开发,目前项目告一段落,正好做一个总结。

本文件分三部分进行,其一是 JavaScript 部分,其二是 Vue 部分,最后是 ElementUI 部分。

一、对JavaScript的理解

如何复制一个Js对象?

在 C#,Java 等面向对象的高级语言中,可以直接通过 ‘=’ 赋值操作符复制一个对象,如果想定义一个指向对象的代理要用到指针定义,然而 Js 早期出于性能的考虑,默认将 ‘=’ 赋值操作符用于定义一个指向对象的指针。

var a = { prop: 'val' }
var b = a
a.prop = 'nothing'
console.log(b.prop) // 'nothing'

无论怎样 ‘复制’,新对象总是指向原始对象,原始对象发生改变,新对象也自然改变。如何复制对象呢?我们知道,对象可以互相嵌套,即对象属性可以是另一个对象,那么通过普通的循环遍历来复制原对象的属性到一个新对象中是无法确保两者保持一致的,因此这种复制也被称作 ‘浅拷贝’。相对的通过递归遍历来复制对象的方式也被称作 ‘深拷贝’。

// 浅拷贝
function extendCopy(p) {
  var c = {};
  for (var i in p) { 
    c[i] = p[i];
  }
  c.uber = p;
  return c;
}
// 深拷贝
function deepCopy(p, c) {
  var c = c || {};
  for (var i in p) {
    if (typeof p[i] === 'object') {
      c[i] = (p[i].constructor === Array) ? [] : {};
      deepCopy(p[i], c[i]); // 递归调用
    } else {
       c[i] = p[i];
    }
  }
  return c;
}

当然,可以在项目中引入函数库(如 utils.js)来方便的引用这些扩展函数,不过我们不得不想有没有更简洁的方式来实现呢?答案是肯定的。

// utils.js
export const extendCopy(p) {...}
export const deepCopy(p, c) {...}
// page.js
import {extendCopy, deepCopy} from utils.js
a = {...}
b = extendCopy(a)

一般还可以通过如下方式解决:

  • 通过 JSON 对象提供的 stringify 和 parse 方法组合使用的方式实现。
// 勉强也算一句话解决了,问题在于性能不理想。
var a = {}
var b = JSON.parse(JSON.stringify(a))
  • 通过在函数中以返回值的形式生成新对象。
// 这种方式的缺点在于要以字面量的形式定义一个原始对象作为模板。
a = function(){ 
return { prop:"123" } 
}
b = a()
d = a()
b === d // false
  • 通过 ES2015 中提供的 Object.assign() 方法来复制。
// 简洁明了,性能良好的解决方案
var a = {}
var b = Object.assign({},a)

通过上面的例子,我们不难得出一个结论:复制一个对象的最佳方案是采用 Object.assign() 方法来实现。

如何判断一个元素是否在集合中

由于 Js 并没有实现类似 array.contains(item) 的方法,因此只能通过元素在集合中的索引判断。

var isSelected = function (row) {
  return (selection || []).indexOf(row) > -1;
}

判断一个变量是否为非空对象

首先 null 的类型是对象,如果在控制台输入 typeof null 会返回 "object",事实上我们要检测一个非空数组,就要先排除 null 值的可能。

var isObject = function(obj) {
  return obj !== null && typeof obj === 'object'
}

如何查询一个数组并返回元素的子集

这里用到了数组的 filter 方法,此方法具有以下特点:

  1. 需要传入一个回调函数作为参数,此函数应返回一个布尔值。
  2. filter 执行时会对数组中的每一个元素执行一边回调函数。
  3. filter 的返回值为一个新数组,其成员为原数组中返回值为 true 的元素。
var users = allUsers.filter((user) => user.loged === true)

如何判断一个对象没有任何属性

在 Js 中两个空对象进行比较会有什么结果呢?

var a = {}
a === {} // false

在 Js 中对 object 类型的数据应用等于操作符时,比较的是两个变量是否指向同一个引用,也就是说在内存中是否为同一个地址。

而我们期待的结果是比较两个对象在逻辑上是否具有相同的属性,空对象是一个特例,它们不具有任何属性。

if (Object.keys(search).length !== 0) {
    args = Object.assign({}, args, search)
}

这里用到 Object.keys() 方法,获取对象键的集合并判断其长度是否为 0 即可。

如何使用循环删除数组中的多个元素

for (let i = 0, let j = delIds.length - 1; i < j; i++) {
    allItems.splice (delIds[i], 0)
}

如上根据索引来循环删除原始数组中的元素是否可行呢,如果我们执行这段代码是无法得到预期结果的。原因在于当前面的元素被删除时,后面元素的索引发生了变化,在用删除前的索引就无法定位正确的元素,解决的方法有两种:

  • 通过倒序循环,获取被删除元素的索引,从后向前遍历删除。
for (let i = delIds.length - 1; i > 0; i++) {
    allItems.splice (delIds[i], 0)
}
  • 通过数组的两个方法即 forEach 配合 indexOf 删除,这种方法需要获取被删除元素本身,动态获取它的索引。
delItems.forEach ((item) => {
    allItems.splice (allItems.indexOf(item), 0)
})

(未完待续...)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,236评论 11 349
  • 清晨一场雨,路上已湿滑。天空却有朝霞样的云朵。 午后 晃晃悠悠的,梦溪路站台,随便搭上一辆29路,沿着长江路,好...
    蔚少然阅读 229评论 0 0
  • 阳光灿烂, 绿荫沁凉, 白色栀子花瓣, 淡淡茉莉花香。 浓了整个青春 , 浅浅淡淡, 恋着...... ...
    不晚的晚晚阅读 475评论 0 0
  • 梦中的江南,梦中的周庄,梦中的岁月,梦中的你我他......
    盛夏紫菀阅读 496评论 2 3