key的原理

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>key的原理</title>
		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
	</head>
	<body>
		<div id="box">
			<ul>
				<li v-for="u in userList" :key="u.id">
					姓名:{{u.name}} 年龄:{{u.age}}
					<input type="text" />
				</li>
			</ul>
			<button type="button" @click="addUser">添加数据</button>
		</div>
		<script>
			//在做列表渲染的时候一定要加上:key 否者数据发生改变时,样式会错位。
			//key一般使用数据的id
			Vue.config.productionTip = false;
			const vm = new Vue({
				el:'#box',
				data:{
					userList:[
						{id:'1001',name:'张三',age:18},
						{id:'1002',name:'李四',age:28},
						{id:'1003',name:'王五',age:38}
					]
				},
				methods:{
					addUser(){
						var u = {id:'1004',name:'赵六',age:48};
						//添加数据(前面追加)
						//this.userList.unshift(u);
						//添加数据(后面追加)
						this.userList.push(u);
					}
				}
			})
		</script>
	</body>
</html>

音乐搜索案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>音乐搜索案例</title>
		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
	</head>
	<body>
		<div id="box">
			搜索: <input type="text" v-model="searchValue">
			<ul>
				<li v-for="m in searchList" :key="m.id">
					<div style='width:200px;float: left;'>
						音乐:{{m.name}}
					</div>
					<div style='width:200px;float: left;'>
						歌手:{{m.sname}}
					</div>
					
				</li>
			</ul>
		</div>
		<script>
			//在做列表渲染的时候一定要加上:key 否者数据发生改变时,样式会错位。
			//key一般使用数据的id
			Vue.config.productionTip = false;
			const vm = new Vue({
				el:'#box',
				data:{
					searchValue:'',//用户搜索
					musicList:[],//数据
					searchList:[]//搜索结果
				}
			})
			
			vm.musicList = [
				{id:'1', name:'想唱就唱',sname:'张含韶'}
				,{id:'2', name:'冰点与沸点',sname:'张含韶'}
				,{id:'3', name:'夕阳无限好',sname:'陈奕迅'}
				,{id:'4', name:'爱的证明',sname:'沈建祥'}
				,{id:'5', name:'刻下纹身之后' ,sname:'小鸣'}
				,{id:'6', name:'双面人' ,sname:'伍佰'}
				,{id:'7', name:'长情' ,sname:'黎明'}
				,{id:'8', name:'我得你' ,sname:'张学友'}
				,{id:'9', name:'人人望放假' ,sname:'张学友'}
				,{id:'10', name:'太平洋的风' ,sname:'胡德夫'}
				,{id:'11', name:'吻下留人' ,sname:'许志安'}
				,{id:'12', name:'顺时针' ,sname:'梁咏琪'}
				,{id:'13', name:'回来我的爱' ,sname:'阳一'}
				,{id:'14', name:'两只蝴蝶' ,sname:'庞龙'}
				,{id:'15', name:'老鼠爱大米' ,sname:'杨臣刚'}
				,{id:'16', name:'丁香花' ,sname:'唐磊'}
				,{id:'17', name:'爱你' ,sname:'冷草莓'}
				,{id:'18', name:'美梦成真' ,sname:'冷草莓'}
				,{id:'19', name:'老鼠爱大米' ,sname:'huanggm2'}
				,{id:'20', name:'谢谢你的爱1999' ,sname:'cznana'}
				,{id:'21', name:'老鼠爱大米' ,sname:'英文版'}
				,{id:'22', name:'猪之歌' ,sname:'香香'}
				,{id:'23', name:'“吻别”英文版' ,sname:'Michael..'}
				,{id:'24', name:'别说我的眼泪你无..' ,sname:'东来东往'}
				,{id:'25', name:'追杀邱比特' ,sname:'蔡依林'}
				,{id:'26', name:'被风吹过的夏天' ,sname:'金莎'}
				,{id:'27', name:'你到底爱谁' ,sname:'刘嘉亮'}
				,{id:'28', name:'六月的雨' ,sname:'胡歌'}
				,{id:'29', name:'酸酸甜甜就是我' ,sname:'张含韵'}
				,{id:'30', name:'你好,周杰伦' ,sname:'安又淇'}
				,{id:'31', name:'江南' ,sname:'林俊杰'}
				,{id:'32', name:'情人' ,sname:'刀郎'}
				,{id:'33', name:'两只蝴蝶' ,sname:'庞龙'}
				,{id:'34', name:'2002年的第一场雪' ,sname:'刀郎'}
				,{id:'35', name:'看我七十二变' ,sname:'蔡依林'}
				,{id:'36', name:'恭喜发财' ,sname:'刘德华'}
				,{id:'37', name:'童话' ,sname:'光良'}
				,{id:'38', name:'寓言' ,sname:'张韶涵'}
				,{id:'39', name:'宁夏' ,sname:'梁静茹'}
				,{id:'40', name:'断点' ,sname:'张敬轩'}
				,{id:'41', name:'快乐崇拜' ,sname:'潘玮柏'}
				,{id:'42', name:'一首简单的歌' ,sname:'王力宏'}
				,{id:'43', name:'孤单北半球' ,sname:'欧得洋'}
				,{id:'44', name:'十年' ,sname:'陈奕迅'}
				,{id:'45', name:'男人海洋' ,sname:'周传雄'}
				,{id:'46', name:'挥着翅膀的女孩' ,sname:'容祖儿'}
				,{id:'47', name:'我们的爱' ,sname:'F.I.R'}
				,{id:'48', name:'第一次爱的人' ,sname:'王心凌'}
			];
			//监视属性
			vm.$watch('searchValue',function(nv){
				//console.log("用户搜索"+nv);
				//filter会把数据进行循环,如果为false则会移除数据,为true保留数据,最终返回一个集合。
				this.searchList = this.musicList.filter((p) => {//ES6
					if(p.name.indexOf(nv) !== -1){//包含
						return true;
					}else{
						return false;
					}
				});
			},{
				//初始化执行一次
				immediate:true,
			});
		</script>
	</body>
