Vue基础学习1

Vue简介

作者:尤雨溪
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架****。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层**,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动


Vue框架是一款MVVM框架,它是渐进式框架,它是初创公司的首选框架,轻量级的,有很多根据Vue拓展的独立的功能或库。
Github网站

一、Vue基本使用

开发版本下载地址【将代码复制并粘贴入新建js文件】

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>

//检查是否引入Vue
alert(Vue);

语法格式:
插值语法(双大括号):内部是对data数据管理中序的属性进行渲染,可以是简单表达式(判断、三元表达式),不能使用if等条件语句。
moustache(胡子)是双大括号学名,也叫胡子语法。

<div id= "app">
	{{a}}//插值语法
</div>
<script>
var vue = new Vue({
	//挂载点,所有的Vue方法和属性都必须在对应的根标签内部使用
	el:'#app',
	//数据管理中心,所有Vue数据都必须在data对象中
	data:{
		a:100
	}
	//方法,对应Vue事件方法清单
	methods:{

	}
})
</script>

所有Vue清单内容都是规定的,不能随意创建、改变。

二、Vue指令

vue指令通过带有v-的特殊属性实现dom的响应式加载。

1.v-if、v-else-if

通过一个布尔表达式实现dom的上树和下树的渲染。

<div id= "app">
	<p v-if="boo">我是第一行dom</p>//将不会出现在页面
	<p v-if="!boo">我是第二行dom</p>
</div>

工作中不是直接使用布尔值进行渲染,而是
1.用data带有布尔值进行渲染
2.逻辑表达式判断(对值隐式转换)。

<script>
var vue = new Vue({
	el:'#app',
	data:{
		boo:false
		//boo:0
	}
	methods:{

	}
})
</script>

实时渲染

<div id= "app">
	//当boo的值等于100的时候再显示
	<p v-if="boo==100">我是第一行dom</p>
	<button @click="add">按我加1</button>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		boo:95
	}
	methods:{
		add(){
			this.boo++
		}
	}
})
</script>

v-else-if使用

<div id= "app">
	<h2>{{boo}}</h2>
	<p v-if="boo>=0 && boo<=5">我是5</p>
	<p v-else-if="boo>=6 && boo<=10">我是10</p>
	<p v-else-if="boo>=11 && boo<=15">我是15</p>
	<p v-else-if="boo>=16 && boo<=20">我是20</p>
	<p v-else-if="boo>20">我是大于20</p>//带有v-if和v-else-if的标签之间不能有任何标签,必须连续
	<button @click="add">按我加1</button>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		boo:95
	}
	methods:{
		add(){
			this.boo++
		}
	}
})
</script>

2.v-show

v-show与v-if显示情况类似,v-show是通过控制元素的display属性,对元素的显示和隐藏进行逻辑判断,并没有元素的下树。

<div id= "app">
	<p v-show="boo>=5">我是5</p>
	<button @click="add">按我加1</button>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		boo:0
	}
	methods:{

	}
})
</script>

v-show与v-if使用场景区别是如果页面切换的特别频繁,使用v-show;如果页面设计范围特别大,逻辑复杂,切换的不是特别频繁,使用v-if(涉及到页面加载性能)

3.v-for

v-for是Vue的循环指令,作用是遍历数组(对象)的每一个值。

<div id= "app">
	<ul>
		<li v-for="item in arr">
			{{item}}
		</li>
	</ul>
</div>

item是arr数组的每一项枚举值

<!--v-for遍历数组综合使用-->
<div id= "app">
	<ul>
		<li v-for="(item,index) in arr" :key="index">
			{{index}}-{{item}}
		</li>
	</ul>
</div>

item是被遍历的数组(对象)的每一个值,item的命名不是规定的,可以自定义命名。
index指的是每一项被遍历的值的下表索引值。
key是用来给每一项值加元素标量,作用是为了区分元素,为了实现最小量的更新。

<script>
var vue = new Vue({
	el:'#app',
	data:{
		arr:[
			'苹果',
			'橘子',
			'香蕉',
			'草莓',
		]
	}
})
</script>

v-for遍历对象

<div id= "app">
	<ul>
		<li v-for="(item,index) in obj">
			{{index}}:{{item}}
		</li>
	</ul>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		obj:{
			name:'小弥',
			age:'17',
			height:'175',
			sex:'man',
			hobby:'play basketball'
		}
	}
})
</script>

此时index代表的是对象的key,如name、age等。
应该用如下方式表示:

<div id= "app">
	<ul>
		<li v-for="(item,key,index) in obj">
			{{index}}—{{key}}:{{item}}
		</li>
	</ul>
</div>

此时item表示对象的内容,key表示对象的key键值名称,index表示当前obj的下标索引。

实际工作中用v-for遍历JSON

<style>
	table,td-th{
		border:1px solid #111;
		/*表格合并*/
		border-collapse:collapse;
	}
