详解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 相关文章推荐
Javascript 各浏览器的 Javascript 效率对比
Jan 23 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
Aug 07 Javascript
javascript 实现简单的table排序及table操作练习
Dec 28 Javascript
JQuery 中几个类选择器的简单使用介绍
Mar 14 Javascript
Javascript跨域请求的4种解决方式
Mar 17 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
Sep 25 Javascript
实例详解jQuery结合GridView控件的使用方法
Jan 04 Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 Javascript
js轮播图代码分享
Jul 14 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
May 16 Javascript
用Fundebug插件记录网络请求异常的方法
Feb 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
js实现无缝轮播图
2020/03/09 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
深入理解Django的自定义过滤器
2017/10/17 Python
numpy中矩阵合并的实例
2018/06/15 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
Python类型转换的魔术方法详解
2020/12/23 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
SQL中where和having的区别
2012/06/17 面试题
高中生操行评语
2014/04/25 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
婚前财产协议书范本
2014/10/19 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
【2·13】一图读懂中国无线电发展
2022/02/18 无线电