欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Vue的基本认识

程序员文章站 2022-04-12 10:32:24
...

Vue官网

1)英文官网: https://vuejs.org/
2)中文官网: https://cn.vuejs.org/

Vue的介绍及描述

1)渐进式 JavaScript 框架
2)作者: 尤雨溪(一位华裔前 Google 工程师)
3)作用: 动态构建用户界面

Vue的特点

1)遵循 MVVM 模式
2)编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发
3)它本身只关注 UI, 可以轻松引入 vue 插件或其它第三库开发项目

与其它前端 JS 框架的关联

1)借鉴 angular 的模板和数据绑定技术
2)借鉴 react 的组件化和虚拟 DOM 技术

Vue的入门案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<!-- <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script> -->
		<script type="text/javascript">
			window.onload=function(){
				//创建vue对象
				new Vue({
					el:'#box',       //Vue元素,用的是ID属性绑定
					data:{
						msg:'Hello Vue'      //Vue数据
					}
				});
			}
			
		</script>
	</head>
	<body>
		<div id="box">    
			<h1>{{msg}}</h1>  //msg是Vue中的数据   获取Vue的数据时,需用两个花括号包住({{ }})
		</div>
	</body>
</html>

Vue属性绑定

<!DOCTYPE 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:{
						msg:100,
						mydata:true,
						imgurl:'https://cn.vuejs.org/images/dcloud.gif',
						wz:'http://www.sina.com'
					}
				});
				
			}
		</script>
	</head>
	<body>
		<!-- 指令: v-bind 属性绑定 -->
		<div id="box">
		<img src="https://cn.vuejs.org/images/dcloud.gif"/>
		<img v-bind:src="imgurl"/>
		<a href="http://www.baidu.com">进入百度</a>
		<a v-bind:href="wz">进入新浪</a>
		<!-- 简写 -->
		<a :href="wz">进入新浪</a>
		</div>
	</body>
</html>

Vue事件绑定

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#nei{
				width: 200px;
				height: 200px;
				background: red;
			}
		</style>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload=function(){
				new Vue({
					el:'#box',
					data:{
						msg:'Hello Vue'
					},
					//事件的处理函数
					methods:{  
						show:function(num){
							alert(this.msg+"---"+num);
						},
						show2(event){
							//阻止默认行为
							//event.preventDefault() 
							//或 
							//阻止冒泡
							//event.stopPropagation()
							
						},
						show4(event){
							//阻止默认行为
							//event.preventDefault() 
							//或 
							//阻止冒泡
							//event.stopPropagation()
							alert(this.msg);
						},
						show5(){
							alert(this.msg);
						},
						test(){
							alert("abc");
						},
						test2(){
							alert("wai")
						},
						test3(){
							alert("btn")
						}
						
						
					}
				})
			}
		</script>
	</head>
	<body>
		<div id="box">
			<!-- 采用 指令 v-on:事件名 -->
			<button v-on:click="show()">一个按钮</button>
			<!-- 绑定事件的简写方式 采用 @事件名-->
			<button @click="show(100)">一个按钮</button>
			
			<!-- 如何传递事件对象 $event -->
			<button @click="show2($event)">一个按钮2</button>
			
			<!-- vue阻止默认行为 @click.prevent -->
			<a href="http://www.baidu.com" @click.prevent="test()">进入百度</a>
			<!--vue 阻止冒泡行为 @click.stop -->
			<div id="nei" @click.stop="test2()">
				<button type="button" @click.stop="test3()">按钮</button>
			</div>
			<!-- 事件只执行一次 @click.once -->
			<button @click.once="show4(100)">一个按钮</button>
			<!-- 

			 为了在必要的情况下支持旧浏览器,Vue 提供了绝大多数常用的按键码的别名:
			 
			 .enter
			 .tab
			 .delete (捕获“删除”和“退格”键)
			 .esc
			 .space
			 .up
			 .down
			 .left
			 .right
			 .ctrl
			 .alt
			 .shift
			 .meta
			 -->
			 <!-- 键盘事件 -->
			<input type="text" id="" value="" @keypress.enter="show5()"/>
			
		</div>
	</body>
</html>

Vue模板语法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#nei{
				width: 200px;
				height: 200px;
				background: red;
			}
		</style>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload=function(){
				new Vue({
					el:'#box',
					data:{
						msg:'Hello Vue',
						num:100,
						mymsg:'<b>加粗文字</b>'
					}
				});
			}
		</script>
	</head>
	<body>
		<div id="box">
			<!-- 模板语法 可以在页面取data 对象中数据 -->
			<h1>{{msg}}<h1>
			<!-- 模板语法 会支持一些 JS 简单的运算符和函数 -->
			<h1>{{msg.length}}<h1>
			<h1>{{msg.toUpperCase()}}<h1>
			<h1>{{num*2}}<h1>
			<h1>{{num==100?'abc':'ccc'}}<h1>
			<!--v-text 取数据  -->
			<h1 v-text="msg"></h1>
			{{mymsg}}
			<span v-text="mymsg"></span>
			<!-- v-html 可以转意 html 标签 -->
			<span v-html="mymsg"></span>
		</div>
	</body>
