VUE-2.X学习笔记day4

1.条件渲染

1. 前言

  1. 条件渲染指令
    v-if
    v-else
    v-show
  2. 比较v-if与v-show
    如果频繁切换使用 v-show较好
    v-if:隐藏效果:去掉失效的标签
    v-show隐藏效果:采用样式隐藏失效标签

2.代码

  1. 前端代码
	<div id="app">
			<p v-if="ok">if成功了</p>
			<p v-else>if失败了</p>
			<!--先获取ok的值,在取反返回-->
			<button @click="ok=!ok">if更新</button>
			
			<p v-show="ok2">show成功了</p>
			<p v-show="!ok2">show失败了</p>
			<button @click="ok2=!ok2">show更新</button>
		</div>
  1. js代码
const vm= new Vue({
	el:"#app",
	data:{
		ok:false,
		ok2:false
	}
})
  1. 展示代码
    在这里插入图片描述

2.列表渲染

1. 前言

  1. 列表显示
    数组:v-for/index
    对象:v-for/key
  2. 列表的更新展示
    删除item
    替换:item

2.代码

  1. 页面
<div id="app">
			<h2> v-for 遍历数组</h2>
				<ul>
					<li v-for="(p,index) in persons" v-bind:key="index">	
						{{index+1}}--{{p.name}}---{{p.seq}}
						---<button  @click="deleteP(index)">delete</button>
						---<button  @click="updateP(index,{name:'jQ',seq:11})">update</button>
					</li>
				</ul>
			<h2> v-for 遍历对象</h2>
				<ul>
					<li v-for="(value,key) in persons[1]" v-bind:key="key">
						{{value}}--{{key}}
					</li>
				</ul>
		</div>
  1. JS
new Vue({
	el:"#app",
	data:{
		persons:[//vue本身只监视了persons的改变,但是没有监听数组内部数据的改变
			{'name':'vue','seq':16},
			{'name':'java','seq':15},
			{'name':'php','seq':13},
			{'name':'layUI','seq':12}
		]
	},
	methods:{
		//vue重新了数组中的一系列改变数组内部数据的方法(先调用原生,单更新界面)
		deleteP(index){//vue的数组更新检测
			//删除persons中指定的index
			this.persons.splice(index,1);
		},
		updateP(index,newP){
			//修改persons内部数据,但是没有调用的vue的监听,所以没有发生变化
			// this.persons[index]=newP;
			this.persons.splice(index,1,newP);//先删除index位置的数据,的第1顺位,并新增一个newP
			//同样新增的话,将中间的1变为0
		}
	}
})
  1. 页面展示
    在这里插入图片描述

3.列表的搜索和排序

  1. js
const vm = new Vue({
	el:"#app",
	data:{
		persons:[
			{'name':'java','seq':19},
			{'name':'python','seq':14},
			{'name':'js','seq':15},
			{'name':'golang','seq':10},
			{'name':'php','seq':9},
			{'name':'vue','seq':17},
			{'name':'c','seq':12}
		],
		searchName:'',
		orderType:"by",//by代表原有顺序,asc 代表 正序, desc 代表倒序
	},
	computed:{
		filterPersons(){
			//取出相关的数据
			const{searchName,persons,orderType}=this;
			//最终需要显示的数组
			let fPersons;
			//对persons进行过滤
			//str.indexOf(s) 判断s在str的下标,如果不为-1则代表包含s串
			fPersons =persons.filter(p => p.name.indexOf(searchName)!==-1);
			//排序
			//by代表原有顺序,asc 代表 正序, desc 代表倒序
			if(orderType!=='by'){
				fPersons.sort(function(p1,p2){//如果返回负数p1在前,如果返回正数p2在前
					if(orderType === 'desc'){
						return p2.seq-p1.seq;//倒叙
					}else{
						return p1.seq-p2.seq;//正序
					}
					
				})
			}
			return fPersons;
		}
	},
	methods:{
		seqBy(orderType){
			this.orderType=orderType;
		}
	}
})
  1. html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<input type="text" v-model="searchName"/>
			<ul>
				<li v-for="(p,index) in filterPersons" :key="index">
					{{index+1}}---{{p.name}}---{{p.seq}}
				</li>
			</ul>
			<button type="button" @click="seqBy('asc')">顺序正序</button>
			<button type="button" @click="seqBy('desc')">顺序倒序</button>
			<button type="button" @click="seqBy('by')">原本顺序</button>
		</div>
	</body>
	<script src="../vue/vue.js"></script>
	<script src="day53.js"></script>
</html>

3.页面显示
在这里插入图片描述

4.事件监听

  1. html
<div id="app">
			<h2>动态监听</h2>
			
			<button type="button" @click="test1">动态监听1</button>
			<button type="button" @click="test2('vue')">动态监听2</button>
			<!--$event代表事件对象 不传也是存在的-->
			<button type="button" @click="test3">动态监听3</button>
			<button type="button" @click="test4('aaa',$event)">动态监听4</button>
			
			<h2>事件修饰符</h2>
			<div style="width: 200px;height: 200px;background-color: #FF0000;" @click="test5">
				<!--@click.stop 停止冒泡-->
				<div style="width: 50px;height: 50px;background-color: #0000FF;" @click.stop="test6"></div>
			</div>
			<!--@click.prevent 阻止时间默认行为-->
			<a href="https://www.baidu.com" @click.prevent="test7">跳转到百度</a>
			
			<h2>按键修饰符</h2>
			<!-- keyup 按键弹起来时调用-->
			<input type="text" @keyup="test8"/>
			<!-- keyup.enter enter键 按键弹起来时调用-->
			<input type="text" @keyup.enter="test9"/>
		</div>
  1. js