</html>

音乐播放案例(带排序)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>音乐搜索案例</title>
		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
	</head>
	<body>
		<div id="box">
			搜索: <input type="text" v-model="searchValue">
			<button @click="sortType = !sortType">排序</button>
			<ul>
				<li v-for="m in searchList" :key="m.id">
					<div style='width:300px;float: left;'>
						ID :{{m.id}}音乐:{{m.name}}
					</div>
					<div style='width:300px;float: left;'>
						歌手:{{m.sname}}
					</div>
					
				</li>
			</ul>
		</div>
		<script>
			//在做列表渲染的时候一定要加上:key 否者数据发生改变时,样式会错位。
			//key一般使用数据的id
			Vue.config.productionTip = false;
			const vm = new Vue({
				el:'#box',
				data:{
					searchValue:'',//用户搜索
					musicList:[],//数据
					searchList:[],//搜索结果
					sortType:true//true代表升序false代表降序
				}
			})
			
			vm.musicList = [
				{id:'1', name:'想唱就唱',sname:'张含韶'}
				,{id:'2', name:'冰点与沸点',sname:'张含韶'}
				,{id:'3', name:'夕阳无限好',sname:'陈奕迅'}
				,{id:'4', name:'爱的证明',sname:'沈建祥'}
				,{id:'5', name:'刻下纹身之后' ,sname:'小鸣'}
				,{id:'6', name:'双面人' ,sname:'伍佰'}
				,{id:'7', name:'长情' ,sname:'黎明'}
				,{id:'8', name:'我得你' ,sname:'张学友'}
				,{id:'9', name:'人人望放假' ,sname:'张学友'}
				,{id:'10', name:'太平洋的风' ,sname:'胡德夫'}
				,{id:'11', name:'吻下留人' ,sname:'许志安'}
				,{id:'12', name:'顺时针' ,sname:'梁咏琪'}
				,{id:'13', name:'回来我的爱' ,sname:'阳一'}
				,{id:'14', name:'两只蝴蝶' ,sname:'庞龙'}
				,{id:'15', name:'老鼠爱大米' ,sname:'杨臣刚'}
				,{id:'16', name:'丁香花' ,sname:'唐磊'}
				,{id:'17', name:'爱你' ,sname:'冷草莓'}
				,{id:'18', name:'美梦成真' ,sname:'冷草莓'}
				,{id:'19', name:'老鼠爱大米' ,sname:'huanggm2'}
				,{id:'20', name:'谢谢你的爱1999' ,sname:'cznana'}
				,{id:'21', name:'老鼠爱大米' ,sname:'英文版'}
				,{id:'22', name:'猪之歌' ,sname:'香香'}
				,{id:'23', name:'“吻别”英文版' ,sname:'Michael..'}
				,{id:'24', name:'别说我的眼泪你无..' ,sname:'东来东往'}
				,{id:'25', name:'追杀邱比特' ,sname:'蔡依林'}
				,{id:'26', name:'被风吹过的夏天' ,sname:'金莎'}
				,{id:'27', name:'你到底爱谁' ,sname:'刘嘉亮'}
				,{id:'28', name:'六月的雨' ,sname:'胡歌'}
				,{id:'29', name:'酸酸甜甜就是我' ,sname:'张含韵'}
				,{id:'30', name:'你好,周杰伦' ,sname:'安又淇'}
				,{id:'31', name:'江南' ,sname:'林俊杰'}
				,{id:'32', name:'情人' ,sname:'刀郎'}
				,{id:'33', name:'两只蝴蝶' ,sname:'庞龙'}
				,{id:'34', name:'2002年的第一场雪' ,sname:'刀郎'}
				,{id:'35', name:'看我七十二变' ,sname:'蔡依林'}
				,{id:'36', name:'恭喜发财' ,sname:'刘德华'}
				,{id:'37', name:'童话' ,sname:'光良'}
				,{id:'38', name:'寓言' ,sname:'张韶涵'}
				,{id:'39', name:'宁夏' ,sname:'梁静茹'}
				,{id:'40', name:'断点' ,sname:'张敬轩'}
				,{id:'41', name:'快乐崇拜' ,sname:'潘玮柏'}
				,{id:'42', name:'一首简单的歌' ,sname:'王力宏'}
				,{id:'43', name:'孤单北半球' ,sname:'欧得洋'}
				,{id:'44', name:'十年' ,sname:'陈奕迅'}
				,{id:'45', name:'男人海洋' ,sname:'周传雄'}
				,{id:'46', name:'挥着翅膀的女孩' ,sname:'容祖儿'}
				,{id:'47', name:'我们的爱' ,sname:'F.I.R'}
				,{id:'48', name:'第一次爱的人' ,sname:'王心凌'}
			];
			//监视属性
			vm.$watch('searchValue',function(nv){
				//console.log("用户搜索"+nv);
				//filter会把数据进行循环,如果为false则会移除数据,为true保留数据,最终返回一个集合。
				const arr = this.musicList.filter((p) => {//ES6
					if(p.name.indexOf(nv) !== -1 || p.sname.indexOf(nv) !== -1){//包含
						return true;
					}else{
						return false;
					}
				});
				
				//排序
				//sort如果返回p1-p2升序 如果返回p2-p1就是降序
				arr.sort((p1,p2) => {
					if(this.sortType){//升序
						return p1.id-p2.id;
					}else{//降序
						return p2.id-p1.id;
					}
				});
				
				//赋值
				this.searchList = arr;
			},{
				//初始化执行一次
				immediate:true,
			});
		</script>
	</body>
