Vue基础知识

Vue基础知识

基础概念

在 HTML 中导入学习环境的在线 Vue 支持

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

在 Vue.js 2.x版本中

  • el 为挂载点,指定修饰对象,#对应的是id选择器,注意不能挂载到body标签
  • data 是数据,仅在挂载点内部有效,可以写复杂类型,遵守js规则,替换差值表达式{{}}中的变量
  • methods 与 data 同级,一般用来表示函数

v-text会解析文本,渲染标签,替换标签内的所有值

差值表达式{{ }}支持字符串拼接

v-html可以解析 html 元素,如果无html元素则与v-text效果一致

<!DOCTYPE html>
<html>
<head>
	<title>Vue基础</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		{{ message }}
		<h2>{{ school.name }} {{ school.mobile }}</h2>
		<!-- 数组下标从0开始 -->
		<h3>{{ campus[0] }}</h3>

		<h2 v-text="message+'!'">深圳</h2>
		<h2 v-text="info"></h2>
		<!-- 差值表达式{{}}支持字符串拼接 -->
		<h2>深圳{{ message + "!"}}</h2>
		
		<p v-html="content1"></p>
		<p v-html="content2"></p>
	</div>
	<script>
		var app = new Vue({
			el:'#app',	//el挂载点,指定修饰对象,#对应的是id选择器,注意不能挂载到body标签
			data:{		//数据,仅在挂载点内部有效,可以写复杂类型,遵守js规则
				message:'Hello,Vue!',	//替换差值表达式{{}}中的变量
				school:{
					name:'哈哈哈',
					mobile:100000
				},
				campus:['beijing','shanghai','guangzhou','shenzhen'],
				info:'front',
				content1:'baidu',
				content2:"<a href='http://www.baidu.com'>百度</a>"
			}
		})
	</script>
</body>
</html>

v-on为元素绑定事件,与 java 不同的是不需要写on(比如 onclick 可以直接写 click),绑定的方法定义在methods中

可以用@代替v-on,实现简写,click表示鼠标点击事件,dblclick是双击事件

通过 this 可以拿到 data 中的数据

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue基础</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		<!-- v-on为元素绑定事件,绑定的方法定义在methods中 -->
		<input type="button" value="v-on指令" v-on:click="doIT">
		<input type="button" value="v-on简写" @click="doIT">
		<input type="button" value="双击事件" @dblclick="doIT">
		<!-- 用@代替v-on,实现简写,click表示鼠标点击事件,dblclick是双击事件 -->
		<h2 @click="changeFood">{{ food }}</h2>
	</div>
	<script>
		var app = new Vue({
			//vue中不再考虑更改DOM元素,重点放在更改数据就可以了
			el:'#app',
			data:{
				food:'西兰花炒蛋'
			},
			methods:{
				doIT:function () {
					alert("做饭");
				},
				changeFood:function(){	//可以通过this拿到数据
					this.food+='好吃!';
				}
			}
		})
	</script>
</body>
</html>

v-show根据表达式的真假,切换元素的隐藏和显示,原理是修改元素的 display 来实现,可以在调试器中看到 style=“display:none”;

v-if 也是根据表达式真假,切换元素的隐藏和显示,具体是操纵DOM元素,将元素加入/移出 DOM 树

v-show 和 v-if 中都可以进行表达式的判断

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		<input type="button" value="切换" @click="changeIsShow">
		<p v-if="isShow">加入和移出DOM</p>
		<p v-show="isShow">显示和隐藏</p>
		<p v-if="age>=18">条件判断</p>
	</div>
	<script>
		var app = new Vue({
			el:'#app',
			data:{
				isShow:true,
				age:19
			},
			methods:{
				changeIsShow:function(){
					this.isShow = !this.isShow;
				}
			}
		})
	</script>
</body>
</html>

v-bind 设置元素的属性,比如 src,title,class。**语法:v-bind:属性名=表达式 **

