详解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 相关文章推荐
Js判断参数(String,Array,Object)是否为undefined或者值为空
Nov 04 Javascript
javascript中interval与setTimeOut的区别示例介绍
Mar 14 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
Sep 11 Javascript
深入理解Vue.js源码之事件机制
Sep 27 Javascript
浅谈vue项目可以从哪些方面进行优化
May 05 Javascript
详解如何在vue-cli中使用vuex
Aug 07 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
May 07 Javascript
koa-router路由参数和前端路由的结合详解
May 19 Javascript
vue实现行列转换的一种方法
Aug 06 Javascript
vue的keep-alive用法技巧
Aug 15 Javascript
js实现手表表盘时钟与圆周运动
Sep 18 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 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 in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
儿科主治医生个人求职信
2013/09/23 职场文书
养殖人员的创业计划书范文
2013/12/26 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
应届生求职自荐信
2014/07/04 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
继承权公证书范本
2015/01/23 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
校车安全管理责任书
2015/05/11 职场文书