Vue- 基础学习总结

vue介绍描述
  1. 渐进式 JavaScript 框架
  2. 作用: 动态构建用户界面
vue的特点
  1. 遵循 MVVM 模式
  2. 编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发
  3. 它本身只关注 UI, 可以轻松引入 vue 插件或其它第三库开发项目
与其它前端 JS 框架的关联
  1. 借鉴 angular 的模板和数据绑定技术
  2. 借鉴 react 的组件化和虚拟 DOM 技术
vue相关语法
双大括号表达式
  1. 语法: {{exp}}
  2. 功能: 向页面输出数据
  3. 可以调用对象的方法
指令一: 强制数据绑定
  1. 功能: 指定变化的属性值
  2. 完整写法: v-bind:xxx=‘yyy’
  3. 简洁写法::xxx=‘yyy’
指令二: 绑定事件监听
  1. 功能: 绑定指定事件名的回调函数
  2. 完整写法:
    v-on:keyup=‘xxx’
    v-on:keyup=‘xxx(参数)’
    v-on:keyup.enter=‘xxx’
  3. 简洁写法:
    @keyup=‘xxx’
    @keyup.enter=‘xxx’
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			#div1 {
				width: 100px;
				height: 100px;
				background: #F0F8FF;
			}

			#div2 {
				width: 100px;
				height: 100px;
				background: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function() {

				new Vue({
					el: '#box',
					data: {
						msg: '呀呀嘿',
						url: 'http://hao.195855.com/',
						url1: 'http://www.baidu.com/'
					},
					methods: {
						change(num) {
							if (num == 1) {
								alert("天蓝色")
							} else if (num == 2) {
								alert("红色");
							}
						}
					}
				});

			}
		</script>
	</head>
	<body>
		<div id="box">
			<a v-bind:href="url" target="_blank">进入360浏览器</a>
			<a :href="url1" target="_blank">百度一下,你就知道</a>
			{{msg}}
			<div id="div1" v-on:click="change(1)">

			</div>
			<div id="div2" @click="change(2)">

			</div>
		</div>
	</body>
</html>

计算属性和监视
计算属性
  1. 在 computed 属性对象中定义计算属性的方法
  2. 在页面中使用{{方法名}}来显示计算的结果
监视属性
  1. 通过通过 vm 对象的$watch()或 watch 配置来监视指定的属性
  2. 当属性变化时, 回调函数自动调用, 在函数内部进行计算
计算属性高级
  1. 通过 getter/setter 实现对属性数据的显示和监视
  2. 计算属性存在缓存, 多次读取只执行一次 getter 计算
<html>
   <head>
   	<meta charset="utf-8">
   	<title></title>
   	<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
   	<script type="text/javascript">
   		window.onload=function(){
   			new Vue({
   				el:'#box',
   				data:{
   					xing:'王',
   					ming:'五'
   				},
   				computed:{
   					fullname:{
   						get:function(){
   							return this.xing+' '+this.ming;
   						},
   						set:function  (value) {
   							var a=value.split(" ");
   							this.xing=a[0];
   							this.ming=a[1];
   						}
   					}
   				}
   			})
   			}
   	</script>
   </head>
   <body>
   	<div id="box">
   		姓:<input type="text" id="" value="" v-model="xing"/>
   		名:<input type="text" id="" value="" v-model="ming"/>
   		姓名:<input type="text" id="" value="" v-model="fullname"/>
   	</div>
   </body>
</html>
class 与 style 绑定
class 绑定
  1. :class=‘xxx’
  2. 表达式是字符串: ‘classA’
  3. 表达式是对象: {classA:isA, classB: isB}
  4. 表达式是数组: [‘classA’, ‘classB’]
style 绑定
  1. :style="{ color: activeColor, fontSize: fontSize + ‘px’ }"
  2. 其中 activeColor/fontSize 是 data 属性
<style>
.classA {
color: red;
}
.classB {
background: blue;
}
.classC {
font-size: 20px;
}
</style>
<div id="demo">
<h2>1. class 绑定: :class='xxx'</h2>
<p class="classB" :class="a">表达式是字符串: 'classA'</p>
<p :class="{classA: isA, classB: isB}">表达式是对象: {classA:isA, classB: isB}</p>
<p :class="['classA', 'classC']"> 表达式是数组: ['classA', 'classB']</p>
<h2>2. style 绑定</h2>
<p :style="{color, fontSize}">style="{ color: activeColor, fontSize: fontSize +
'px' }"</p>
<button @click="update">更新</button>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
new Vue({
el : '#demo',
data : {
a: 'classA',
isA: true,
isB: false,
color: 'red',
fontSize: '20px'
},
methods : {
update () {
this.a = 'classC'
this.isA = false
this.isB = true
this.color = 'blue'
this.fontSize = '30px'
}
}
})
</script>	
<div id="demo">
<h2 v-if="ok">表白成功</h2>
<h2 v-else>表白失败</h2>
<h2 v-show="ok">求婚成功</h2>
<h2 v-show="!ok">求婚失败</h2>

