Vue(day02-15~22: 数组更新检测-变异方法、替换数组)

数组更新检测

  • 变异方法:(修改原有数据)
    • 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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值