Vue数组更新及过滤排序功能


Posted in Javascript onAugust 10, 2017

前面的话

Vue为了增加列表渲染的功能,增加了一组观察数组的方法,而且可以显示一个数组的过滤或排序的副本。本文将详细介绍Vue数组更新及过滤排序

变异方法

Vue 包含一组观察数组的变异方法,它们将会触发视图更新,包含以下方法

push() 接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度

pop() 从数组末尾移除最后一项,减少数组的length值,然后返回移除的项

shift() 移除数组中的第一个项并返回该项,同时数组的长度减1

unshift() 在数组前端添加任意个项并返回新数组长度

splice() 删除原数组的一部分成员,并可以在被删除的位置添加入新的数组成员

sort() 调用每个数组项的toString()方法,然后比较得到的字符串排序,返回经过排序之后的数组

reverse() 用于反转数组的顺序,返回经过排序之后的数组

<div id="example">
 <div>
 <button @click='push'>push</button>
 <button @click='pop'>pop</button>
 <button @click='shift'>shift</button>
 <button @click='unshift'>unshift</button>
 <button @click='splice'>splice</button>
 <button @click='sort'>sort</button>
 <button @click='reverse'>reverse</button>
 </div>
 <ul>
 <li v-for="item in items" >
  {{ item.message }}
 </li>
 </ul> 
</div>

<script>
var example = new Vue({
 el: '#example',
 data: {
 items: [
  {message: 'Foo' },
  {message: 'Bar' },
  {message: 'Baz' }
 ],
 addValue:{message:'match'}
 },
 methods:{
 push(){
  this.items.push(this.addValue)
 },
 pop(){
  this.items.pop()
 },
 shift(){
  this.items.shift()
 },
 unshift(){
  this.items.unshift(this.addValue)
 },
 splice(){
  this.items.splice(0,1)
 },
 sort(){
  this.items.sort()
 },
 reverse(){
  this.items.reverse()
 },
 }
})
</script>

非变异方法

变异方法(mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异(non-mutating method)方法,例如: filter(), concat(), slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组

concat() 先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组

slice() 基于当前数组中一个或多个项创建一个新数组,接受一个或两个参数,即要返回项的起始和结束位置,最后返回新数组

map() 对数组的每一项运行给定函数,返回每次函数调用的结果组成的数组

filter() 对数组中的每一项运行给定函数,该函数会返回true的项组成的数组

<div id="example">
 <div>
 <button @click='concat'>concat</button>
 <button @click='slice'>slice</button>
 <button @click='map'>map</button>
 <button @click='filter'>filter</button>
 </div>
 <ul>
 <li v-for="item in items" >
  {{ item }}
 </li>
 </ul> 
</div>
<script>
var example = new Vue({
 el: '#example',
 data: {
 items: ['Foo','Bar','Baz'],
 addValue:'match'
 },
 methods:{
 concat(){
  this.items = this.items.concat(this.addValue)
 },
 slice(){
  this.items = this.items.slice(1)
 },
 map(){
  this.items = this.items.map(function(item,index,arr){
  return index + item; 
  })
 },
 filter(){
  this.items = this.items.filter(function(item,index,arr){
  return (index > 0); 
  })
 }
 }
})
</script>

以上操作并不会导致Vue丢弃现有DOM并重新渲染整个列表。Vue实现了一些智能启发式方法来最大化DOM元素重用,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作

无法检测

由于JS的限制, Vue 不能检测以下变动的数组:

1、利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue

2、修改数组的长度时,例如: vm.items.length = newLength

<div id="example">
 <div>
 <button @click='setVal'>setVal</button>
 <button @click='setLength'>setLength</button>
 <button @click='pop'>pop</button>
 </div>
 <ul>
 <li v-for="item in items" >{{ item }}</li>
 </ul> 
 <p>{{ message }}</p> 
</div>
<script>
var watchFunc = function(){
 example.message = '数据发生变化';
 setTimeout(function(){
 example.message = '';
 },500); 
}
var example = new Vue({
 el: '#example',
 data: {
 items: ['Foo','Bar','Baz'],
 message:'',
 },
 watch:{
 items:watchFunc
 },
 methods:{
 pop(){
  this.items.pop()
 },
 setVal(){
  this.items[0]= 'match';
 },
 setLength(){
  this.items.length = 2;
 }
 }
})
</script>

以上代码中,直接设置值和长度使用watch不能检测到变化

以下两种方式都可以实现和vm.items[indexOfItem]=newValue相同的效果, 同时也将触发状态更新

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)

 