<br>
<button @click="ok=!ok">切换</button>
</div>
条件渲染指令
  1. v-if 与 v-else
  2. v-show
比较 v-if 与 v-show
  1. 如果需要频繁切换 v-show 较好
  2. 当条件不成立时, v-if 的所有子节点不会解析(项目中使用)
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#box {
				width: 200px;
				height: 200px;
				background: aliceblue;
			}
		</style>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#div1',
					data: {
						flag: true
					}
				})
			}
		</script>
	</head>
	<body>
		<div id="div1">
			<div id="box" v-show="flag">

			</div>
			<button type="button" @click="flag=!flag">隐藏与显示</button>
		</div>
	</body>
</html>
列表渲染
  1. 列表显示指令
    数组: v-for / index
    对象: v-for / key

  2. 列表的更新显示
    删除 item
    替换 item

  3. 列表的高级处理
    列表过滤
    列表排序

列表显示编码
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: "#box",
					data: {
						name: "",
						age: "",
						jsonArray: []
					},
					methods: {
						addElements() {
							var name = this.name.trim();
							var age = this.age.trim();
							if (!name || !age) {
								return;
							}
							var json = {
								'name': name,
								'age': age
							}
							this.jsonArray.push(json);
							this.name = '';
							this.age = '';
						},
						delElements(index,num){
							// num : 1 删除单个元素  2删除所有元素
							if(num==1){
								this.jsonArray.splice(index,1);
							}else if(num==2){
								
								if(window.confirm("确定删除?")){
									this.jsonArray=[];
								}
								
							}
						},
						changeElements(num,index){
							// num 1 修改名字  2 修改年龄
							if(num==1){
							var new_name=window.prompt("请输入新的称呼:");
							this.jsonArray[index].name=new_name;
							this.jsonArray.push();
							}else if(num==2){
								var new_age=window.prompt("请输入新的年龄:");
								this.jsonArray[index].age=new_age ;
								this.jsonArray.push();
							}
						}
					}
				});
			}
		</script>
	</head>
	<body>
		<center>
			<div id="box">
				<input type="text" name="" id="" value="" placeholder="请输入姓名" v-model="name" />
				<input type="text" name="" id="" value="" placeholder="请输入年龄" v-model="age" />
				<a href="" @click.prevent="addElements()">添加</a>
				<br><br><br>
				<table border="1" cellspacing="0" cellpadding="" width="600px">
					<tr>
						<th>序号</th>
						<th>姓名</th>
						<th>年龄</th>
						<th>操作</th>
					</tr>
					<tr v-for="(obj,index) in jsonArray" :key="index" align="center">
						<td>{{index}}</td>
						<td>{{obj.name}}&nbsp<a href="" @click.prevent="changeElements(1,index)">修改</a></td>
						<td>{{obj.age}}&nbsp<a href="" @click.prevent="changeElements(2,index)">修改</a></td>
						<td><a href="" @click.prevent="delElements(index,1)">删除</a></td>
					</tr>
					<tr v-if="jsonArray.length>0" align="center">
						<td colspan="4"><a href="" @click.prevent="delElements(index,2)">全部删除</a></td>
					</tr>
					<tr v-else align="center">
						<td colspan="4">无数据,无法删除</td>
					</tr>
				</table>
			</div>
		</center>
	</body>