</html>

Vue数据绑定

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#nei {
				width: 200px;
				height: 200px;
				background: red;
			}
		</style>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						msg: 'Hello Vue',
					}
				});
			}
		</script>
	</head>
	<body>
		<div id="box">
			<!--  v-model 表单的数据绑定-->
			<input type="text" id="" value="" v-model="msg" />
			<h1>{{msg}}</h1>
			<input type="text" id="" value="" v-model="msg" />
		</div>
	</body>
</html>

Vue隐藏和显示

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#nei {
				width: 200px;
				height: 200px;
				background: red;
			}
		</style>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						msg: 'Hello Vue',
						flag:true
					},
					methods:{
						isShow(){
							//this 代表vue对象
						 this.flag=!this.flag	
						}
					}
				});
			}
		</script>
	</head>
	<body>
		<div id="box">
			<!--  v-show="true" true 元素显示 false 元素隐藏-->
			<div id="nei" v-show="flag">
				
			</div>
			<button type="button" @click="isShow()">显示/隐藏</button>
			
				<button type="button" @click="flag=!flag">显示/隐藏2</button>
		</div>
	</body>
</html>

Vue计算属性

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#nei {
				width: 200px;
				height: 200px;
				background: red;
			}
		</style>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						msg: 'Hello Vue',
						xing:'王',
						name:'老虎',
					},
					computed:{ //计算属性
					 fullname:{
						 get:function () {
							 console.log("get"); 
						 	return this.xing+" "+this.name;
						 },
						 //监听fullname 属性的变化
						 set:function(value){
							 //value 就是fullname 属性的值
							console.log("set fullname 变化了"+value); 
							var text=value.split(' ');
							this.xing=text[0];
							this.name=text[1];
							 
						 }
					 }
					}
				});
			}
		</script>
	</head>
	<body>
		<div id="box">
			姓:<input type="text" id="" value="" placeholder="请输入你的姓" v-model="xing"/><br>
			名:<input type="text" id="" value="" placeholder="请输入你的名" v-model="name"/><br>
			全名:<input type="text" id="" value="" placeholder="你的全名"/ v-model="fullname"><br>
			<!-- 全名:<input type="text" id="" value="" placeholder="你的全名"/ v-model="xing.concat(name)"><br> -->
		</div>
	</body>
</html>

Vue Class属性的绑定

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			.aClass {
				color: red;
				font-size: 100px;
			}

			.bClass {
				font-size: 200px;
				color: blue;
			}
		</style>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						msg: 'abc',
						url: 'http://www.baidu.com',
						myClass: 'bClass',
						myClass2: 'aClass',
						isA: true,
						isB: false,
						myjson: {
							'aClass': true,
							'bClass': false,
						}
					},
					methods: {
						change() {
							this.isA = !this.isA;
							this.isB = !this.isB;
						}
					}

				});

			}
		</script>
	</head>
	<body>
		<div id="box">
			<a v-bind:href="url">百度</a>
			<!--  -->
			<h1 class="aClass">11111111111111111</h1>
			<!-- vue 绑定这个class 属性 -->
			<!-- 方式1:绑定一个class选择器的名称,注意 选择器的名称用单引号引起来 -->
			<h1 :class="'bClass'">222222222222</h1>
			<!--  -->
			<!-- 绑定多个选择器的名称 -->
			<h1 :class="['bClass','aClass']">222222222222</h1>
			<!-- 绑定的值是一个变量 -->
			<h1 :class="myClass">3333333333333333333</h1>

			<!-- 多个数据,可以使用[] 括起来 -->
			<h1 :class="[myClass,myClass2]">444444</h1>

			<!-- 选择器要不要生效 true 生效,false 不生效 -->
			<h1 :class="{'aClass':true,'bClass':false}">5555555555555555555</h1>

			<h1 :class="{'aClass':isA,'bClass':isB}">5555555555555555555</h1>

			<button type="button" @click="change()">切换</button>
			<h1 :class="myjson">5555555555555555555</h1>
		</div>
	</body>
</html>

