1. Vue简介
前端主要有三大框架,Angular
、Vue
和React
。Vue
主要分为Vue2和Vue3两个大版本,生态系统完善,最新的长期稳定版本2.7.14,Vue3相比性能、APi支持更加完善。
Vue是一个用来构建用户界面的渐进式框架。
Vue使用步骤:
1. 准备容器
2. 引包(官网)-离线/在线-开发/生产版本
3. 创建vue实例 new Vue()
4. 指定配置项el、data =>渲染数据
a. el指定挂载点,选择器指定要控制的哪个盒子
b. data提供数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!--1. 准备容器,一会儿vue就会把数据展示到这里-->
<div id="app">
<p>姓名: {{ uname.toUpperCase() }} </p>
<p>年龄: {{ age >= 18 ? "成年人": "未成年" }} </p>
<p>朋友的姓名: {{ friend.name }}</p>
</div>
<!-- 导入vue.js-->
<script src="./vue.js"></script>
<script>
// 3. 创建vue实例对象
new Vue({
el: '#app', // 把数据展示到哪里
data: {
// 放需要展示的数据
uname: 'laotang',
age: 30,
friend: {
sex: '男',
name: "齐齐"
}
}
})
</script>
</body>
</html>
-
插值表达式
{{ }}
插值表达式是一种Vue的模板语法,利用表达式进行插值,渲染到页面中。用法:{{ 表达式 }}
。
表达式可以是一个方法,data中的数据或其他可以计算出结果的任意表达式。
-
响应式
响应式可以理解为数据改变,视图自动更新。使用Vue开发,只需关注业务核心逻辑即可。
国内安装chrome: https://www.google.cn/chrome/
2. Vue指令
Vue会根据不同的指令,指针标签实现不同的功能。内置指令一般都是带有v-前缀
的特殊标签属性,不同属性对应不同的功能。
- v-html指令
v-html="表达式"
–>动态设置元素innerHTML,该命令可以动态解析标签。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<p>{{ str }}</p>
<p v-html="str">这里的内容将会被覆盖</p>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
str: "你是一个<strong>优秀</strong>的boy"
}
})
</script>
</body>
</html>
- v-show和v-if指令
二者都可以控制元素显示隐藏。但二者也有一些区别,v-show="表达式"
表达式为true显示,false隐藏,它的原理是切换display:none
控制隐藏。v-if="表达式"
,表达式值true表示显示,false表示隐藏,它的原理是基于条件判断,是否创建或移除元素节点。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<div class="box1" v-show="flag">我是一个v-show控制的盒子</div>
<div class="box2" v-if="flag">我是要给v-if控制的盒子</div>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
flag: true
}
})
</script>
</body>
</html>
除上述说的,v-if
还可以和v-else
和v-else-if
一起使用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<p v-if="sex===1">性别: 男</p>
<p v-else>性别: 女</p>
<br>
<p v-if="score>=90">成绩A: 奖励外星人X17 R2一台</p>
<p v-else-if="score >=80 && score < 90">成绩B: 小米14pro一台</p>
<p v-else-if="score >=60 && score < 80">成绩C: 零食礼包一袋</p>
<p v-else>成绩D: 操场10圈</p>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
sex:1,
score: 65
}
})
</script>
</body>
</html>
- v-on指令
v-on
指令用来注册事件(注册事件=添加监听+提供逻辑处理)。
语法:
第一种:v-on:事件名="内联语句"
;
第二种:v-on:事件名="method中函数名"
。
其中,v-on
可以简写为@事件名
demo1 内联写法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<button v-on:click="count--">-</button>
<span>{{count}}</span>
<button @click="count++">+</button>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
count: 100
}
})
</script>
</body>
</html>
demo2 使用函数:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<button @click="fn">切换显示隐藏</button>
<h1 v-show="flag">hello vue</h1>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
flag: true
},
methods: {
fn() {
// 改变flag=flag取反的值
// this 永远表示Vue的实例
this.flag = !this.flag
}
}
})
</script>
</body>
</html>
demo 给函数传参:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<div class="box">
<h3>小黑自动售货机</h3>
<button @click="fn(5)">可乐5元</button>
<button @click="fn(10)">咖啡10元</button>
<button @click="fn(8)">牛奶8元</button>
</div>
<p>银行卡余额: {{ money }} 元</p>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
money: 100
},
methods: {
fn(n) {
this.money = this.money - n
}
}
})
</script>
</body>
</html>
demo3 事件对象:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<h2>需求: 输入框输入内容,将内容显示到p标签中</h2>
<input type="text" @input="fn(100, 200, $event)">
<p>{{ result }}</p>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
result: ""
},
methods: {
fn(a, b, e) {
this.result = e.target.value
}
}
})
</script>
</body>
</html>
- v-bind指令
v-bind
指令可以动态的设置html的标签属性,比如src、url、title...
,语法:v-bind:属性名="表达式"
,简写形式::属性名="表达式"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<img v-bind:src="url" :alt="alt" title="hello, 我是波仔">
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
url: './01test.png',
alt: '我是波仔'
}
})
</script>
</body>
</html>
综合v-bind和v-on案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<div class="btn">
<button v-show="index>0" @click="index--">上一页</button>
</div>
<div>
<img v-bind:src="list[index]">
</div>
<div class="btn">
<button v-show="index < list.length-1" @click="index++">下一页</button>
</div>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
index: 0,
list: [
"images/10-01.png",
"images/10-02.png",
"images/11-00.gif",
"images/11-01.gif",
"images/11-02.gif",
"images/11-03.gif",
"images/11-04.png",
"images/11-05.png",
]
}
})
</script>
</body>
</html>
- v-for指令
该名利主要是基于数据循环,多次渲染整个元素(数组、对象、数字…)。
语法:v-for="(item,index) in 数组"
,其中,item表示每一项,index表示下标。也可以省略index来循环:v-for="item in 数组"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<h3>小黑水果店</h3>
<ul>
<li v-for="(item,index) in list">{{index}}:{{item}}</li>
</ul>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
list: ["西瓜", "苹果", "鸭梨", "榴莲"]
}
})
</script>
</body>
</html>
v-for和v-on综合案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<h3>小黑的书架</h3>
<ul>
<li v-for="item,index in book_list" v-bind:id="item.id">
<span>{{item.name}}</span>
<span>{{item.author}}</span>
<button @click="del(item.id)">删除</button>
</li>
</ul>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
book_list:[
{"id":1, "name":"《红楼梦》","author":"曹雪芹"},
{"id":2, "name":"《西游记》","author":"吴承恩"},
{"id":3, "name":"《水浒传》","author":"施耐庵"},
{"id":4, "name":"《三国演义》","author":"罗贯中"}
]
},
methods:{
del(id) {
this.book_list = this.book_list.filter(item=>{
return item.id !== id
})
}
}
})
</script>
</body>
</html>
- v-model指令
v-model
指令的作用:给表单元素使用,双向绑定,可以快速获取或设置表单元素的内容。
- 数据变化,视图自动更新
- 视图变化,数据自动更新
语法:v-model="变量"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
账户: <input type="text" v-model="username"> <br>
密码: <input type="password" v-model="password">
<button @click="login">登录</button>
<button @click="reset">重置</button>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
"username": "",
"password": ""
},
methods:{
login() {
console.log("输出账号密码: ",this.username, this.password)
},
reset() {
this.username = ""
this.password = ""
}
}
})
</script>
</body>
</html>
综合案例: 1. 列表渲染 2. 删除功能 3. 添加功能 4. 底部统计和清空功能
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<!--输入框-->
<h1>小黑记事本</h1>
<input v-model="todoName" placeholder="请输入任务" class="new-todo">
<button @click="add" class="add">添加任务</button>
<!--列表区域-->
<section class="main">
<ul class="todo-list">
<li class="todo" v-for="(item, index) in list" :key="item.id">
<div class="view">
<span class="index">{{index+1}}.</span><label>{{item.name}}</label>
<button class="destroy" @click="del(item.id)">x</button>
</div>
</li>
</ul>
</section>
<!--统计和清空 如果没有任务了,底部隐藏掉v-show-->
<footer class="footer" v-show="list.length > 0">
<!--统计-->
<span class="todo-count">合计:<strong>{{list.length}}</strong></span>
<!--清空-->
<button @click="clear" class="clear-completed">清空任务</button>
</footer>
</div>
<script src="./vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
todoName:"",
list: [
{"id":1, "name":"跑步1公里"},
{"id":2, "name":"跳绳200个"},
{"id":3, "name":"游泳200米"}
]
},
methods: {
del(id) {
this.list = this.list.filter(item=>item.id !== id)
return this.list
},
add() {
if (this.todoName.trim()==="") {
alert("请输入任务名称")
return
}
this.list.unshift({
id: +new Date(),
name: this.todoName
})
this.todoName=""
},
clear() {
this.list = []
}
}
})
</script>
</body>
</html>