</html>
列表过滤编码
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload=function(){
				new Vue({
					el:"#box",
					data:{
						a:[],
						jsonArr: [{
							'name': 'zhangsan',
							'age': 24,
							'sex': '男'
						}, {
							'name': 'lisi',
							'age': 23,
							'sex': '男'
						}, {
							'name': 'wangwu',
							'age': 22,
							'sex': '男'
						}, {
							'name': 'zhaoliu',
							'age': 28,
							'sex': '男'
						}, {
							'name': 'tianqi',
							'age': 27,
							'sex': '男'
						}],
						flag:true,
						b:""
					},
					computed:{
						newArry:function(){
							var bianzhi=this.b;
							var arr=this.jsonArr.filter(function(ele){
								if(ele.name.indexOf(bianzhi)!=-1){
									return true;
								}else{
									return false;
								}
							})
							return arr;
						}
					},
					methods:{
						sortd(num){
							if(this.flag){
								for (var i = 0; i < this.jsonArr.length; i++) {
									this.a[i]=this.jsonArr[i]
								}
								this.flag=false;
							}
							if(num==1){
								this.jsonArr.sort(function(a,b){
									return -(a.age-b.age);
								})
							}else if(num==2){
								this.jsonArr.sort(function(a,b){
									return a.age-b.age;
								})
							}else if(num==3){
								for (var i = 0; i < this.a.length; i++) {
									this.jsonArr[i]=this.a[i];
									// alert(this.jsonArr[i].name)
								}
								this.jsonArr.reverse().reverse();
							}
						}
					}
				});
			}
		</script>
	</head>
	<body>
		<center>
		<div id="box">
			<input type="text" name="" id="" value="" placeholder="请输入检索号:" v-model="b"/>
			<ul style="list-style: none;">
				<li v-for="(obj,index) in newArry" :key="index">
					{{index}}---{{obj.name}}---{{obj.age}}---{{obj.sex}}
				</li>
			</ul>
			<button type="button" @click="sortd(1)">年龄降序</button>
			<button type="button" @click="sortd(2)">年龄升序</button>
			<button type="button" @click="sortd(3)">默认排序</button>
		</div>
		</center>
	</body>
</html>

事件处理
绑定监听:
  1. v-on:xxx=“fun”
  2. @xxx=“fun”
  3. @xxx=“fun(参数)”
  4. 默认事件形参: event
  5. 隐含属性对象: $event
事件修饰符
  1. .prevent : 阻止事件的默认行为 event.preventDefault()
  2. .stop : 停止事件冒泡 event.stopPropagation()
按键修饰符
  1. .keycode : 操作的是某个 keycode 值的键
  2. .keyName : 操作的某个按键名的键(少部分)
<div id="example">

<h2>1. 绑定监听</h2>
<button v-on:click="test1">Greet</button>
<button @click="test1">Greet2</button>
<button @click="test2($event, 'hello')">Greet3</button>

<h2>2. 事件修饰符</h2>
<!-- 阻止事件默认行为 -->
<a href="http://www.baidu.com" @click.prevent="test3">百度一下</a>
<br/>
<br/>
<!-- 停止事件冒泡 -->
<div style="width: 200px;height: 200px;background: red" @click="test4">
<div style="width: 100px;height: 100px;background: green"
@click.stop="test5"></div>
</div>

<h2>3. 按键修饰符</h2>
<input @keyup.8="test6">
<input @keyup.enter="test6">
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
new Vue({
el: '#example',
data: {
name: 'Vue.js'
},
methods: {
test1 (event) {
// 方法内 `this` 指向 vm
// alert('Hello ' + this.name + '!')
// `event` 是原生 DOM 事件
alert(event.target.innerHTML)
},
test2 (event, msg) {
alert(event.target.innerHTML + '---' + msg)
},

test3() {
alert('阻止事件的默认行为')
},

test4() {
alert('out')
},
test5() {
alert('inner')
},

test6(event) {
alert(event.keyCode + '---' + event.target.value)
}
}
})
</script>
表单输入绑定
使用 v-model 对表单数据自动收集
  1. text/textarea
  2. checkbox
  3. radio
  4. select
<div id="demo">

<form @submit.prevent="handleSubmit">
<span>用户名: </span>
<input type="text" v-model="user.username"><br>

<span>密码: </span>
<input type="password" v-model="user.pwd"><br>

<span>性别: </span>
<input type="radio" id="female" value="female" v-model="user.sex">
<label for="female"></label>
<input type="radio" id="male" value="male" v-model="user.sex">
<label for="male"></label><br>

<span>爱好: </span>
<input type="checkbox" id="basket" value="basketball"
v-model="user.likes">
<label for="basket">篮球</label>
<input type="checkbox" id="foot" value="football"
v-model="user.likes">
<label for="foot">足球</label>
<input type="checkbox" id="pingpang" value="pingpang"
v-model="user.likes">
<label for="pingpang">乒乓</label><br>

<span>城市: </span>
<select v-model="user.cityId">
<option value="">未选择</option>
<option v-for="city in allCitys" :value="city.id">
{{ city.name }}
</option>
</select><br>
<span>介绍: </span>
<textarea v-model="user.desc" rows="10"></textarea><br><br>

<input type="submit" value="注册">
</form>

</div>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#demo',
data: {
user: {
username: '',
pwd: '',
sex: 'female',
likes: [],
cityId: '',
desc: '',
},
allCitys: [{id: 1, name: 'BJ'}, {id: 2, name: 'SZ'},{id: 4, name:
'SH'}],
},
methods: {
handleSubmit (event) {
alert(JSON.stringify(this.user)) 
}
}
})
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值