数组更新检测
- 变异方法:(修改原有数据)
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
- 替换数组:(生成新的数组)
- filter()
- concat()
- slice()
变异方法,顾名思义,会改变调用了这些方法的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如 filter()、concat() 和 slice() 。它们不会改变原始数组,而总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组
Vue官网:数组更新检测
//数组响应式变化
//修改响应式数据
Vue.set(vm.list,1,'lemon');
vm.$set(vm.list,2,'lemon');
vm.$set(vm.info,'gender','man');
测试代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<div>
<span>
<input type="text" v-model="fname"/>
<button @click="add">添加</button>
<button @click="del">删除</button>
<button @click="change">替换</button>
</span>
</div>
<ul>
<li :key='index' v-for='(item,index) in list'>{{item}}</li>
</ul>
<div>{{info.name}}</div>
<div>{{info.age}}</div>
<div>{{info.gender}}</div>
</div>
<script type="text/javascript" src="js/vue.min.js" ></script>
<script type="text/javascript">
/*
* 数组更新检测
* 变异方法(修改原有数据)
* 替换数组(生成新的数组)
*/
var vm = new Vue({
el: '#app',
data: {
fname: '',
list: ['apple','orange','banana'],
info: {
name: 'lisi',
age: 12
}
},
methods: {
add: function(){
this.list.push(this.fname);
},
del: function(){
this.list.pop();
},
change: function(){
this.list = this.list.slice(0,2);
}
}
});
//数组响应式变化
//修改响应式数据
Vue.set(vm.list,1,'lemon');
vm.$set(vm.list,2,'lemon');
vm.$set(vm.info,'gender','man');
</script>
</script>
</body>
</html>
综合案例
代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.ddd {
margin: 15px auto;
width: 500px;
text-align: center;
}
.grid {
margin: auto;
width: 500px;
text-align: center;
}
.grid table {
width: 100%;
border-collapse: collapse;
}
.grid th,td {
padding: 10;
border: 1px dashed orange;
height: 35px;
line-height: 35px;
}
.grid th {
background-color: orange;
}
</style>
</head>
<body>
<!--常用特性
过滤器(格式化日期)
自定义指令(获取表单焦点)
计算属性(统计图书数量):this.books.length
侦听器(验证图书存在性)
生命周期(图书数据处理)23\24-->
<div id="app">
<div class="ddd">
<h1>图书管理</h1>
<span>编号:</span>
<span>
<input type="text" v-model="id" :disabled="flag"/>
</span>
<span>名称:</span>
<span>
<input type="text" v-model="name"/>
</span>
<button @click="handle">提交</button>
</div>
<div class="grid">
<table>
<thead>
<tr>
<th>编号</th>
<th>名称</th>
<th>时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr :key='item.id' v-for="item in books">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.date}}</td>
<td>
<!--@click.prevent-->
<a href="#" @click.prevent='toEdit(item.id)'>修改</a>
<span>|</span>
<a href="#" @click.prevent='deleteBook(item.id)'>删除</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<script type="text/javascript" src="js/vue.min.js" ></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
flag: false,
id: '',
name: '',
books: [{
id: 1,
name: '三国演义',
date: 2525609975000
},{
id: 2,
name: '水浒传',
date: 2525609975000
},{
id: 3,
name: '红楼梦',
date: 2525609975000
},{
id: 4,
name: '西游记',
date: 2525609975000
}]
},
methods: {
//实现添加业务逻辑
handle: function(){
if(this.flag){ //如果为true,即input被禁用,即进行编辑操作
//编辑操作
//就是跟胡当前的ID去更新数组对应的数据
this.books.some((item) => { // =>指上级作用域(父)
if(item.id == this.id){ //如果用function,this指window
item.name = this.name;
//完成更新操作后,需要终止循环
return true;
}
});
this.flag = false;
}else{
//添加图书
//空对象
var book = {};
//添加属性
book.id = this.id;
book.name = this.name;
book.date = '';
//把对象放数组里
this.books.push(book);
//清空表单
this.id = '';
this.name = '';
}
this.id = '';
this.name = '';
},
toEdit: function(id){
//禁止修改ID
this.flag = true;
console.log(id);
//根据ID查询出编辑的数据
var book = this.books.filter(function(item){
return item.id == id;
});
console.log(book);
//修改信息填充到表单
this.id = book[0].id;
this.name = book[0].name;
},
deleteBook: function(id){
//删除图书
//根据ID从数组中查找元素的索引
var index = this.books.findIndex(function(item){
return item.id == id;
});
//根据索引删除数组元素
this.books.splice(index,1);
//--------------------------------
// 方法2:filter (替换数组)
// this.books = this.books.filter(function(item){
// return item.id != id;
// });
}
}
});
</script>
</body>
</html>