一、Vue基础
1、第一个Vue程序
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>indexVue</title>
</head>
<body>
<div id="app">
{{message}}
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue-->
<!--开始使用vue框架-->
<script>
//注意下面这个Vue的V要大写,小写不行
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
</body>
</html>
效果:
注意的点:
- el表达式的作用范围:
- 可以在el命中范围的内部,内部任意一层,但是外面不行,比如:
{{message}}//这里不行
<div id="app">
{{message}}//可以
<span>{{message}}</span>//可以
<p>
<div>{{message}}</div>//可以
</p>
</div>
- 只能支持双标签,不支持持单标签,因为单标签内部不能写东西。
- Vue不能挂载到
<body> <html>这种标签上。推荐挂载的标签为<div>,因为这个标签没有样式,p等其他标签有自己的样式 - 选择器的使用建议使用id选择器
小结:
- 导入开发版本的Vue.js
- 创建Vue实例对象,设置el属性和data属性
- el属性这里就类似于选择器。id、class、标签选择器都可以。
- 使用简洁的模板语法把数据渲染到页面上,这里就是那个大括号
2、data数据对象
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>data数据对象</title>
</head>
<!--入门案例-->
<body>
<div id="app">
{{ message }}
<h2>{{ school.name }} {{ school.address }}</h2>
<ul>
<li>{{ school.major[0] }}</li>
<li>{{ school.major[1] }}</li>
</ul>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue-->
<!--开始使用vue框架-->
<script>
//注意下面这个Vue的V要大写,小写不行
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
school: {
name:"南阳理工学院",
address:"南阳市宛城区",
major:["js","cs","bs"]
}
}
})
</script>
</body>
</html>
小结:
- Vue中用到的数据定义在data中
- data中可以写复杂类型的数据
- 渲染复杂类型数据时,遵守js的语法即可
二、Vue本地应用
1. Vue指令
-
内容绑定
v-text、v-html(基础)、v-on -
事件绑定
v-show、v-if、v-bind
-
列表循环,表单元素绑定
v-for、 v-on(补充)、 v- model
1.v-text
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-text指令</title>
</head>
<body>
<div id="app">
<!-- 可以写表达式比如下面的 + ,进行拼接-->
<!-- 这种是默认写法进行全部替换-->
<h2 v-text="message + 'a'">哈哈</h2>
<!-- 这种是插值表达式写法进行部分替换-->
<h3>{{ message + 'a' }} 哈哈</h3>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue-->
<!--开始使用vue框架-->
<script>
var app = new Vue({
el: '#app',
data: {
message:"庆哥是个谨慎的人"
}
})
</script>
</body>
</html>
效果:
小结:
- v-text指令的作用是设置标签的内容
- 默认写法会替换全部内容,使用插值表达式写法{{}}可以替换指定内容。
- 内部支持写表达式
2.v-html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-html</title>
</head>
<body>
<div id="app">
<!--v-text and v-html :如果只是普通文本那么二者没有区别。
但是v-html的中是可以进行html元素的编码的.
-->
<h2 v-text="message"></h2>
<h2 v-text="url"></h2>
<h2 v-html="message"></h2>
<h2 v-html="url"></h2>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue-->
<!--开始使用vue框架-->
<script>
var app = new Vue({
el: '#app',
data: {
message:"庆哥是个谨慎的人",
url:"<a href = 'www.baidu.com'>百度<a/>"
}
})
</script>
</body>
</html>
小结:
- v-html指令的作用是:设置元素的innerHTML
- 内容中有html结构会被解析为标签
- v-text指令无论内容是什么,只会解析为文本
- 解析文本使用v-text,需要解析HTML结构使用v-html
3.v-on(基础)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>v-on</title>
</head>
<body>
<div id="app">
<input type="button" value="v-on指令" v-on:click="study">
<input type="button" value="用@" @click="study"><!--@和v-on:是一样的-->
<h1 @click="changeFood"> {{ food }}</h1>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue-->
<!--开始使用vue框架-->
<script>
var app = new Vue({
el: '#app',
data:{
food:"老坛酸菜牛肉面",
},
//data要放在methods上面
methods: {
//这个名字不要起do,应该是个关键字,这里study换成do上面input标签会有问题
study: function (){
alert("干啥啥不行,扯淡第一名!")
},
changeFood: function () {
console.log(this.food)//在浏览器控制台打印
this.food += ",酸菜使用脚做的!"
}
}
})
</script>
</body>
</html>
小结:
- v-on指令的作用是:为元素绑定事件
- 事件名不需要写on
- 指令可以简写为@,@不用带:
- 绑定的方法定义在methods属性中
- 方法内部通过this关键字可以访问定义在data中的数据
4.计数器案例
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>计算器小案例</title>
</head>
<body>
<div id="app">
<button @click="sub">
-
</button>
<span>{{ num }}</span>
<button @click="add">
+
</button>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!--引入vue-->
<script>
var app = new Vue({
el: "#app",
data: {
num: 0
},
methods: {
add: function () {
// alert("aaaa")
if (this.num < 10) {
this.num += 1;
} else {
alert("最大了,不能再点了!")
}
},
sub: function () {
if (this.num > 0) {
this.num -= 1;
} else {
alert("最小了,不能再点了!")
}
}
}
})
</script>
</body>
</html>
逻辑写在Vue中。
小结:
- 创建Vue示例时:el(挂载点),data(数据),methods(方法,别少了最后的s)
- v-on指令的作用是绑定事件,简写为@
- 方法中通过this关键字获取data中的数据
- v-text指令的作用是:设置元素的文本值,简写为{{}}
- v-html指令的作用是:设置元素的innerHTML
5.v-show
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-show</title>
</head>
<body>
<div id="app">
<img src="images.jpg" v-show="isShow">
<br>
<input type="button" value="显示图片" v-on:click="display">
<input type="button" value="隐藏图片" @click="hiding">
<h1 v-show="false">aaaa</h1>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
isShow: true,
},
methods: {
display: function () {
this.isShow = true
},
hiding: function () {
this.isShow = false
}
}
})
</script>
</body>
</html>
小结:
- v-show指令的作用是:根据真假切换元素的显示状态
- 原理是修改元素的display,实现显示隐藏
- 指令后面的内容,最终都会解析为布尔值
- 值为true元素显示,值为false元素隐藏
- 数据改变之后对应的显示状态会同步更新
6.v-if
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-if</title>
</head>
<body>
<div id="vue">
<p v-if="isShow">vue</p>
<p v-show="isShow">vue v-show</p>
<input type="button" value="转化显示状态" @click="display">
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var vue = new Vue({
el: '#vue',
data:{
isShow:true
},
methods:{
display:function () {
this.isShow = !this.isShow
}
}
});
</script>
</body>
</html>
小结:
- v-if的作用的根据表达式的真假切换元素的显示状态,这一点和v-show很像
- 本质是通过操纵dom元素来切换显示状态
- 表达式的值为true,元素存在dom树种,为false,从dom书中移除
- 频繁的切换v-show,反之使用v-if,前者的切换消耗小
7.v-bind
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-bind</title>
<style>
.active{
border: 2px solid blue;
}
</style>
</head>
<body>
<div id="app">
<img v-bind:src="imgSrc" alt="">
<br>
<img :src="imgSrc" alt="" :title="imgTitle + 'eee'"
:class="{active:isActive}" @click="toggleActive"><!--v-bind的简写-->
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var vue = new Vue({
el: '#app',
data:{
imgSrc:"images.jpg",
imgTitle:"hello world!",
isActive:false
},
methods:{
toggleActive:function () {
this.isActive = !this.isActive
}
}
});
</script>
</body>
</html>
小结:
- v-bind指令的作用是:为元素绑定属性
- 完整的写法:
v-bind:属性名。简写:属性省略了v-bind - 需要动态的增删class建议使用对象的方式
8.v-on
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-on补充</title>
</head>
<body>
<div id="app">
<input type="button" value="点击" @click="doIt(666,888)">
<!-- 下面这一句,当按下enter键时会触发v-on绑定的sayHi函数 -->
<input type="text" @keyup.enter="sayHi">
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var vue = new Vue({
el: '#app',
methods:{
doIt:function(p1,p2){
console.log("做it");
console.log(p1);
console.log(p2);
},
sayHi:function(){
alert("吃了没!")
}
}
});
</script>
</body>
</html>
9.v-for
小结:
- v-for指令的作用是:根据数据生成列表结构
- 数组经常和v-for结合使用
- 语法是(item,index) in items (items是一个数组,item是每次遍历出来的一个数据,index是索引)
- item 和 index 可以结合其他指令一起使用
10.v-model
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-model</title>
</head>
<body>
<div id="app">
<p>为什么说v-model是双向绑定呢?因为改变输入框里的message,Vue对象中的message也会改变</p>
<input type="text" v-model="message" v-on:keyup.enter="getM">
<h2>这里是Vue对象中的message实时显示:{{message}}</h2>
<p>改变Vue对象中的message输入框里的message也会改变</p>
<input type="button" value="修改Vue里面的message" v-on:click="">
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var vue = new Vue({
el: '#app',
data: {
message: "123456789"
},
methods: {
getM: function () {
alert(this.message)
},
setMessage:function(){
this.message = "新的值"
}
}
});
</script>
</body>
</html>
小结:
- v-model指令的作用是便捷的设置和获取表单元素的值
- 绑定的数据会和表单元素值相关联,也就是双向绑定
三、网络请求
axios基本使用
认识axios:
axios和ajax的区别:
- axios是一个基于Promise的HTTP库,而ajax是对原生XHR (xmlHttpRequest)的封装;
- ajax技术实现了局部数据的刷新,而axios实现了对ajax的封装。
使用:
使用时加上
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
比较简单,使用之间看下面和Vue连用的例子。
axios 加 vue的小案例
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>v-model</title>
</head>
<body>
<div id="app">
<input type="button" value="获取笑话" @click="getJoke">
<p>{{joke}}</p>
</div>
<!-- 官网提供的axios的在线地址 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
/**
* 接口:随机获取一条笑话
* 请求地址:https://autumnfish.cn/api/joke
* 请求方法: get
* 请求参数: 无
* 响应内容:随机笑话
*/
var vue = new Vue({
el: '#app',
data: {
joke: "很好笑的笑话"
},
methods: {
getJoke:function(){
console.log(this.joke)
var this_ = this
axios.get("https://autumnfish.cn/api/joke")
.then(
function(response){
console.log(response.data)
// console.log(this.joke),这个this会变,
//第二次用this就获取不到joke的信息了,这里要用一个新的变量存储这个this
//之后才能在此获取到joke
this_.joke=response.data
//console.log(this_.joke)//这样就可以
},
function(err){
}
}
}
});
</script>
</body>
</html>