Vue Style属性的绑定

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			div:{
				font-style: italic;
			}
		</style>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						a: 'yellow',
						b: '100px',
						flag: true,
						myjson: {
							color:'red',
							fontSize:'200px'
						},
						myjson2: {
							fontStyle:'italic'
						}
					},
					methods: {
						change(f) {
							if (f) {
								this.a = 'blue'
								this.b = '50px'
							} else {
								this.a = 'pink'
								this.b = '150px'
							}

						}
					}

				});

			}
		</script>
	</head>
	<body>
		<div id="box">
			<h1 style="color:red;font-size: 100px;">11111111111111111111</h1>
			<!-- vue 绑定style属性 值 要一个json对象
			
			值要使用 单引号 引起来
			css样式名 如果有 "-"  连接 把"-"去掉,"-"后面的第一个字母变大写
		
			-->
			<h1 :style="{color:'red',fontSize:'100px'}">2222222</h1>

			<!-- 值 作为变量 -->
			<h1 :style="{color:a,fontSize:b}">2222222</h1>

			<button type="button" @click="change(flag=!flag)">按钮</button>


			<h1 :style="myjson">2222222</h1>
			
			<h1 :style="[myjson,myjson2]">2222222</h1>
		</div>
	</body>
</html>

Vue if条件指令

<!DOCTYPE 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: {
						score: 0
					}
				});
			}
		</script>
	</head>
	<body>
		<div id="box">
			<input type="text" name="" id="" value="" placeholder="请输入你的成绩0---100" v-model="score" />
			<h1 v-if="score>=0&&score<60">
				不及格
			</h1>
			<h1 v-else-if="score>=60&&score<80">
				及格
			</h1>
			<h1 v-else-if="score>=80&&score<90">
				优秀
			</h1>
			<h1 v-else-if="score>=90&&score<100">
				非常优秀
			</h1>
			<h1 v-else-if="score==100">
				满分
			</h1>
			<h1 v-else>
				成绩乱输
			</h1>
		</div>
	</body>
</html>

Vue for循环指令

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			div: {
				font-style: italic;
			}
		</style>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						myArr: [10, 20, 30, 40, 50, 60, 70, 80, 80],
						myJson: {
							username: 'zhangsan',
							age: 100,
							phone: '13962052305'
						},
						jsonArry: [{
							username: 'lisi',
							age: 200,
							phone: '13962052305'
						}, {
							username: 'wangwu',
							age: 300,
							phone: '13962052305'
						}, {
							username: '赵六',
							age: 400,
							phone: '13962052305'
						}]
					}
				});

			}
		</script>
	</head>
	<body>
		<div id="box">
			<!-- {{myArr[0]}} -->
			<ul>
				<!-- 为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性: -->
				<li v-for="(ele,index) in myArr" :key="index">
					{{ele}}----{{index}}
				</li>
			</ul>
			<!-- 遍历JSON对象 -->
			<ul>
				<li v-for="(value,key,index)  in myJson" :key="key">
					{{value}}-----{{key}}----{{index}}
				</li>
			</ul>
			<!-- 遍历 JSON数组 -->
			<ul>
				<li v-for="(obj,index) in jsonArry" :key="index">
					{{obj.username}}----{{obj.age}}----{{obj.phone}}----{{index}}
				</li>
			</ul>
		</div>
	</body>
</html>

for循环指令案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
		</style>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						name: '',
						age: '',
						jsonArray: []
					},
					methods: {
						addObj() {
							//alert("添加");
							//把输入框中的数据拿出来 ,封装成JSON对象,把这个对象再添加到数组中
							var name = this.name.trim();
							var age = this.age.trim();
							//对表单做非空校验 //自动类型转换  
							if (!name || !age) {
								alert("用户名或年龄不能为空")
								return;
							}

							var json = {
								'name': name,
								'age': age
							};
							//添加到数组里面去
							// unshift()
							// push()
							this.jsonArray.push(json);

							//加完数据后,清空输入框中的就内容
							this.name = '';
							this.age = '';
						},
						//全部删除
						delAll() {
							if (window.confirm("要删除全部数据吗?")) {
								this.jsonArray = [];
							}
						}

					}
				});

			}
		</script>

		<!-- 	<script type="text/javascript">
					var name=window.prompt("请输入新的名字");
					document.write(name);
				</script> -->

	</head>
	<body>
		<div id="box">
			<center>
				<h1>添加数据</h1>
				<input type="text" id="" value="" placeholder="请输入姓名" v-model="name" />
				<input type="text" id="" value="" placeholder="请输入年龄" v-model="age" />
				<button type="button" @click="addObj()">添加</button>
				<br>
				<br>
				<br>
				<br>
				<br>
				<table border="1" cellspacing="0" cellpadding="" width="500px">
					<caption>
						<h3>用户信息</h3>
					</caption>
					<tr>
						<th>序号</th>
						<th>姓名</th>
						<th>年龄</th>
						<th>操作</th>
					</tr>

					<tr v-for="(obj,index) in jsonArray" align="center">
						<td>
							{{index}}
						</td>
						<td>
							{{obj.name}} <a href="#" @click..prevent="updateName()">修改</a>
						</td>
						<td>
							{{obj.age}} <a href="#" @click..prevent="updateAge()">修改</a>
						</td>
						<td>
							<button type="button" @mousedown.left="delObj()">删除</button>
						</td>
					</tr>
					<tr>
						<td colspan="4" align="center"><button type="button" @click="delAll()">全部删除</button></td>
					</tr>
				</table>
			</center>

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

原生的Ajax请求

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//创建异步请求对象
			var xmlhttp;
			if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
				xmlhttp = new XMLHttpRequest();
			}

			// 向服务器发送请求
			// 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:
			//打开连接 GET
			xmlhttp.open("GET", "https://api.github.com/search/users?q=a", true);
			//发送请求
			xmlhttp.send();

			//准备好介绍,服务器的相应
			xmlhttp.onreadystatechange = function() {
				if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
					//接收服务器响应的文本数据
					 var text=xmlhttp.responseText;
					document.getElementById("myDiv").innerHTML =text;
					//alert(text);
				}
			}
		</script>
	</head>
	<body>
		
		<div id="myDiv">
			
		</div>
	</body>
</html>

Vue的Ajax请求

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/vue-resource.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload = function() {
				new Vue({
					el: '#box',
					data: {
						myarr: []
					},
					methods: {
						get: function() {
							//发送get请求
							this.$http.get('https://api.github.com/search/users', {
								params: {
									q: 'aa'
								}
							}).then(function(res) {
								//document.write(JSON.stringify(res.body));
								this.myarr = res.body.items;
							}, function() {
								console.log('请求失败处理');
							});
						}
					}
				});
			}
		</script>
	</head>
	<body>
		<div id="box">
			<button type="button" @click="get()">请求后台</button>
			<ul>
				<li v-for="(obj,index) in myarr" :key="index">
					{{index}}----{{obj.login}}----{{obj.id}}---{{obj.url}}
				</li>
			</ul>
		</div>
	</body>
</html>

表单数据收集

<!DOCTYPE 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:{
						username:'',
						password:'',
						sex:'0' ,//给value 的值表示默认中
						hobby:['run','sing'], //复选框是个数组
						xueli:'3',
						miaoshu:'个人描述'
						
					},
					methods:{
						tijao(){
							//alert("表单提交")
							//收集表单中的数据
						console.log(this.username);
						console.log(this.password);
						console.log(this.sex);
						console.log(this.hobby);
						console.log(this.xueli);
						console.log(this.miaoshu);
						//Ajax 请求 把表单中的数据提交到后台
							
							
						}
						
					}
					
				});
			}
		</script>
	</head>
	<body>
		<div id="box" align="center">
			<!-- 我采用 Ajax 的方式把数据提交到后台,我就得阻止掉表单默认的提交行为 -->
			<form action="123.html" method="get"  @submit.prevent="tijao()">
				用户名:<input type="text" name="username" v-model="username"/><br>
				密码:<input type="password" name="password" v-model="password"/><br>
				性别:<input type="radio" name="sex" value="1" v-model="sex"/> 男 
				<input type="radio" name="sex" value="0" v-model="sex"/> 女
				<br>
				爱好:<input type="checkbox"  name="hobby" value="run" v-model="hobby"/> 跑步
				<input type="checkbox"  name="hobby" value="game" v-model="hobby"/> 玩游戏
				<input type="checkbox"  name="hobby" value="sing" v-model="hobby"/> 唱歌
				<br>
				学历:
				<select name="xl" v-model="xueli">
					<option value="1">小学</option>
					<option value="2">中学</option>
					<option value="3">大学</option>
				</select>
				<br>
				<textarea rows="10" cols="15" v-model="miaoshu">
					
				</textarea>
				<br>
				<input type="submit" value="提交"/>
			</form>
		</div>
	</body>
</html>

表单数据收集到JSON对象中

<!DOCTYPE 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:{
						myJson:{
							username:'',
							password:''
						}	
					},
					methods:{
						tijao(){
							//alert("呵呵呵呵")
							alert(this.myJson.username);
							alert(this.myJson.password);
							//收集表单中的数据
					
						//Ajax 请求 把表单中的数据提交到后台
						}
						
					}
					
				});
			}
		</script>
	</head>
	<body>
		<div id="box" align="center">
			<!-- 我采用 Ajax 的方式把数据提交到后台,我就得阻止掉表单默认的提交行为 -->
			<form action="123.html" method="get"  @submit.prevent="tijao()">
				用户名:<input type="text" name="username" v-model="myJson.username"/><br>
				密码:<input type="password" name="password" v-model="myJson.password"/><br>
				<input type="submit" value="提交"/>
			</form>
		</div>
	</body>
</html>