为了解决第二类问题,可以使用 splice

example1.items.splice(newLength)
<div id="example">
 <div>
 <button @click='setVal1'>setVal1</button>
 <button @click='setVal2'>setVal2</button>
 <button @click='setLength'>setLength</button>
 </div>
 <ul>
 <li v-for="item in items" >{{ item }}</li>
 </ul> 
 <p>{{ message }}</p> 
</div>
<script>
var watchFunc = function(){
 example.message = '数据发生变化';
 setTimeout(function(){
 example.message = '';
 },500); 
}
var example = new Vue({
 el: '#example',
 data: {
 items: ['Foo','Bar','Baz'],
 message:'',
 },
 watch:{
 items:watchFunc
 },
 methods:{
 setVal1(){
  Vue.set(this.items, 0, 'match')
 },
 setVal2(){
  this.items.splice(1, 1, 'xiaohuochai')
 }, 
 setLength(){
  this.items.splice(2)
 }
 }
})
</script>

过滤排序

有时,要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以创建返回过滤或排序数组的计算属性

【computed】

<div id="example">
 <ul>
 <li v-for="n in evenNumbers">{{ n }}</li>
 </ul> 
</div>
<script>
var example = new Vue({
 el: '#example',
 data: {
 numbers: [ 1, 2, 3, 4, 5 ],
 },
 computed: {
 evenNumbers: function () {
  return this.numbers.filter(function (number) {
  return number % 2 === 0
  })
 }
 }
})
</script>

【methods】

在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 可以使用一个 method 方法

<div id="example">
 <ul>
 <li v-for="n in even(numbers)">{{ n }}</li>
 </ul> 
</div>
<script>
var example = new Vue({
 el: '#example',
 data: {
 numbers: [ 1, 2, 3, 4, 5 ],
 },
 methods: {
 even: function (numbers) {
  return numbers.filter(function (number) {
  return number % 2 === 0
  })
 }
 }
})
</script>

Vue数组更新及过滤排序功能

总结

以上所述是小编给大家介绍的Vue数组更新及过滤排序功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
Mar 05 Javascript
详解js中class的多种函数封装方法
Jan 03 Javascript
Angular2从搭建环境到开发步骤详解
Oct 17 Javascript
js封装成插件_Canvas统计图插件编写实例
Sep 12 Javascript
webpack 模块热替换原理
Apr 09 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
Oct 09 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
Apr 10 Javascript
Webpack性能优化 DLL 用法详解
Aug 10 #Javascript
详解React Native网络请求fetch简单封装
Aug 10 #Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
Aug 10 #jQuery
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
Aug 10 #Javascript
jquery.uploadView 实现图片预览上传功能
Aug 10 #jQuery
express框架实现基于Websocket建立的简易聊天室
Aug 10 #Javascript
bootstrap table服务端实现分页效果
Aug 10 #Javascript
You might like
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
MSN消息提示类
2006/09/05 Javascript
Javascript中eval函数的使用方法与示例
2007/04/09 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
python3中int(整型)的使用教程
2017/03/23 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
自学python的建议和周期预算
2019/01/30 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
管理站站长岗位职责
2013/11/27 职场文书
小学英语教学反思
2014/01/30 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
岗位职责怎么写
2014/03/14 职场文书
起诉意见书范文
2015/05/19 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python