v-bind 也可以缩写,只使用冒号 : 来代替,例如 v-bind:src="···":src="···" 效果相同

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<style>
		.active{
			border: 5px solid red;
		}
	</style>
</head>
<body>
	<div id="app">
		<!-- 全写与简写 -->
		<!-- 鼠标停留在第二张图片上可以看到title,点击最后一张图片可以看到样式变化 -->
		<img v-bind:src="imgSrc" alt="">
		<img :src="imgSrc" alt="" :title="imgTitle+'!!!'">
		<img :src="imgSrc" alt="" :class="{active:isActive}" @click="Active">
	</div>
	<script>
		var app = new Vue({
			el:'#app',
			data:{
				imgSrc:'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/\
						u=2783013482,133979246&fm=26&gp=0.jpg',
				imgTitle:'Test',
				isActive:false
			},
			methods:{
				Active:function(){
					this.isActive = !this.isActive;
				}
			}
		})
	</script>
</body>
</html>

v-for 根据数据生成列表结构,经常与数组结合使用,数组长度的更新会同步到页面上,是响应式的。

v-for="(item,index) in arr",item表示数组的元素,其名字可以更改,只有与之后的使用名称相对应即可,index是索引,从0开始,与item同理使用。in是关键字不能变,arr是数组名

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		<input type="button" value="添加数据" @click="add">
		<input type="button" value="移除数据" @click="remove">

		<!-- 获取普通数组 -->
		<ul>
			<li v-for="(item,index) in arr">
				{{index+1}}address:{{item}}
			</li>
		</ul>
		<!-- 获取对象数组 -->
		<h2 v-for="item in vegetable" :title="item.name">
			{{item.name}}
		</h2>
	</div>
	<script>
		var app = new Vue({
			el:'#app',
			data:{
				arr:["beijing","shanghai","guangzhou","shenzhen"],
				vegetable:[
					{name:"xilanhua"},
					{name:"xilan"}
				]
			},
			methods:{
				add:function(){
					this.vegetable.push({name:"huacai"});
				},
				remove:function(){
					this.vegetable.shift();	//每次移除最左边的元素
				}
			}
		})
	</script>
</body>
</html>

v-on 也可以传递函数自定义参数,事件修饰符。官方文档:https://cn.vuejs.org/v2/api/#v-on

事件的后面跟上.修饰符 可以对事件进行限制,.enter 可以限制触发的按键为回车

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		<input type="text" @keyup.enter="sayHi">
		<!-- 回车作为事件修饰符,只有当按下回车被释放的时候才会触发 -->
		<input type="button" value="点击" @click="doIt('老铁',666)">
		{{p1+p2}}

	</div>
	<script>
		var app = new Vue({
			el:'#app',
			data:{
				p1:"",
				p2:""
			},
			methods:{
				doIt:function(p1,p2){	//用形参接受传递的参数
					this.p1 = p1;
					this.p2 = p2;
				},
				sayHi:function(){
					alert("吃了吗");
				}
			}
		})
	</script>
</body>
</html>

v-model 用于获取和设置标签元素的值,是双向的数据绑定,无论修改谁,另外一个都会同步更新

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		<input type="button" value="改变message" @click="setM">
		<input type="text" v-model="message" @keyup.enter="getM">
		<!-- message的值会同步更新 -->
		<h2>{{message}}</h2>

	</div>
	<script>
		var app = new Vue({
			el:'#app',
			data:{
				message:"xiao"
			},
			methods:{
				getM:function(){
					alert(this.message);
				},
				setM:function(){
					this.message="库顶";
				}
			}
		})
	</script>
</body>
</html>

本地应用

  1. 简单计数器
