每天一点VUE(DAY 3-VUE2篇)

目录

1、条件渲染

2、列表渲染

         2.1、遍历

        2.2、key的工作原理和重要性

        2.3、列表过滤

        2.4、列表排序


1、条件渲染

v-show的渲染(节点还在,只是用了 display:none;隐藏了)

v-if是直接吧这个元素从dom上移除了

		<div id='block'>
			<button v-show = "1"  >在</button>
			<button v-if = "1"  >在</button>
			<button v-show = "0"  >不在</button>
			<button v-if = "0"  >不在</button>
			<br>
			<button v-if = "0"  >if</button>
			<button v-else-if = "0"  >elseif</button>
			<button v-else   >else</button>
		</div>

注:if elseif else中,有一个为1后面的就不判断了,他们的顺序次序不能颠倒或者打断。

			<div v-if="0">
				<button v-show="1">在</button>
				<button v-if="1">在</button>
			</div>
			<template v-if="0">
				<button v-show="1">在</button>
				<button v-if="1">在</button>
			</template>
        
   /*注意,操作多个元素隐藏和显示,如果必须要给这些元素加一个容器,
    那就加template这样的话不会影响结构,如果用来div可能会影响之前的页面结构*/

2、列表渲染

         2.1、遍历

    数组遍历

		<div id='block'>
			<ul v-for="(item,index) in a" :key="item.id">
				<li>{{item.name}}-{{item.age}}</li>
			</ul>
		</div>

		let a = new Vue({
			el: '#block',
			data: {
				a:[
					{id:0,name:'g',age:20},
					{id:1,name:'s',age:20},
					{id:2,name:'w',age:20}
				]
			},
		})

字符串遍历

		<div id='block'>
			<ul v-for="(item,index) in a" :key="index">
				<li>{{item}}-{{index}}</li>
			</ul>
		</div>

		let a = new Vue({
			el: '#block',
			data: {
				a:"abcde"
			},
		})

对象遍历

		<div id='block'>
			<ul v-for="(item,index) in a" :key="index">
				<li>{{item}}-{{index}}</li>
			</ul>
		</div>

		let a = new Vue({
			el: '#block',
			data: {
				a:{
					name:"22",
					age:23,
					k:"99"
				}
			},
		})

遍历指定次数

		<div id='block'>
			<ul v-for="(item,index) in 6" :key="index">
				<li>{{item}}-{{index}}</li>
			</ul>
		</div>

        2.2、key的工作原理和重要性

vue在渲染页面时,首先会拿到数据,生成一个虚拟DOM,然后再生成真实DOM渲染到页面上,当数据发生变化时,vue会把新数据在再成一个虚拟DOM,然后根据key来和之前生成的虚拟DOM进行diff算法的对比,如果新数据的key的元素和旧数据的key的元素对比后不同,就把不同的部分生成真实DOM再次渲染到页面上,然后复用之前渲染好的相同的那部分真实DOM,如果对比后相同,就直接复用之前渲染好的那部分真实DOM。(这样做的好处是节约了资源,进行复用,让页面展示的更快,效率也比没加的高,如果我们没有加key的话,vue会自动帮我们加上:key="index")

产生的问题:如果你的key用的是index,并且在你的操作需要破坏之前的顺序结构(插入或者删除),就会发生错误。

//当你给每个li输入框写个值,在添加一个的话,index会从新的节点开头重新排,就会导致之前的乱了
	    <div id='block'>
			<ul v-for="(item,index) in a" :key="index">
				<li>{{item.name}}<input/></li>
			</ul>
			<button type="button" @click="add">btn</button>
		</div>

		let a = new Vue({
			el: '#block',
			data: {
				a:[{id:0,name:"擦1"},{id:1,name:"擦2"},{id:2,name:"擦3"}]
			},
			methods:{
				add(){
					this.a.unshift({
						id:3,
						name:"jsak"
					})
				}
			}
		})

解决::key="item.id"

        //当使用id作为key的时候,虚拟节点在进行对比时,就会找到对应的那个块,就不会发生错误
	    <div id='block'>
			<ul v-for="(item,index) in a" :key="item.id">
				<li>{{item.name}}<input/></li>
			</ul>
			<button type="button" @click="add">btn</button>
		</div>

		let a = new Vue({
			el: '#block',
			data: {
				a:[{id:0,name:"擦1"},{id:1,name:"擦2"},{id:2,name:"擦3"}]
			},
			methods:{
				add(){
					this.a.unshift({
						id:3,
						name:"jsak"
					})
				}
			}
		})

        2.3、列表过滤

watch方法

<div id='block'>
	<input type="text" v-model="search"/>
	<ul v-for="(item,index) in midList" :key="item.id">
		<li>{{item.name}}-{{item.age}}</li>
	</ul>
</div>
let a = new Vue({
	el: '#block',
	data: {
		search:'',
		list: [{
			id: 0,
			name: "擦1",
			age:20
		}, {
			id: 1,
			name: "擦2",
			age:8
		}, {
			id: 2,
			name: "3",
			age:90
		}, {
			id: 3,
			name: "擦4",
			age:90
		}, {
			id: 4,
			name: "5",
			age:90
		}],
		midList:[]
	},

	watch:{
		search:{
            //这里如果不加immediate的话就一上来不显示
			immediate:true,
			handler(newV,oldV){
				this.midList = this.list.filter((lis)=>{
					return lis.name.indexOf(newV) != -1;
				})
			}
		}
	}
})

computed方法

<div id='block'>
	<input type="text" v-model="search" />
	<ul v-for="(item,index) in midList" :key="item.id">
		<li>{{item.name}}-{{item.age}}</li>
	</ul>
</div>

let a = new Vue({
	el: '#block',
	data: {
		search: '',
		list: [{
			id: 0,
			name: "擦1",
			age: 20
		}, {
			id: 1,
			name: "擦2",
			age: 8
		}, {
			id: 2,
			name: "3",
			age: 90
		}, {
			id: 3,
			name: "擦4",
			age: 90
		}, {
			id: 4,
			name: "5",
			age: 90
		}]
	},
	computed:{
		midList(){
			return this.list.filter((lis)=>{
				return lis.name.indexOf(this.search) != -1
			})
		}
	}
})

对比可以看出computed比较好用点,注意filter需要return返回值

        2.4、列表排序

​
<div id='block'>
	<input type="text" v-model="search" />
	<button type="button" @click="sortNum = 1">正序</button>
	<button type="button" @click="sortNum = 2">反序</button>
	<button type="button" @click="sortNum = 0">原来序</button>
	<ul v-for="(item,index) in midList" :key="item.id">
		<li>{{item.name}}-{{item.age}}</li>
	</ul>
</div>

let a = new Vue({
	el: '#block',
	data: {
		search: '',
		sortNum: 0,
		list: [{
			id: 0,
			name: "擦1",
			age: 20
		}, {
			id: 1,
			name: "擦2",
			age: 8
		}, {
			id: 2,
			name: "3",
			age: 90
		}, {
			id: 3,
			name: "擦4",
			age: 9
		}, {
			id: 4,
			name: "5",
			age: 0
		}]
	},
	computed: {
		midList() {
			let a = this.list.filter((lis) => {
				return lis.name.indexOf(this.search) != -1
			})
			if (this.sortNum) {
				a.sort((a, b) => {
					return this.sortNum === 1 ? a.age - b.age : b.age - a.age;
				})
			}
			return a
		}
	}
})

​

注意这里的sort方法,传入两个参数,一个前一个后,函数写成箭头,还需要return返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值