5.vue基础(四)条件渲染-列表渲染

1.条件渲染、

1.1 v-if

利用v-if隐藏元素,是直接被移除,完全没有了,所以设用于切换频率较低的场景,而v-show只是将元素加了display: none;所以设用于切换频率较高的场景。

        <h2 v-if="true">欢迎来到{{name}}</h2>			 
        <h2 v-if="false">欢迎来到{{name}}</h2> 
        <h2 v-if="1 === 1">欢迎来到{{name}}</h2> 

v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”,打断的意思是中间有其他内容

		<div v-if="n === 1">Angular</div>
		<div v-else-if="n === 2">React</div>
		<div v-else-if="n === 3">Vue</div>
		<div>你好</div>//打断了
		<div v-else>哈哈</div>

v-if与template可以配合使用,而不可以与v-show,这样v-show就不会起作用

		<template v-if="n === 1">
			<h2>你好</h2>
			<h2>尚硅谷</h2>
			<h2>北京</h2>
		</template>

1.2 v-show

		<h2 v-show="false">欢迎来到{{name}}</h2> -->
		<h2 v-show="1 === 1">欢迎来到{{name}}</h2>

2.列表渲染

2.1 遍历数组

image-20220420190825478

			<ul>
				<li v-for="(p,index) of persons" :key="index">
					{{p.name}}-{{p.age}}
				</li>
			</ul>
注意:p是值,也就是value,然后index是索引,默认从0开始
注意::key="index"一定要带(也可以不带),带了是好习惯,不带的话,它默认key的值是index
persons:[
    {id:'001',name:'秦燕燕',age:18},
    {id:'002',name:'秦小燕',age:19},
    {id:'003',name:'秦燕妮',age:20}
]

2.2 遍历对象

image-20220420191658360

		<ul>
			<li v-for="(k,value) of car" :key="k">
				{{k}}-{{value}}
			</li>
		</ul>
注意:k为属性,value为属性值
				car: {
					name: '奥迪A8',
					price: '70万',
					color: '黑色'
				}

2.3 key的原理

补充一下:

2.3.1 向列表添加内容(push(),unshift())

1.push()方法(在数组结尾处)向数组添加一个新的元素:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.push("Kiwi");   

image-20220420192141688

2.unshift() 方法(在开头)向数组添加新元素

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.unshift("Lemon");

image-20220420192317015

2.3.2 从列表删除内容(pop(),shift())

pop() 方法从数组中删除最后一个元素

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.pop(); 

image-20220420192706823

shift() 方法会删除首个数组元素

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.shift();

image-20220420192833702

2.3.3 添加对象案例

image-20220420193207238

在这里插入图片描述

这样的话,存在一个问题,值与输入框不对应了,出现这个问题的原因就是:key=“index”,将其改成:key="p.id"即可,原因是,请看原理图

image-20220421154813778

image-20220421155032975

			<button @click.once="add">添加一个老刘</button>
			<ul>
				<li v-for="(p,index) of persons" :key="p.id">
					{{p.name}}-{{p.age}}
					<input type="text">
				</li>
			</ul>
			new Vue({
				el:'#root',
				data:{
					persons:[
						{id:'001',name:'张三',age:18},
						{id:'002',name:'李四',age:19},
						{id:'003',name:'王五',age:20}
					]
				},
				methods: {
					add(){
						const p = {id:'004',name:'老刘',age:40}
						this.persons.unshift(p)
					}
				},
			})

2.4 列表过滤

补充一下:

2.4.1 筛选数组元素(filter().indexOf())

(查看列表有没有符合条件的元素)

filter() 方法创建一个包含通过测试的数组元素的新数组

var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);

function myFunction(value) {
  return value > 18;//返回的是符合条件的值
}
或者
var over18 = numbers.filter(
function(value) {
  return value > 18;
})
或者
var over18 = numbers.filter(
(value) =>{
  return value > 18;
})
输出:4525

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,如果要检索的字符串值没有出现,则该方法返回 -1。

var str="Hello world!"
document.write(str.indexOf("Hello") + "<br />")//输出0
document.write(str.indexOf("World") + "<br />")//输出-1
document.write(str.indexOf("world"))//输出6
document.write(str.indexOf(""))//输出0
注意:任何字符串中都含空字符串

2.4.2 姓名筛选案例

image-20220421155506102

image-20220421155525822

<h2>人员列表</h2>
//v-model数据双向绑定,用于获取输入的名字
<input type="text" placeholder="请输入名字" v-model="keyWord">
<ul>
    <li v-for="(p,index) of filPerons" :key="index">
        {{p.name}}-{{p.age}}-{{p.sex}}
    </li>