</html>

音乐播放案例(计算属性实现)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>音乐搜索案例(计算属性)</title>
		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
	</head>
	<body>
		<div id="box">
			搜索: <input type="text" v-model="searchValue">
			<button @click="sortType = !sortType">排序</button>
			<ul>
				<li v-for="m in searchList" :key="m.id">
					<div style='width:300px;float: left;'>
						ID :{{m.id}}音乐:{{m.name}}
					</div>
					<div style='width:300px;float: left;'>
						歌手:{{m.sname}}
					</div>
					
				</li>
			</ul>
		</div>
		<script>
			//在做列表渲染的时候一定要加上:key 否者数据发生改变时,样式会错位。
			//key一般使用数据的id
			Vue.config.productionTip = false;
			const vm = new Vue({
				el:'#box',
				data:{
					searchValue:'',//用户搜索
					musicList:[],//数据
					sortType:true//true代表升序false代表降序
				},
				computed:{//计算属性
					searchList(){
						//console.log("用户搜索"+nv);
						//filter会把数据进行循环,如果为false则会移除数据,为true保留数据,最终返回一个集合。
						const arr = this.musicList.filter((p) => {//ES6
							if(p.name.indexOf(this.searchValue) !== -1 || p.sname.indexOf(this.searchValue) !== -1){//包含
								return true;
							}else{
								return false;
							}
						});
						
						//排序
						//sort如果返回p1-p2升序 如果返回p2-p1就是降序
						arr.sort((p1,p2) => {
							if(this.sortType){//升序
								return p1.id-p2.id;
							}else{//降序
								return p2.id-p1.id;
							}
						});
						
						//赋值
						return arr;
					}
				}
			})
			
			vm.musicList = [
				{id:'1', name:'想唱就唱',sname:'张含韶'}
				,{id:'2', name:'冰点与沸点',sname:'张含韶'}
				,{id:'3', name:'夕阳无限好',sname:'陈奕迅'}
				,{id:'4', name:'爱的证明',sname:'沈建祥'}
				,{id:'5', name:'刻下纹身之后' ,sname:'小鸣'}
				,{id:'6', name:'双面人' ,sname:'伍佰'}
				,{id:'7', name:'长情' ,sname:'黎明'}
				,{id:'8', name:'我得你' ,sname:'张学友'}
				,{id:'9', name:'人人望放假' ,sname:'张学友'}
				,{id:'10', name:'太平洋的风' ,sname:'胡德夫'}
				,{id:'11', name:'吻下留人' ,sname:'许志安'}
				,{id:'12', name:'顺时针' ,sname:'梁咏琪'}
				,{id:'13', name:'回来我的爱' ,sname:'阳一'}
				,{id:'14', name:'两只蝴蝶' ,sname:'庞龙'}
				,{id:'15', name:'老鼠爱大米' ,sname:'杨臣刚'}
				,{id:'16', name:'丁香花' ,sname:'唐磊'}
				,{id:'17', name:'爱你' ,sname:'冷草莓'}
				,{id:'18', name:'美梦成真' ,sname:'冷草莓'}
				,{id:'19', name:'老鼠爱大米' ,sname:'huanggm2'}
				,{id:'20', name:'谢谢你的爱1999' ,sname:'cznana'}
				,{id:'21', name:'老鼠爱大米' ,sname:'英文版'}
				,{id:'22', name:'猪之歌' ,sname:'香香'}
				,{id:'23', name:'“吻别”英文版' ,sname:'Michael..'}
				,{id:'24', name:'别说我的眼泪你无..' ,sname:'东来东往'}
				,{id:'25', name:'追杀邱比特' ,sname:'蔡依林'}
				,{id:'26', name:'被风吹过的夏天' ,sname:'金莎'}
				,{id:'27', name:'你到底爱谁' ,sname:'刘嘉亮'}
				,{id:'28', name:'六月的雨' ,sname:'胡歌'}
				,{id:'29', name:'酸酸甜甜就是我' ,sname:'张含韵'}
				,{id:'30', name:'你好,周杰伦' ,sname:'安又淇'}
				,{id:'31', name:'江南' ,sname:'林俊杰'}
				,{id:'32', name:'情人' ,sname:'刀郎'}
				,{id:'33', name:'两只蝴蝶' ,sname:'庞龙'}
				,{id:'34', name:'2002年的第一场雪' ,sname:'刀郎'}
				,{id:'35', name:'看我七十二变' ,sname:'蔡依林'}
				,{id:'36', name:'恭喜发财' ,sname:'刘德华'}
				,{id:'37', name:'童话' ,sname:'光良'}
				,{id:'38', name:'寓言' ,sname:'张韶涵'}
				,{id:'39', name:'宁夏' ,sname:'梁静茹'}
				,{id:'40', name:'断点' ,sname:'张敬轩'}
				,{id:'41', name:'快乐崇拜' ,sname:'潘玮柏'}
				,{id:'42', name:'一首简单的歌' ,sname:'王力宏'}
				,{id:'43', name:'孤单北半球' ,sname:'欧得洋'}
				,{id:'44', name:'十年' ,sname:'陈奕迅'}
				,{id:'45', name:'男人海洋' ,sname:'周传雄'}
				,{id:'46', name:'挥着翅膀的女孩' ,sname:'容祖儿'}
				,{id:'47', name:'我们的爱' ,sname:'F.I.R'}
				,{id:'48', name:'第一次爱的人' ,sname:'王心凌'}
			];

		</script>
	</body>
</html>

 

最后修改于 2021-09-22 15:16:52
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