Vue视图更新与数组

Vue包含一组观察数组变异的方法,使用它们改变数组也会触发视图更新:
     push() pop() shift() unshift()splice() sort() reverse()
不变异的方法:
     filter() concat() slice()
原理:
     -- Vue 在检测到数组变化时,并不是直接重新渲染整个列表,而是最大化复用DOM元素。替换的数组中,含有相同元素的项不会被重新渲染,
        因此可以大胆的用新数组来替换旧数组,不用担心性能问题。
     -- 值得注意的是:
        以下变动的数组中Vue是不能检测到的,也不会触发视图更新。
          1.通过索引直接设置项, 比如this.books[3]={...}
          2.修改数组长度, 比如 this.books.length = 1;
          两个问题都可以用splice来解决:
          第一个问题 还可以用 set方法 this.$set(this.books,3,{...})
数组API总结:
/* concat()
    1.不会改变现有的数组
    2.连接两个或多个数组,返回被连接后的新数组 */
  let a = [1,2,3];
  let b = [4,5,6];
  let c = [7,8,9];
  let d = a.concat(b,c) //[1,2,3,4,5,6,7,8,9]
  /*slice(start,end)
      1.不会改变现有的数组
      2.截取数组中的部分元素,并返回一个新的数组
      3.start : 必填,起始下标(包含);
        end : 可选,结束下标(不包含),当结束小标不存在时,默认最后
  */
  let a = [1,2,3,4,5,6]
  let b = a.slice(2,4) //[3,4]
  let c = a.slice(4)   //[5,6]
  /*push()
      1.改变现有的数组(包括长度)
      2.末尾添加一个或多个元素,并返回新的长度。*/
  let a = [1,2,3]
  let l = a.push(4,5,6,7) // 7 返回新的长度
  console.log(a)            //[1,2,3,4,5,6,7]
  /*unshift()
      1.改变现有的数组(包括长度)
      2.开头添加一个或多个元素,并返回新的长度。*/
  let a = [3,4,5]
  let l = a.unshift(1,2)  // 5 返回新的长度
  console.log(a)            //[1,2,3,4,5]
  /*splice(index,howMany,item1,...itemN)
      1.改变现有的数组(包括长度)
      2.数组中添加/删除项目,然后返回被删除的‘元素组成的新数组’。
      3.index   : 必填,添加/删除元素的下标
        howMany : 必填,要删除元素的数量,为0,不会删除元素
        item..  : 选填,向数组的index下标处添加新的元素*/
  let a = [1,2,3,4,5]
  let b = a.splice(2,2,'ss')
  console.log(b) // [3,4] 返回被删除的元素组成的新数组
  console.log(a) // [1,2,'ss',5]
  /*pop()
      1.改变现有的数组(包括长度)
      2.删除数组的最后一个元素,并返回其值*/
  let a = [1,2,3]
  let b = a.pop() // 3
  console.log(a)    // [1,2]
  let c = a.pop() // 2
  console.log(a)  //[1]
  let d = a.pop() //1
  console.log(a)  //[]
  let e = a.pop() // undefined (这时数组已经空了,不会改变数组,返回undefined值)
  console.log(a)  //[]
  /*shif()
      1.改变现有的数组(包括长度)
      2.删除数组的第一个元素,并返回其值*/
  let a = [1,2,3]
  let b = a.shift() // 1
  console.log(a)      // [2,3]
  let c = a.shift() // 2
  console.log(a)    //[3]
  let d = a.shift() //3
  console.log(a)    // []
  let e = a.shift() //undefined (这时数组已经空了,不会改变数组,返回undefined值)
  console.log(a)    // []
  /*sort(sortby)
      1.改变现有的数组(不包括长度)
      2.仅仅是对数组的元素进行排序,是对数组的引用,返回的还是原数组;
      3.sortby : 可选,规定排序规则,必须是函数,该函数接收两个参数a和b
          注意:@1.如果使用时没有传入sortby,将按照字符编码顺序对数组中的元素进行排序,且元素都应该转换成字符串
                 @2.sortby使用,比较a和b,如果a < b ,返回小于0的值,a排在b前,a = b ,返回0,a>b 返回 大于0的值*/
  //数字排序
  let a = [3,2,6,7,1,4,5]
  let sortNumber = function(a,b){
    return a-b
  }
  a.sort(sortNumber) //[1,2,3,4,5,6,7]
  //默认字符编码排序 (排的是字符串的首字母)
  let a = ['s','aa','ddy','hello','world']
  a.sort() //["aa", "ddy", "hello", "s", "world"]
  /*reverse()
      1.改变现有的数组(不包括长度)
      2.颠倒数组中元素的顺序*/
  let a = [1,2,3,4,5,6,7]
  a.reverse() //[7,6,5,4,3,2,1]
  /*join(separator)
        1.不会改变现有的数组
        2.不带separaor参数时,仅仅是将数组中的所有元素放入一个字符串中,并返回结果
        3.带有separaor参数时,同时会通过指定的separator(分隔符)分隔元素,在返回结果*/
  let a = [1,2,3,4,5,6]
  let b = a.join()     // "1,2,3,4,5,6"
  let c = a.join('-')  // "1-2-3-4-5-6"
  let d = a.join(' ')  // "1 2 3 4 5 6" 空格符
  console.log(a)       // [1,2,3,4,5,6]
  /*toString()
        1.不会改变现有的数组
        2.把数组转换为字符串,并返回结果*/
  let a = [1,2,3,4,5]
  let b = a.toString() // 1,2,3,4,5
  let c = a.join();
  console.log(b === c) //true

  //========================================================
  const arr = [
    {name : 'name1',author:'aaa'},
    {name : 'name2',author:'abb'},
    {name : 'javascript shishi',author:'acc'},
    {name : 'javascript 金翠',author:'add'},
  ];

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

推荐阅读更多精彩内容