详解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 相关文章推荐
js获取单选按钮的数据
Nov 27 Javascript
js setattribute批量设置css样式
Nov 26 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
Jan 10 Javascript
jquery序列化表单去除指定元素示例代码
Apr 10 Javascript
浅析AngularJS中的指令
Mar 20 Javascript
jQuery获取选中单选按钮radio的值
Dec 27 Javascript
JS中mouseup事件丢失的原因与解决办法
Jun 14 Javascript
使用node打造自己的命令行工具方法教程
Mar 26 Javascript
Vue前端开发规范整理(推荐)
Apr 23 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 Javascript
ES6 迭代器与可迭代对象的实现
Feb 11 Javascript
使用原生js编写一个简单的框选功能方法
May 13 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基础学习笔记
2007/03/18 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
PHP 实现重载
2021/03/09 PHP
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
JavaScript变量的作用域全解析
2015/08/14 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
python通过post提交数据的方法
2015/05/06 Python
python中os模块详解
2016/10/14 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
Java基础面试题
2014/07/19 面试题
初中学校对照检查材料
2014/08/19 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
MySQL注入基础练习
2021/05/30 MySQL