详解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 相关文章推荐
JavaScrip单线程引擎工作原理分析
Sep 04 Javascript
js防止表单重复提交的两种方法
Sep 30 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
May 23 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
Nov 17 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
JS动态加载脚本并执行回调操作
Aug 24 Javascript
Node.js使用NodeMailer发送邮件实例代码
Mar 06 Javascript
使用angular帮你实现拖拽的示例
Jul 05 Javascript
jQuery length 和 size()区别总结
Apr 26 jQuery
vue项目上传Github预览的实现示例
Nov 06 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 Javascript
JS实现瀑布流效果
Mar 07 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中date()日期函数有关参数整理
2011/07/19 PHP
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
Python3 翻转二叉树的实现
2019/09/30 Python
python中加背景音乐如何操作
2020/07/19 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
表彰先进集体通报
2014/01/12 职场文书
作弊检讨书1000字
2014/02/01 职场文书
保安队长职务说明书
2014/02/23 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
骨干教师考核方案
2014/05/09 职场文书
大学毕业生自我评价
2015/03/02 职场文书
2015年手术室工作总结
2015/05/11 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
各种货币符号快捷输入
2022/02/17 杂记