详解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 相关文章推荐
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
js改变img标签的src属性在IE下没反应的解决方法
Jul 23 Javascript
JS获取当前日期和时间的简单实例
Nov 19 Javascript
如何在node的express中使用socket.io
Dec 15 Javascript
node.js入门实例helloworld详解
Dec 23 Javascript
Vue.js学习之过滤器详解
Jan 22 Javascript
javascript表单正则应用
Feb 04 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
详解Vue 动态添加模板的几种方法
Apr 25 Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 Javascript
Vue组件模板及组件互相引用代码实例
Mar 11 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
Oct 14 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 动态随机生成验证码类代码
2010/04/09 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
js简单时间比较的方法
2016/08/02 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
Python脚本实现代码行数统计代码分享
2015/03/10 Python
Python打印斐波拉契数列实例
2015/07/07 Python
python队列queue模块详解
2018/04/27 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
Python检查ping终端的方法
2019/01/26 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
简历中的自我评价怎么写
2014/01/29 职场文书
工厂车间标语
2014/06/19 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
安全教育日主题班会
2015/08/13 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis