详解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 相关文章推荐
文本框input聚焦失焦样式实现代码
Oct 12 Javascript
解析jquery获取父窗口的元素
Jun 26 Javascript
多个jQuery版本共存的处理方案
Mar 17 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
浅谈javascript的call()、apply()、bind()的用法
Feb 21 Javascript
深入理解jQuery中的事件冒泡
May 24 Javascript
Bootstrap select下拉联动(jQuery cxselect)
Jan 04 Javascript
VueJs路由跳转——vue-router的使用详解
Jan 10 Javascript
bootstrap confirmation按钮提示组件使用详解
Aug 22 Javascript
详解vue使用$http服务端收不到参数
Apr 19 Javascript
JavaScript中的全局属性与方法深入解析
Jun 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php定时计划任务的实现方法详解
2013/06/06 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
pycharm新建一个python工程步骤
2019/07/16 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
几个Shell Script面试题
2012/08/31 面试题
工程项目建议书范文
2014/03/12 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
2014年安全生产责任书
2014/07/22 职场文书
建议书格式
2015/02/04 职场文书
2015个人半年总结范文
2015/03/09 职场文书
唐山大地震观后感
2015/06/05 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python