</style>
<!--v-for遍历数组综合使用-->
<div id= "app">
	<table>
		<tr>
			<th>姓名</th>
			<th>年龄</th>
			<th>性别</th>
			<th>身高</th>
		</tr>
		<tr v-for="(item,index) in arr"></tr>
		<!-- JSON中的信息-->
		<td>{{iten.name}}</td>
		<td>{{iten.age}}</td>
		<td>{{iten.sex}}</td>
		<td>{{iten.height}}</td>
	</table>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		arr:[
			{name:'mike',age:'18',sex:'man',height:'178'}
			{name:'rose',age:'17',sex:'female',height:'163'}
			{name:'july',age:'17',sex:'female',height:'169'}
			{name:'wiwian',age:'18',sex:'female',height:'168'}
		]
	}
})
</script>

v-for的嵌套

<!--v-for遍历数组综合使用-->
<div id= "app">
	<table>
		<tr v-for="i in num" :key='i'>
			<td v-for="j in i" ;key='j'>{{i}}x{{j}}={{i*j}}</td>
		</tr>
	</table>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		num:[1,2,3,4,5,6,7,8,9]
	}
})
</script>

4.v-text、v-html

v-text、v-html都是渲染文本的指令,使用场景会不同
三种渲染方法:
1.双大括号插值{{}}
双大括号和v-text渲染内容类似,都是以文本类型进行翻译,方法如下
区别:
1)双大括号在渲染结果之前,隐约会有编译之前的文本显示,而v-text没有这种现象
2)双大括号更加灵活,标签中间可以添加内容,v-text只能渲染data中的内容,中间不允许插入内容
2.v-text

<!--v-for遍历数组综合使用-->
<div id= "app">
	<table>
		<p>{{a}}</p>
		<p v-text="a"></p>
		<p v-html="a"></p>
	</table>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		a:"<h1>我是要插值的内容</h1>"
	}
})
</script>

5.v-html

v-html能识别模板(即使用h1标签),而v-text不能使用h1,只能字面显示,示例如上。
使用和v-text类似,中间不允许插入内容

6.v-cloak

v-cloak作用是示例渲染后关联结束
双大括号插值语法在遇到网络延迟的的时候会显示编译之前的文本

<style>
	[v-cloak]{/*选择有v-cloak的属性的标签,解决网络延迟下的情况*/
		display:none;
	}
</style>
<div id= "app" v-cloak>
	{{a}}
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		arr:[
			a:"我是渲染的指令v-cloak"
		]
	}
})
</script>

7.v-once

只渲染对应元素一次,数据更新不会引起视图的更新,目的是为了优化页面性能。

<!--v-for遍历数组综合使用-->
<div id= "app">
	<h2 v-once>{{a}}</h2>
	<button @click="add">按我加一</button>
	<button @click="minus">按我减一</button>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		a:100
	},
	methods:{
		add(){
			this.a ++
			console.log(a)
		},
		minus(){
			this.a --
			console.log(a)
		}
	}
})
</script>

点击按钮视图显示不会改变,但底层数据是在改变的。
一般没有动态内容时使用,如文章等。

8.v-pre

跳过该元素的编译过程,直接显示元素内部的文本,特点是跳过大量没有指令的节点。

<!--v-for遍历数组综合使用-->
<div id= "app">
	<h2 v-pre>{{a}}</h2>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		a:100
	},
})
</script>

直接显示{{a}},不会编译,优化页面的加载性能。

9.v-on

给元素添加事件监听,可以简写为@。
JS的元素的事件监听都可以在Vue中使用。

原生Javascript事件监听

事件名称方法
点击onclick
双击ondblclick
鼠标移上onmouseenter
鼠标离开onmouseleave
鼠标滑过onmousemove
鼠标移除onmouseout
失去焦点onblur
聚焦onfocus
键盘事件onkeydown

在Vue中使用事件监听一律去除on,然后添加v-on,或者用@,单击示例如下

<div id= "app">
	<h2>{{a}}</h2>
	<button @click="add">点击加1</button>
	<button v-on:click="minus">点击减1</button>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		a:100
	},
	methods:{
		add(){
			this.a++
		}minus(){
			this.a--
		}
	}
})
</script>

注意:
1.所有方法都必须写在methods中!
2.同名的方法会发生覆盖,后写的方法会覆盖先写的同名方法。
3.方法是可以传参的

<div id= "app">
	<h2>{{a}}</h2>
	<button @click="add(5)">点击加1</button>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		a:100
	},
	methods:{
		add(num){
			this.a+=num
		}
	}
})
</script>

4.不给事件传参,事件是有自己的参数,默认输入会有该方法的事件参数。

<button @click="add">点击加1</button>
//方法名称
add(event){
			console.log(event)
		}

10.v-bind

将普通的w3c属性变为动态属性,让属性具有动态能力。
v-bind:可简写为一个冒号:

<img v-bind:src="'inages/'+url+'.jpg'" alt="">
<!--等同于如下代码-->
<img :src="'inages/'+url+'.jpg'" alt="">