const vm=new Vue({
	el:"#app",
	data:{
		
	},
	methods:{
		test1(){
			alert("test1");
		},
		test2(msg){
			alert(msg);
		},
		test3(event){
			alert(event.target.innerText);
		},
		test4(str,event){
			alert(str+"<--->"+event.target.innerText);
		},
		test5(){
			alert("out");
		},
		test6(event){
			// event.stopPropagation();
			alert("inner");
		},
		test7(event){
			// event.preventDefault();
			alert("好哒");
		},
		test8(event){
			if(event.keyCode===13){
				alert(event.target.value);
			}
		},
		test9(event){
			alert(event.target.value);
		}
		
		
	}
})
  1. 页面
    在这里插入图片描述

5.表单数据的自动收集

使用v-model(双向数据绑定)自动收集数据
text/textarea (文本编辑框)
checkbox(复选框)
radio(单选框)
select(下拉选择框)

  1. js代码
const vm=new Vue({
	el:"#app",
	data:{
		userName:'',
		pwd:'',
		sex:'boy',
		likes:['java'],
		allcity:[
			{id:1,name:'北京'},
			{id:2,name:'上海'},
			{id:3,name:'广州'},
			{id:4,name:'深圳'}
		],
		cityId:"",
		desc:"",
	},
	methods:{
		handsubmit(){
			console.log('用户名:--->'+this.userName);
			console.log('密码:--->'+this.pwd);
			console.log('性别:--->'+this.sex);
			console.log('爱好:--->'+this.likes);
			console.log('城市ID:--->'+this.cityId);
			console.log('个人介绍:--->'+this.desc);
		}
	}
})
  1. html页面
<div id="app">
			<!--@submit.prevent 阻止表单提交-->
			<form action="/xxx" method="post" @submit.prevent="handsubmit">
				<span>用户名:</span><br />
				<input type="text" v-model="userName" />
				<br />
				
				<span>密码:</span><br />
				<input type="password" v-model="pwd" />
				<br />
				
				<span>性别:</span><br />
				<input type="radio" id="female" value="girl" v-model="sex"/>
				<label for="female"></label>
				<input type="radio" id="male" value="boy" v-model="sex"/>
				<label for="male"></label>
				<br />
				
				<span>爱好:</span><br />
				<input type="checkbox" id="vue" value="vue" v-model="likes"/>
				<label>vue</label><br />
				<input type="checkbox" id="java"  value="java" v-model="likes"/>
				<label>java</label><br />
				<input type="checkbox" id="php" value="php" v-model="likes"/>
				<label>php</label><br />
				
				<span>城市</span><br />
				<select name="城市" v-model="cityId"><br />
					<option value="">未选择</option>
					<option :value="city.id" v-for="(city,index) in allcity" :key="index">
						{{city.name}}
					</option>
				</select>
				<br />
				
				<span>个人介绍</span><br />
				<textarea rows="10" cols="" v-model="desc"></textarea>
				<br />
				
				<input type="submit" name="" value="提交" />
			</form>
		</div>
  1. 前端页面
    在这里插入图片描述

6.生命周期

三个阶段:初始化,更新,死亡
减少更新次数.先把数据在内存中更新,再一次性进行更新要页面

常用方法

  1. 初始化显示
    beforeCreate:创建之前
    created:创建
    beforeMount:初始化之前
    mounted:初始化(加载ajax请求,定时器等)
    2.更新显示
    beforeUpdate:更新之前
    updated:更新
    3.vue实例销毁阶段 $destroy
    beforeDestroy:死亡之前
    destroyed:死亡

代码

  1. js
new Vue({
	el:"#app",
	data:{
		isShow:true
	},
	//创建之前
	beforeCreate(){
		console.log("beforeCreate");
	},
	//创建
	created() {
		console.log("created");
	},
	//初始化之前
	beforeMount() {
		console.log("beforeMount");
	},
	//初始化
	mounted() {//初始化显示之后,立即调用一次
		this.intervalId=setInterval(()=>{//所有回调函数没有自己的this,所以要使用箭头函数来之前外面的this
			this.isShow=!this.isShow;
		},1000)
		console.log("mounted");
	},
	//分界线,以上  初始化阶段
	//更新前
	beforeUpdate(){
		console.log("beforeUpdate");
	},
	//更新
	updated(){
		console.log("updated");
	},
	//分界线,以上  更新阶段
	//死亡之前
	beforeDestroy(){//VM死亡之前会调用一次
		//清除定时器
		clearInterval(this.intervalId);
		console.log("beforeDestroy");
	},
	//死亡
	destroyed(){
		console.log("destroyed");
	},
	methods:{
		dieVm(){//vm死亡  
			this.$destroy()
			//死亡后,会失去数据绑定的权限,会有内存泄露.
			//内存泄露原因是,每次启动程序,都会分配一定的内存
		}
	}
	
	
})
  1. html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<button type="button" @click="dieVm">RainButton</button>
			<p v-show="isShow">Rain</p>
		</div>
	</body>
	<script src="../vue/vue.js"></script>
	<script src="day56.js"></script>
</html>

  1. 前端页面展示
    在这里插入图片描述
  2. console
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值