Vue.JS基础的详讲( MVVN )
一 vue.js的M-V-VM思想
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式。
1. Model指代的就是vue对象的data属性里面的数据。这里的数据要显示到页面中。
2. View指代的就是vue中数据要显示的HTML页面,在vue中,也称之为“视图模板” 。
3. ViewModel指代的是vue.js中我们编写代码时的vm对象了,它是vue.js的核心,
> 负责连接 View 和 Model,保证视图和数据的一致性,所以前面代码中,data里面的数据被显示中p标签中就是vm对象自动完成的。
二.大致的用法
1 |
|
如果要输出data里面的数据作为普通标签的内容,需要使用
{{ }}
使用v-model把data里面的数据显示到表单元素以后,一旦用户修改表单元素的值
则data里面对应数据的值也会随之发生改变,甚至,页面中凡是使用了这个数据都会发生变化。
- 双花括号仅用输出文本内容,如果要输出html代码,则不能使用这个.要使用
v-html
来输出.
v-html
必须在html标签里面作为属性写出来.
1 | <span v-html="img"></span> |
在输出内容到普通标签的使用
{{ }}
还支持js代码。1
<h1>{{str1.split("").reverse().join("")}}</h1>
支持js的运算符
1
<h1>{{num1+3}}</h1>
三元运算符,类似于python里面的三元表达式
三元运算符的语法:
判断条件 ? 条件为true : 条件为false的结果1
<h1>num1和num2之间进行比较,最大值:{{ num2>num1?num2:num1 }}</h1>
python 三元表达式[三目运算符]的语法:
1 | a if 条件 else b |
- 图片标签
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
40
41
42
43<span v-html="img"></span>
<img :src="img2" alt="" width="200px"> <!-- 冒号:表示 设置属性 -->
data:{ // data 相当于 model
img:'<img src="img/1.png" width="100px">' ,// 数据为标签时,在页面展示时需要放在一个标签中显示设置v-html 属性
img2:'img/1.png' , //用设置属性的方法 :src='img2'
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="vue.js"></script>
</head>
<body>
<div id="app">
<span v-html="img"></span>
<img :src="img2" alt="" width="200px"> <!-- 冒号:表示 设置属性 -->
<img v-bind:src="img2" width="50"> <!--1.0版本用 v-bind: 设置属性-->
</div>
<script>
// 页面加载完执行
window.onload=function (ev) {
let vm = new Vue({
// 至少两个数据el 和data
el:'#app', //通过css 选择器 确定vue要控制的范围
data:{ // data 相当于 model
img:'<img src="img/1.png" width="100px">' ,// 数据为标签时,在页面展示时需要放在一个标签中显示设置v-html 属性
img2:'img/1.png' , //用设置属性的方法 :src='img2'
}
})
}
</script>
</body>
</html>
常用指令
1.指令 (Directives) 是带有“v-”前缀的特殊属性。每一个指令在vue中都有固定的作用。
在vue中,提供了很多指令,常用的有:v-if、v-model、v-for等等。
指令会在vm对象的data属性的数据发生变化时,会同时改变元素中的其控制的内容或属性。
vue1.x写法 ——> vue2.x的写法
v-html ——> {{ }}
v-bind:属性名 —-> :属性 表示: 设置属性
v-on:事件名 —-> @事件名
1 |
|
2. 操作属性
格式:
<标签名 :标签属性=”data属性”></标签名>
1 | <p :title="str1">{{ str1 }}</p> <!-- 也可以使用v-html显示双标签的内容,{{ }} 是简写 --> |
3.事件绑定
有两种写法,@事件名 和 v-on:事件名
1 | <button v-on:click="num++">按钮</button> <!-- v-on 是vue1.x版本的写法 --> |
使用@事件名来进行事件的绑定
语法:绑定的事件的事件名,全部都是js的事件名:
@submit —> onsubmit
@focus —> onfocus
- 案例1 :
- 知识点:
1. v-model input 框
2. @click 点击事件
3. 三元运算符
核心代码:
1 | <button @click="num+=1">添加商品</button> |
1 |
|
4 操作样式
- 控制标签class类名
格式:<h1 :class="值">元素</h1>
值可以是对象、对象名、数组
添加class类名,值是一个对象
1 | <style> |
1 | data:{ // data 相当于 model |
批量给元素增加多个class样式类
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<style>
.box4{
background-color: red;
}
.box5{
color: green;
}
</style>
<!-- 批量给元素增加多个class样式类 -->
<style>
.box6{background-color: red;}
.box7{color: green;}
.box8{border: 1px solid yellow;}
</style>
<div id="app3">
<p :class="[mycls1,mycls2]">第3段落</p>
</div>
<script>
let vm3=new Vue({
el:"#app3",
data:{
mycls1:{
box6:false,
box7:true
},
mycls2:{
box8:true
}
}
})
</script>控制标签style样式
格式1:值是json对象,对象写在元素的:style属性中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<div :style="{color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
activeColor: 'red',
fontSize: 30
}
格式2:值是对象变量名,对象在data中进行声明
<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
格式3:值是数组
<div v-bind:style="[style1, style2]"></div>
data: {
style1:{
color:"red"
},
style2:{
background:"yellow",
fontSize: "21px"
}
}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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="vue.js"></script>
<style>
.box1{color: red;border: 1px solid #000;}
.box2{background-color: orange;font-size: 32px;}
</style>
</head>
<body>
<!--方式一-->
<div id="box1">
<p :style="{color:mycolor,backgroundColor:mybg}">第一段内容</p>
</div>
<br>
<script>
var vm1= new Vue({
el:"#box1",
data:{
mycolor:'red',
mybg:'pink'
}
})
</script>
<!--方式二-->
<div id="box2">
<p :style="mystyle">第一段内容</p>
</div>
<br>
<script>
var vm2= new Vue({
el:"#box2",
data:{
mystyle:{
color:"red",
backgroundColor:"pink"
}
}
})
</script>
<!--方式三:-->
<div id="box3">
<div :style="[mystyle,mystyle2]">第一段内容</div>
</div>
<br>
<script>
var vm3= new Vue({
el:"#box3",
data:{
mystyle:{
color:"red",
backgroundColor:"pink"
},
mystyle2:{
height:"400px",
width:"400px"
}
}
})
</script>
例子
3. 条件渲染指令
vue中提供了两个指令可以用于判断是否要显示元素,分别是v-if和v-show。
v-if
data数据: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<!-- vue对象最终会把条件的结果变成布尔值 -->
<h1 v-if="ok">Yes</h1>
data:{
ok:false // true则是显示,false是该标签不会出现,不只是隐藏
}
2 v-else
v-else指令来表示 v-if 的“else 块”,v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。
<h1 v-if="ok">Yes</h1>
<h1 v-else>No</h1>
data:{
ok:false // true则是显示,false是隐藏
}
3 v-else-if
<h1 v-if="num==1">num的值为1</h1>
<h1 v-else-if="num==2">num的值为2</h1>
<h1 v-else>num的值是{{num}}</h1>
data:{
num:2
}
4 v-show
用法和v-if大致一样,区别在于2点:
1. v-show后面不能v-else
2. v-show隐藏元素时,使用的是display:none来隐藏的,
而v-if是直接从HTML文档中移除元素[ DOM操作中的remove ]
<h1 v-show="ok">Hello!</h1>
data:{
ok:false // true则是显示,false是隐藏
案例:v-if v-else v-show1
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
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="vue.js"></script>
</head>
<body>
<div id="box">
<p v-if="is_login">欢迎再次登录我们网站</p>
<p v-else><a href="">注册</a><a href="">登录</a></p>
<p v-if="num%3==0">这个数能被3整除</p>
<p v-else-if="num%5==0">这个数能被5整除</p>
<p v-else-if="num==1">这个数为{{num}}</p>
<p v-else>你好</p>
<!--v-show 符合条件就展示 ,不符合条件就隐藏 -->
<p v-show="num==3">这个数为3</p>
<p v-show="num">这个数为3</p>
</div>
</body>
<script>
var vm =new Vue({
el:'#box',
data:{
// is_login:true,
is_login:false,
num:3
}
})
</script>
</html>
5 列表渲染指令
在vue中,可以通过v-for指令可以将一组数据渲染到页面中,数据可以是数组或者对象。
数据是数组:
1 | <ul> |
商品增减
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="vue.js"></script>
<style>
span{
height: 100px;
width: 100px;
background: grey;
display: inline-block;
line-height: 100px;
text-align: center;
}
.new div{
width: 320px;
height: 300px;
background: red;
display: none;
}
.new .active{
display: block;
}
.current{
background: red;
}
</style>
</head>
<body>
<div id="box">
<div class='item'>
<span :class="num==1?'current':''" @click="num=1">国内新闻</span>
<span :class="num==2?'current':''" @click="num=2">国外新闻</span>
<span :class="num==3?'current':''" @click="num=3">银河新闻</span>
</div>
<div class="new" >
<div :class="num==1?'active':''">国内新闻</div>
<div :class="num==2?'active':''">国外新闻</div>
<div :class="num==3?'active':''">银河新闻</div>
</div>
</div>
</body>
<script>
var vm =new Vue({
el:'#box',
data:{
num:1
}
})
</script>
</html>
内容切换
1 |
|
表格的增删改查
1 |
|