五张轮播图案例

<div id= "app">
	<img v-bind:src="'inages/'+url+'.jpg'" alt="">
	<button @click="add">点击加1</button>
	<button @click="minus">点击减1</button>
</div>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		url:0
	},
	methods:{
		add(event){
			if(this.url>5){
				this.url = 0;
			}
			this.url++
		},
		minus(){
			if(this.url<=0){
				this.url = 5;
			}
			this.url--
		}
	}
})
</script>

10.1 绑定类名

绑定会默认在Model中查找,直接使用会差找不到
将绑定的类放在数组中,且类名用引号包裹。
可以用三木运算符判断,从而实现样式的改变

<div :class="['color','size']">qqq</div>
<!--三目运算符判断-->
<div :class="['color',flag ? 'size1' : 'size2']">qqq</div>
<!--用对象判断-->
<div :class="['color',{'size1' : false}]">qqq</div>
<!--在Model中直接展示要不要绑定,从服务端动态获取类名,便于修改-->
<div :class="obj">qqq</div>
<script>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		obj:{
			"size":true,
			"color":false
		}
	},
	methods:{}
})
</script>

10.1 绑定样式

使用动态属性实现class类名的动态效果
动态的class必须使用大括号{ }包裹,值可以有多个,值得参数是布尔值

p{
	width:100px;
	height:100px;
	background:red;
}
.blue{
	background:blue;
}
.pink{
	background:pink;
}
<div id= "app">
	<p :class="{red:a >=5,pink:a>=10}">{{a}}</p>
</div>
<button @click="add">点击加1</button>
<button @click="minus">点击减1</button>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		a:0
	},
	methods:{
		add(event){
			this.a++
		},
		minus(){
			this.a--
		}
	}
})
</script>

除了class属性可以实现动态外,style属性也可以实现对应功能
style和class属性有特殊性,使用动态传参必须传入一个object对象。

<p :style="{width:b+'px'}">{{a}}</p>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		b:100
	},
	methods:{
		add(event){
			this.b++
		},
		minus(){
			this.b--
		}
	}
})
</script>

11.v-model

对表单和数据的双向绑定。Vue是MMVVM框架,vue的核心之一就是双向数据绑定。
调查表单

<h2>问卷调查</h2>
<p>姓名:<input type="text" v-model="val"></p>
<p>性别:
	<input type="radio" name='' v-model="sex"><input type="radio" name='' v-model="sex"></p>
<p>
	爱好:
	<input type="checkbox" name='hobby' value="打篮球" v-model="hobby">打篮球
	<input type="checkbox" name='hobby' value="跳舞" v-model="hobby">跳舞
	<input type="checkbox" name='hobby' value="看书" v-model="hobby">看书
</p>
<p>
	籍贯:
	<select name="native" id="" v-model="native">
		<option value="河北">河北</option>
		<option value="北京">北京</option>
		<option value="湖南">湖南</option>
		<option value="四川">四川</option>
		<option value="广东">广东</option>
	</select>
</p>
<p>
您填写的表单内容为:姓名:{{name}}姓别:{{sex}},爱好:{{hobby}},籍贯:{{native}}
</p>
<button @click="submit">提交</button>
<script>
var vue = new Vue({
	el:'#app',
	data:{
		name:'',
		sex;'男',
		hobby:[],
		native:'河北'
	},
	methods:{
		//汇总提交表单
		submmit(){
			let obj = {
				name: this.name,
				sex:this.sex,
				hobby:this.hobby,
				native: this.native
			}
			console.log(obj)
		}
	}
})
</script>

vue自定义指令

<div id= "app">
	<p v-color>我是段落</p>
</div>
<script>
	//directive方法接收两个参数
	//第一个参数:指令名称
	//第二个参数:对象
	//注意:在指定指令名称的时候,不需要写v-,直接写名称
	//注意点:指令可以在不同生命周期阶段执行
	//bind :指令被绑定到元素上的时候执行
	//inserted :绑定指令的元素被添加到父元素的时候调用
	Vue.directive("color",{
		bind: (el)=>{
			el.style.color = "red";
		} 
	}); 
</script>

vue自定义指令参数

<div id= "app">
	<p v-color ="'blue'">我是段落</p>
	<p v-color ="curColor">我是段落</p>
</div>
<script>
	Vue.directive("color",{
		bind: (el,obj)=>{
			el.style.color = obj.value;
		} 
	}); 
	var vue = new Vue({
	el:'#app',
	data:{
		curColor:"green"
	},
	methods:{}
})
</script>

vue自定义局部指令

<div id= "app">
	<p v-color ="curColor">我是段落</p>
</div>
<script>
	var vue = new Vue({
	el:'#app',
	data:{
		curColor:"green"
	},
	methods:{},
	//定义局部指令
	directives:{
		"color":{
			bind: (el,obj)=>{
			el.style.color = obj.value;
			} 
		}
	}
	
})
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值