详解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 1.2.x 升? 1.3.x 注意事项
May 06 Javascript
js控制div及网页相关属性的代码
Dec 19 Javascript
收集json解析的四种方法分享
Jan 17 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
Dec 16 Javascript
实现高性能JavaScript之执行与加载
Jan 30 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
Jan 17 Javascript
Node.js编写CLI的实例详解
May 17 Javascript
jquery实现图片轮播器
May 23 jQuery
JavaScript实现打印星型金字塔功能实例分析
Sep 27 Javascript
解决layer弹层遮罩挡住窗体的问题
Aug 17 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
Nov 09 jQuery
详解如何用模块化的方式写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中的reflection反射机制测试例子
2014/08/05 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
2014/01/07 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
学习jQuey中的return false
2015/12/18 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Python实现识别手写数字大纲
2018/01/29 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
python字符串下标与切片及使用方法
2020/02/13 Python
Python中如何引入第三方模块
2020/05/27 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
Etam德国:内衣精品店
2019/08/25 全球购物
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
百年校庆节目主持词
2014/03/27 职场文书
文秘应届生求职信
2014/07/05 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
导游词之临安白水涧
2019/11/05 职场文书
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js