</ul>
		new Vue({
			el:'#root',
			data:{
				keyWord:'',
				persons: [
					{ id: '001', name: '秦燕燕', age: 19, sex: '女' },
					{ id: '002', name: '秦小燕', age: 20, sex: '女' },
					{ id: '003', name: '睡不醒的小小秦', age: 21, sex: '男' },
					{ id: '004', name: '必须午睡的学薇', age: 22, sex: '男' }
				],
				filPerons:[]
			},
            //用watch属性实现
			watch:{
				keyWord:{
                    //必须需要这个,如果没有这个的话,一开始页面没有任何数据
                    //这样的话,页面刚开始的时候,handler()就会执行一次,只不过newvalue是一个空字符串,indexOf()会认为任何字符串中都含空字符串,所以都符合条件,就都会显示出来
					immediate:true,
					handler(val){
						this.filPerons = this.persons.filter((p)=>{
							return p.name.indexOf(val) !== -1
						})
					}
				}
			}
            //用计算属性实现
            //filPersons()什么时候被调用,当有人读取filPersons时,filPersons就会被调用,且返回值就作为filPersons的值
            computed: {
				filPerons() {
					return this.persons.filter((p) => {//返回符合条件的列表
						return p.name.indexOf(this.keyWord) !== -1//返回符合条件的对象
					})
				}
			}
		}) 

2.5 列表排序

补充一下:

2.5.1 列表排序的函数(sort())

默认地,sort() 函数按照字符串顺序对值进行排序。

该函数很适合字符串(“Apple” 会排在 “Banana” 之前)。

不过,如果数字按照字符串来排序,则 “25” 大于 “100”,因为 “2” 大于 “1”。

正因如此,sort() 方法在对数值排序时会产生不正确的结果。

我们通过一个比值函数来修正此问题:

//升序
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b}); 

//降序
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a}); 

2.5.2 根据年龄排序

		<button @click="sortType = 2">年龄升序</button>
		<button @click="sortType = 1">年龄降序</button>
		<button @click="sortType = 0">原顺序</button>
		data: {
				keyWord: '',
				sortType: 0, //0原顺序 1降序 2升序
				persons: [
					{ id: '001', name: '马冬梅', age: 30, sex: '女' },
					{ id: '002', name: '周冬雨', age: 31, sex: '女' },
					{ id: '003', name: '周杰伦', age: 18, sex: '男' },
					{ id: '004', name: '温兆伦', age: 19, sex: '男' }
				]
			},
			computed: {
                //当filPersons()里面的属性(sortType)发生变化s
				filPerons() {
					const arr = this.persons.filter((p) => {
						return p.name.indexOf(this.keyWord) !== -1
					})
					//判断一下是否需要排序
					if (this.sortType) {//如果是true,也就是1或2
						arr.sort((p1, p2) => {
							return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age
						})
					}
					return arr
				}
			}

2.6 vue数据监测

2.6.1 添加属性

image-20220422152706105

image-20220422152838705

			<button @click="addSex">添加一个性别属性,默认值是男</button>

			student:{
				name:'tom',
				age:{
					rAge:40,
					sAge:29,
				},
                        
			methods: {
				addSex(){
					// Vue.set(this.student,'sex','男')
					this.$set(this.student,'sex','男')
				}
			}

对象添加(修改)属性

image-20220422153510394

image-20220422153741783

image-20220422153526180

					friends:[
						{name:'jerry',age:35},
						{name:'tony',age:36}
					]

					addFriend(){
						this.student.friends.unshift({name:'jack',age:70})
					},
                      updateFirstFriendName(){
						this.student.friends[0].name = '张三'
                          //this.student.friends.splice(0,1,{name:'张三',age:35})
					},

列表添加(修改)属性

image-20220422154007520

image-20220422154018712

image-20220422154028771

hobby:['抽烟','喝酒','烫头']

addHobby(){
    this.student.hobby.push('学习')
},
    
updateHobby(){
     // this.student.hobby.splice(0,1,'开车')
     // Vue.set(this.student.hobby,0,'开车')
    this.$set(this.student.hobby,0,'开车')
},
    
removeSmoke(){
    this.student.hobby = this.student.hobby.filter((h)=>{
         return h !== '抽烟'
    })
}

2.6.2 总结一下vue数据监测

在Vue修改数组中的某个元素一定要用如下方法:

​ 1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()

​ 2.Vue.set() 或 vm.$set()

特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值