详解VUE 数组更新


Posted in Javascript onDecember 16, 2017

1、数据方法分类:

(1)原数组改变

push
 pop
 unshift
 shift
 reverse
 sort
 splice

(2)原数组未变,生成新数组

slice
 concat
 filter

对于使原数组变化的方法,可以直接更新视图。

对于原数组未变的方法,可以使用新数组替换原来的数组,以使视图发生变化。

示例代码:

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>vue示例</title>
  </head>
  <body>
    <div id="app">
      <ul>
        <template v-for="book in books">
          <li>书名:{{book.name}}</li>
          <li>作者:{{book.author}}</li>
        </template>
      </ul>
    </div>
    <script src="https://cdn.bootcss.com/vue/2.5.9/vue.min.js"></script>
    <script type="text/javascript">
      var app = new Vue({
        el: '#app',
        data: {
          books: [{
              name: 'vuejs',
              author: 'a'
            },
            {
              name: 'js高级',
              author: 'b'
            },
            {
              name: 'java',
              author: 'c'
            }
          ]
        }
      });
      //直接可以使得视图改变
      //app.books.push({name: 'c++',author: 'd'});
      //需要更新原数组
      app.books = app.books.concat([{name: 'c++',author: 'd'}]);
    </script>
  </body>
</html>

注意:以下不会触发视图的更新。

(1)通过索引直接设置项。

(2)修改数组长度,app.books.length=1。

若不想改变原数组,可以使用计算属性来过滤数组,如:

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>vue示例</title>
  </head>
  <body>
    <div id="app">
      <ul>
        <template v-for="book in filterBooks">
          <li>书名:{{book.name}}</li>
          <li>作者:{{book.author}}</li>
        </template>
      </ul>
    </div>
    <script src="https://cdn.bootcss.com/vue/2.5.9/vue.min.js"></script>
    <script type="text/javascript">
      var app = new Vue({
        el: '#app',
        data: {
          books: [{
              name: 'vuejs',
              author: 'a'
            },
            {
              name: 'js高级111',
              author: 'b'
            },
            {
              name: 'java33333',
              author: 'c'
            }
          ]
        },
        computed:{
          filterBooks:function(){
            return this.books.sort(function(a,b){
              return a.name.length>b.name.length?1:-1
            })
          }
        }
      });
    </script>
  </body>
</html>

那么vue如何监听数据的变化呢?

1)如何追踪变化

每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。

2)变化检测问题

受现代 JavaScript 的限制(以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。例如:

var vm = new Vue({
 data:{
 a:1
 }
})
// `vm.a` 是响应的
vm.b = 2
// `vm.b` 是非响应的

Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上:

Vue.set(vm.someObject, 'b', 2)

还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名,?是我们在项目中用过的一次,this.imgLen=3,目的使this.userImgsh=["审核成功","审核成功","审核成功"]

var _this=this
for (var i = 0; i <this.imgLen;i++) {
  if(_this.userImgsh[i] === '审核成功') continue;
    _this.$set(_this.userImgsh, i, '审核成功');
}

总结

以上所述是小编给大家介绍的详解VUE 数组更新问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
firefox浏览器不支持innerText的解决方法
Aug 07 Javascript
js实现模拟银行卡账号输入显示效果
Nov 18 Javascript
JQuery+EasyUI轻松实现步骤条效果
Feb 22 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
Apr 26 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
May 26 Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
前端把html表格生成为excel表格的实例
Sep 19 Javascript
JS逻辑运算符短路操作实例分析
Jul 09 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 jQuery
javascript实现京东登录显示隐藏密码
Aug 02 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 Javascript
详解如何用模块化的方式写vuejs
Dec 16 #Javascript
浅谈 Vue 项目优化的方法
Dec 16 #Javascript
在vue-cli中组件通信的方法
Dec 16 #Javascript
动手写一个angular版本的Message组件的方法
Dec 16 #Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 #Javascript
使用Electron构建React+Webpack桌面应用的方法
Dec 15 #Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
Dec 15 #Javascript
You might like
php中去除所有js,html,css代码
2010/10/12 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
JavaScript错误处理
2015/02/03 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
JavaScript学习笔记之创建对象
2016/03/25 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
Node.js 基础教程之全局对象
2017/08/06 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
python创建n行m列数组示例
2019/12/02 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Python代码注释规范代码实例解析
2020/08/14 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
装修致歉信
2014/01/15 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
教师评语大全
2014/04/28 职场文书
工作求职信
2014/07/04 职场文书
初中教师个人工作总结
2015/02/10 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
python实现自定义日志的具体方法
2021/05/28 Python
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python