前言
??在互联网产品快速迭代的背景下,前端开发人员不仅要编写页面,还要通过ajax+js完成页面动态效果,压力较大,为了解决这个问题,因此MVVM开发模式就诞生了。
MVVM是Model-View-ViewModel的简写 - M: 即Model,模型,指的就是数据 - V: 即View, 视图,指的就是页面 - VM:即View-Model,指的是模型和视图的双向绑定。(即view和Model互相影响,Model变了,view随之改变;view变了,Model也随之改变)
在MVVM模式中:
- Model和View是绑定的,Model变了,view自动变化;view变了,Model自动变化。因此,我们只需要关注Model即可。
附图理解: Vue快速入门:
- 引入Vue的vue.js文件
- 编写Vue代码
- 使用Vue向div标签中渲染文字
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{message}}
</div>
<script src="../js/vue-2.6.12.js"></script>
<script>
const app=new Vue({
el:"#app",
data:{
message:"哈哈"
}
});
</script>
</body>
</html>
Vue快速入门细节
// Vue对象的介绍
const app = new Vue({
el: "#app", // el用于挂载视图,就是用css选择器,选中当前vue可以管理的视图范围,注意: vue选择视图必须使用的是双标签,html和body除外
data:{ // data是一个对象,里面存储的就是视图数据,支持js的各种数据类型(简单 对象 数组)
message: ""
}
})
举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{message}}
</div>
<script src="../js/vue-2.6.12.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
message:"",
user:{"username":"jack"},
arr:["aaa","bbb","ccc"]
}
});
</script>
</body>
</html>
Vue中的语法
1.插值表达式
- 插值表达式的语法:{{ 表达式 }}
- 作用:插值表达式主要作用是从Model中获取数据渲染到View
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/vue-2.6.12.js"></script>
</head>
<body>
<div id="app">
{{message}} <br/>
</div>
<script>
const app=new Vue(
{
el:"#app",
data:{
message:"<a href='#'>嘿嘿</a>"
}
});
</script>
</body>
</html>
2.双向绑定
- 语法::v-model
- 插值表达式可以看做是单向绑定,数据影响了视图渲染,但是反过来就不行。
- 注意:目前v-model的可使用元素有:input、select、textarea(表单标签) components(vue内置组件)
- v-model是双向绑定,视图(View)和模型(Model)之间会互相影响。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/vue-2.6.12.js"></script>
</head>
<body>
<div id="app">
<h3>姓名:</h3>
<input type="text" v-model="username" >
<div>您写的姓名是:{{username}}</div>
<h3>性别:</h3>
<input type="radio" value="男" v-model="sex"> 男 <br>
<input type="radio" value="女" v-model="sex"> 女 <br>
<div>您选择的性别是:{{sex}}</div>
<h3>爱好:</h3>
<input type="checkbox" value="抽烟" v-model="hobby">抽烟<br>
<input type="checkbox" value="喝酒" v-model="hobby">喝酒<br>
<input type="checkbox" value="烫头" v-model="hobby">烫头<br>
<div>您选择的爱好是:{{hobby}}</div>
<h3>段位:</h3>
<select v-model="level">
<option value="">请选择</option>
<option value="青铜">青铜</option>
<option value="白银">白银</option>
<option value="王者">王者</option>
</select>
<div>您选择的段位是:{{level}}</div
</div>
<script>
const app=new Vue({
el:"#app",
data:{
username:"",
sex:"",
hobby:['烫头'],
level:"白银"
}
});
</script>
</body>
</html>
3.事件处理
- 事件绑定
- 标准语法 v-on:事件名=“js片段或函数名” 如果不想页面爆红,需要单独引入名称空间。
- 简化语法 @事件名=“js片段或函数名” 推荐使用
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/vue-2.6.12.js"></script>
</head>
<body>
<div id="app">
<b>数量:</b>
<button @click="numdiff()">-</button>
<input type="text" v-model="num" style="width: 30px;">
<button @click="num++">+</button>
<button @mouseover="num++">+</button>
</div>
<script>
const app = new Vue({
el: '#app',
data: {num: 1},
methods:{
numdiff(){
this.num--;
alert("我减1了");
}
}
})
</script>
</body>
</html>
4.列表遍历
- 遍历List/数组
- 在vue中使用v-for实现数组的遍历,格式如下:
- v-for="(item,index) in items" 细节:注意空格 !!!!!
items:要遍历的List item: 每次遍历得到的临时变量 index:每次遍历的索引,从0开始计数(可省略 v-for=“item in items”)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/vue-2.6.12.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(user,index) in users">
{{index}}-->{{user.id}}--->{{user.name}}-->{{user.address}}
</li>
</ul>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
users: [{id: 1, name: 'jack', address: '北京朝阳'}, {id: 2, name: 'lucy', address: '上海外滩'}, {id: 3, name: 'jerry', address: '天津西青'}]
}
})
</script>
</body>
</html>
5.遍历Map
格式如下:
- v-for="(value,key,index) in items"
items:要遍历的Map key: 每次遍历得到的key value:每次遍历得到的value index:每次遍历的索引,从0开始计数
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/vue-2.6.12.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(value,key,index) in users">{{index}}--{{key}}--{{value}}</li>
</ul>
</div>
<script>
const app = new Vue({
el: '#app',
data: { []
users: {"张三": "男", "李四": "男", "王五": "女", "赵六": "男"}
}
})
</script>
</body>
</html>
6.条件判断
- 语法:
v-if=“布尔表达式” v-else-if=“布尔表达式” v-else - 注意:
v-else元素必须紧跟在带v-if或者v-else-if元素的后面,否则它将不会被识别 v-if还可以和v-for联合使用,当二者出现在一起时,会先遍历再判断条件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/vue-2.6.12.js"></script>
</head>
<body>
<div id="app">
<h3>考试成绩练习</h3>
请输入成绩:<input type="text" v-model="score"><br>
你本次开始成绩:
<span v-if="score>=60">及格</span>
<span v-else-if="score<60">不及格</span>
<span v-else>未知</span>
<h3>用户列表</h3>
<ul>
<li v-for="(user,index) in users" v-if="user.gender == '女'">{{user.name}}--{{user.gender}}</li>
</ul>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
score: "未知",
users: [
{name: 'jack', gender: '女'},
{name: 'lucy', gender: '女'},
{name: 'jerry', gender: '男'}
]
}
})
</script>
</body>
</html>
7.属性绑定
- 对于HTML标签属性,如果想要动态传值,不能使用{{}},而应该使用专门的属性绑定语法
标准语法: v-bind:属性名=“Vue中的变量” 简写语法: :属性名=‘Vue中的变量’
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/vue-2.6.12.js"></script>
<style>
#cz {
width: 200px;
height: 200px;
border: 1px solid grey;
}
.back {
background-color: red;
}
.font {
font-size: 40px;
font-weight: bold;
}
</style>
</head>
<body>
<div id="app">
<h3>属性绑定基本使用</h3>
有两个图片地址分别是:../img/vue.png 和 ../img/lj.jpg,请在下面输入地址,改变图片:<br>
图片地址: <input type="text" v-model="imgSrc">
图片宽度: <input type="text" v-model="imgWidth">
<br>
<img :src="imgSrc" :width="imgWidth">
</div>
<script>
const app = new Vue({
el: '#app',
data: {
imgSrc: "../img/vue.png",
imgWidth: "100px"
},
})
</script>
</body>
</html>
|