<!-- 简单计数器 -->
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<!-- 实现一个简单的计数器,从0到10 -->
	<div id="app">
        <h2>简单计数器</h2>
		<button @click="sub">-</button>
		<span>{{ num }}</span>
		<button @click="add">+</button>
	</div>
	<script>
		var app = new Vue({
			el:'#app',
			data:{
				num:1
			},
			methods:{
				sub:function(){
					if(this.num>0){
						this.num--;
					}else{
						alert("已经最小了");
					}
				},
				add:function(){
					if(this.num<10){
						this.num++;
					}else{
						alert("已经最大了");
					}
				}
			}
		})
	</script>
</body>
</html>

a0

  1. 简单记事本
<!-- 简单记事本 -->
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<style>
		.btn{
			width: 30px;
			height: 20px;
		}
	</style>
</head>
<body>
	<div id="app">
		<h1>简单记事本</h1>
		<!-- .enter事件修饰符,按下回车添加数据。autofocus 属性规定当页面加载时 input 元素应该自动获得焦点 -->
		<input v-model="inputValue" @keyup.enter="add" autofocus="autofocus" placeholder="请输出任务">
		<!-- 列表区域 -->
		<section>
			<ul>
				<li v-for="(item,index) in list">
					<!-- 序号、内容、删除按钮 -->
					<span>{{ index+1 }}</span>
					<label>{{ item }}</label>
					<button class="btn" @click="remove(index)"></button>
				</li>
			</ul>
		</section>
		<!-- 统计区域,无数据时进行隐藏 -->
		<footer v-show="list.length!=0">
			<span><strong>{{list.length}}</strong>  item </span>
			<button class="btn" @click="clear"></button>
		</footer>
	</div>

	<script>
		var app = new Vue({
			el:'#app',
			data:{
				list:["写代码","吃饭","睡觉"],
				inputValue:""
			},
			methods:{
				add:function(){	//添加功能
					this.list.push(this.inputValue);
				},
				remove:function(index){
					this.list.splice(index,1);	//删除以该序号开始的元素,一共删除一个
				},
				clear:function(){	//清空数组
					this.list=[]
				}
			}
		})
	</script>
</body>
</html>

a1

网络应用

使用官方推荐的网络请求库 axios,导入地址是 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

常用请求:

  • axios.get(地址?key1=value1&key2=value2).then(function(response){},function(err){})
  • axios.post(地址,参数对象).then(function(response){},function(err){})

axios中的 this 与 Vue中的 this 不是同一个this,axios中的this获取不到 Vue中 data的数据,一个较好的方法是把 Vue中的 this定义为 that,再传递给 axios使用。

如果服务器返回的数据比较复杂,获取的时候要注意层级结构

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>axios基本使用</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

</head>
<body>
	<div id="app">
		<input type="button" value="get获取笑话" @click="getJoke">
		<p>{{joke}}</p>
        <br/>
        <input type="text" v-model="user" placeholder="输入用户名">
        <input type="button" value="post创建用户" @click="PostUser">
		<p>{{info}}</p>
	</div>

	<script>
		/*
			接口:随机笑话
			地址:https://autumnfish.cn/api/joke/list
			方式:get
			参数:num=n(笑话条数)
			响应内容:随机笑话

			接口2:用户注册
			地址:https://autumnfish.cn/api/user/reg
			方式:post
			参数:username:xxxx(用户名)
			响应内容:注册成功或失败
		*/
		var app = new Vue({
			el:'#app',
			data:{
				joke:"很好笑的笑话",
				info:"CreateUser",
				user:""
			},
			methods:{

				getJoke:function(){
					var that = this;	
					//axios内部的this与Vue中的this不一样,必须定义that才能取到数据
					axios.get("https://autumnfish.cn/api/joke/list?num=1").then
					(function(response){
						that.joke=response.data.jokes[0];
					},function(err){
						console.log(err);
					})
				},
				PostUser:function(){
					var that = this;
					axios.post("https://autumnfish.cn/api/user/reg",{username:that.user})
					.then(function(response){
						that.info = response.data;
					},function(err){
						console.log(err);
					})
				}
			}
		})
	</script>
</body>
</html>

a2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值