一.安装准备

vue安装

1.安装node.js

https://nodejs.org/en/download/

2.全局安装vue-cli3.0脚手架

若安装了旧版本 (1.x或2.x),先卸载

1
npm uninstall vue-cli -g

安装

1
sudo npm install -g @vue/cli

然后vue -V出现版本号则成功

构建项目,选择default则是默认配置

1
vue create vue-admin

或者直接引入

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

编辑器安装

使用VSCode + Live Server插件

第一个Vue程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Vue基础</title>
</head>
<body>
<div id="app">
{{message}}
</div>
<!--导入Vue开发版本-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
message:"hola 你好!"
}
})
</script>
</body>
</html>

二.Vue基础

el-挂载点

Q: Vue实例作用范围?

A: 在el命中的元素及内部的后代元素

Q: 是否可以使用其他选择器?

A: 支持,参照js的选择器,建议使用id选择器

Q: 是否可以设置其他dom元素?

A: 除了html和body都可以

data数据对象

Vue中用到的数据定义在data中

data可以写复杂类型数据

渲染复杂类型数据时,遵守js语法

1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
var app = new Vue({
el:"#app",
data:{
message:"你好,515code",
school:{
name:"李华",
mobile:"13800138000"
},
campus:["北京","上海","广州","深圳"]
}
})
</script>

Vue本地应用

Vue指令

指的是v-开头的一组特殊语法

1.内容绑定,事件绑定

1.1 v-text:设置标签的文本值

1
2
3
4
5
6
<div id="app">
<!--v-text的使用,里面所有内容都会被替换-->
<h2 v-text="message"></h2>
<!--插值表达式-->
<h2>{{message}}</h2>
</div>

同时,可以采用字符串的拼接,例如:

1
2
3
4
5
6
<div id="app">
<!--v-text的使用-->
<h2 v-text="message+'!'"></h2>
<!--插值表达式-->
<h2>{{message+"!"}}</h2>
</div>

1.2 v-html:设置标签的文本值

参考上面v-text,只不过html结构的内容会被解析

1.3 v-on:为元素绑定事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div id="app3">
<!--单击事件-->
<input type="button" value="事件绑定" v-on:click="doIt">
<!--鼠标移动到区域内事件-->
<input type="button" value="事件绑定" v-on:mouseenter="doIt">
<!--双击事件-->
<input type="button" value="事件绑定" v-on:click="doIt">
</div>
<script>
var app3 = new Vue({
el:"#app3",
methods:{
doIt:function(){
alert("事件触发!");
}
}
})
</script>

可以看到,使用v-on:事件名="方法名"即可绑定事件,方法定义在methods属性中

技巧:可以使用@替代v-on,效果完全一样

在Vue中,如果要更新dom元素内的数据,无需获取dom元素去修改,在方法内部使用this关键字即可,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id="app3">
<h2 @click="changeFood">{{foods}}</h2>
</div>
<script>
var app3 = new Vue({
el:"#app3",
data:{
foods:"鸡扒饭"
},
methods:{
changeFood:function(){
//将 鸡扒饭 改为 鸡扒饭好好吃,直接用this获取当前data属性即可
this.foods+="好好吃!";
}
}
})
</script>

学到这里,可以手写一个计数器试试~ 要求:上限10,下限0,点击+号数值加1,点击减号数值减1

v-on补充

传递参数与按键事件绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  <div id="app">
<!--传递参数至方法中-->
<input type="button" value="点击" @click="doIt(666,'老铁')">
<!--输入回车触发事件-->
<input type="text" @keyup.enter="sayHi">
</div>
<script>
var app = new Vue({
el:"#app",
methods:{
doIt:function(p1,p2){
console.log("做IT");
console.log(p1);//666
console.log(p2);//老铁
},
sayHi:function(){
alert("吃了没");
}
}
})

</script>

2.显示切换,属性绑定

根据表达值真假,切换元素的显示与隐藏

2.1 v-show:切换元素的显示与隐藏

v-show中的值为true或false,例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id="app5">
<input type="button" value="切换显示状态" @click="changeIsShow">
<img src="https://cdn.jsdelivr.net/gh/BA-NANA/banana.github.io@1.0/assets/img/tjut.jpg" v-show="isShow">
</div>
<script>
var app5 = new Vue({
el:"#app5",
data:{
isShow:true
},
methods:{
changeIsShow:function(){
this.isShow=!this.isShow;
}
}
})
</script>

如上所示,修改isShow的真值就能轻松控制图片是否显示,同时v-show支持表达式写法

2.2 v-if:切换dom元素的显示与隐藏

用法与v-show类似,例子:

1
2
3
<p v-if="isShow">
这是一个p标签
</p>

那么v-if和v-show有啥区别?

v-if是通过控制dom节点的存在与否来控制元素的显隐;v-show是通过设置DOM元素的display样式

所以,频繁切换的元素建议用v-show,否则用v-if(性能略差)

2.3 v-bind:设置元素属性

v-bind:属性名=表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div id="app7">
<img v-bind:src="imgSrc">
<img v-bind:title="imgTitle+'!'">5.
<img v-bind:class="{active:isActive}">
</div>
<script>
var app7=new Vue({
el:"#app7",
data:{
imgSrc:"图片地址",
imgTitle:"515code",
isActive:false
}
})
</script>

技巧:v-bind可以省略,即 :src=“…”

下面实现一个图片切换的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div id="app">
<img :src="imgArr[index]">
<a href="#" @click="prev" v-show="index!=0">上一张</a>
<a href="#" @click="next" v-show="index<imgArr.length-1">下一张</a>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
imgArr:["链接1","链接2","链接3"],
index:0, //索引值默认为0
},
methods:{
prev:function(){
this.index--;
},
next:function(){
this.index++;
}
}
})
</script>

3.列表循环,表单元素绑定

3.1 v-for:根据数据生成列表结构

可以遍历数据生成列表结构,语法为**(item, index) in 数据**,例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<div id="app">
<input type="button" value="添加数据" @click="add">
<input type="button" value="添加数据" @click="remove">
<ul>
<li v-for="item in arr">
{{item}}
</li>
<hr>
<li v-for="(item,index) in arr">
{{index+1}}.{{item}}
</li>
<h2 v-for="item in objArr" v-bind:title="item.name">
{{item.name}}
</h2>
</ul>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
arr:["北京","上海","广州","深圳"],
objArr:[
{name:"jack"},
{name:"rose"}
]
},
methods:{
add:function(){
//添加一个对象元素
this.objArr.push({name:"zach"})
},
remove:function(){
//移除最左端元素
this.objArr.shift();
}
}
})

</script>

3.2 v-model:获取和设置表单元素的值(双向数据绑定)

使用v-model可以设置表单的值,绑定的数据会和表单元素值相关联

1
2
3
4
5
6
7
8
9
10
11
12
  <div id="app">
<input type="text" v-model="message">
<h2>{{message}}</h2>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:"程序员"
}
})
</script>

Vue网络应用

axios网络请求库

1
2
3
4
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

axios.get(地址?key=value&key2=value2).then(function(response){},function(err){})
axios.post(地址?key=value&key2=value2).then(function(response){},function(err){})

注意:axios回调函数中的this已经改变,无法获取Vue的data中数据,需要先在回调函数外部将this保存起来,例如:

1
var that = this;

然后在回调函数使用that