一 VUE基本语法
(一).入门步骤
1.导入vue.js文件 html下部编辑
2.指定区域进行渲染 需要准备div vue.js代码
3.创建VUE.js对象 指定渲染区域 动态调用
(二)
插值表达式: {{key}}
特点: 如果页面没有渲染完成,则直接展现给用户 插值表达式需要直接显示
(三)语法
1.const 定义常量的 *
2.let: 作用和var类似, 有作用域的概念 *
3.var 特点:没有作用域
4.el 指定区域
5.data: 定义属性
案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VUE入门案例</title>
</head>
<body>
<!--
入门案例步骤:
1.导入vue.js文件 html下部编辑
2.指定区域进行渲染 需要准备div vue.js代码
3.创建VUE.js对象 指定渲染区域 动态调用
-->
<!-- 2.指定区域 -->
<div id="app">
<!-- 在div中展现msg属性
插值表达式: {{key}}
-->
<h1>{{msg}}</h1>
</div>
<!-- 1.导入JS文件 -->
<script src="../js/vue.js"></script>
<!-- 3.创建VUE对象 -->
<script>
/**
* 语法:
* 1.const 定义常量的
* 2.let: 作用和var类似, 有作用域的概念
* 3.var 特点:没有作用域
*/
const APP = new Vue({
//1.指定区域
el: "#app",
//2.定义属性
data: {
//key:value
msg: "您好VUE"
}
})
</script>
</body>
</html>
二 数据显示
(一)常用的指令
1.v-text指令: 如果页面没有渲染完成,则不显示信息
注意事项: 只有显示时采用,输入操作不可使用
2..v-html 直接渲染html标签 -
3.v-pre 跳过预编译 显示标签体本身
4.v-once 只渲染一次
案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>数据显示</title>
</head>
<body>
<div id="app">
<!-- 特点: 如果页面没有渲染完成,则直接展现给用户
插值表达式需要直接显示
注意事项: 只有显示时采用,输入操作不可使用
1.v-text指令: 如果页面没有渲染完成,则不显示信息
-->
{{msg}}
<h1 v-text="msg"></h1>
<!-- 2.v-html 直接渲染html标签 -->
<div v-html="h3Html"></div>
<!-- 3.v-pre 跳过预编译 显示标签体本身 -->
<div v-pre>{{msg}}</div>
<!-- 4.v-once 只渲染一次 -->
<div v-once>{{once}}</div>
</div>
<!-- -->
<!-- 1.导入JS文件 -->
<script src="../js/vue.js"></script>
<!-- 3.创建VUE对象 -->
<script>
const APP = new Vue({
el: "#app",
data: {
msg: "您好VUE",
h3Html: "<h3>我需要html渲染</h3>",
once: "我只能被渲染一次"
}
})
</script>
</body>
</html>
三 双向数据绑定
(一)
1.作用:双向数据绑定: 实现了页面与数据的绑定. 页面变数据变 / 数据变页面变.
2.语法 v-model
解释:1.数据端---页面 2.页面-----数据
(二)双向数据绑定原理
原理步骤:
1.用户修改页面时,通过DOM的监听器感知用户的修改行为,之后通过虚拟DOM对象,第一时间更新Model中的属性.
2.当数据发生变化,由虚拟DOM根据数据绑定的规则,第一事件通知真实的DOM对象.至此页面数据发生变化.
案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>数据显示</title>
</head>
<body>
<div id="app">
<!-- 双向数据绑定 v-model
1.数据端---页面
2.页面-----数据
-->
<input name="msg" v-model="msg"/><br>
{{msg}}
</div>
<!-- 1.导入JS文件 -->
<script src="../js/vue.js"></script>
<!-- 3.创建VUE对象 -->
<script>
const APP = new Vue({
el: "#app",
data: {
msg: "数据随时修改"
}
})
</script>
</body>
</html>
四 MVVM设计思想
MVVM思想说明:
M: Model 封装的数据. 数据层
V: View 数据的展现 视图层
VM: viewModel视图数据的控制层 控制数据流转
MVVM设计思想是前端模拟后端为了解耦的一种设计思想.
五 事件绑定
(一)语法
v-on:click="函数/直接进行计算"
@click="函数/直接进行计算"
(二) 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>双向数据绑定</title>
</head>
<body>
<div id="app">
<!-- 双向数据绑定 v-model
1.数据端---页面
2.页面-----数据
-->
<input name="msg" v-model="msg"/><br>
{{msg}}
</div>
<!-- 1.导入JS文件 -->
<script src="../js/vue.js"></script>
<!-- 3.创建VUE对象 -->
<script>
const APP = new Vue({
el: "#app",
data: {
msg: "数据随时修改"
}
})
</script>
</body>
</html>
六 按键触发机制
(一) 语法
1.v-on:keydown="" 按下触发
2.v-on:keyup="" 弹起来触发
3.v-on:keypress="" 小键盘触发
(二)按键支持
(三) 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>按键触发操作</title>
</head>
<body>
<div id="app">
<!--
语法:
1.v-on:keydown="" 按下触发
2.v-on:keyup="" 弹起来触发
3.v-on:keypress="" 小键盘触发
按键支持:
.enter .tab
.delete (捕获“删除”和“退格”键)
.esc .space
.up .down .left .right
需求:用户通过输入 按特殊的键位触发函数
要求1. 按钮实现加法操作 num = num + num2
要求2. 用户按回车按钮实现触发
要求3. 用户按空格键实现触发
-->
<h3>用户数据:{{num}}</h3><br>
<!-- <input type="text" v-on:keyup.enter="addNum" v-model="num2" /> -->
<input type="text" v-on:keyup.space="addNum" v-model="num2" />
<button @click="addNum">计算</button>
</div>
<script src="../js/vue.js"></script>
<script>
const APP = new Vue({
el: "#app",
data: {
num: 100,
num2: 0
},
methods: {
addNum(){
//this.num = this.num + this.num2
//将字符串转化为数值类型
this.num += parseInt(this.num2)
}
}
})
</script>
</body>
</html>
七 按键修饰符
(一) 阻止冒泡 .stop
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>按键修饰符</title>
</head>
<body>
<div id="app">
<!--
说明: 如果事件嵌套则必然带来事件的冒泡.
解决方案: 阻止事件冒泡 .stop属性
-->
数值: {{num}}
<div @click="num++">
嵌套结构
<button @click.stop="num++">计算</button>
</div>
<script src="../js/vue.js"></script>
<script>
const APP = new Vue({
el: "#app",
data: {
num: 0
},
methods: {
}
})
</script>
</body>
</html>
(二)阻止默认行为 .prevent
<!-- 需求2:
a标签作用中的href的跳转是默认规则
要求: 用户点击a标签 不跳转页面,同时触发事件
解决: 阻止标签的默认行为 @click.prevent
-->
<a href="http://baidu.com" @click.prevent="aClick">百度</a>
<!-- 用途: prevent阻止页面跳转 a标签/form表单 action同步请求 -->
八 属性和类型绑定
1.属性语法: v-bind:href="VUE中的属性"
简化写法 :href="url"
2.类型语法 规则: :class是属性的绑定,绑定之后查找对应的属性
3.属性切换 语法: :class={class类型的名称: false}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>属性绑定</title>
<style>
/* red 红色 宽度50 高度50 */
.red {
background-color: red;
width: 50px;
height: 50px;
}
.blue {
background-color: aqua;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="app">
<!-- a标签的属性绑定
需求: href中的属性动态赋值
语法: v-bind:href="VUE中的属性"
-->
<a v-bind:href="url">百度</a>
<!-- 简化写法 -->
<a :href="url">百度</a>
<hr />
<!-- 2.class类型绑定
class中可以定义多个样式.简化程序的调用
需求: 需要动态的为class赋值
规则: :class是属性的绑定,绑定之后查找对应的属性
colorClass: "blue" 之后根据value值 blue 查找对应的CSS样式
15上课
-->
<div :class="colorClass">我是class修饰</div>
<hr >
<!-- 3. 属性切换
需求: 通过按钮控制样式是否展现 属性
语法: :class={class类型的名称: false}
-->
<div :class="{red: flag}">我是class修饰</div>
<button @click="flag = !flag">切换</button>
</div>
<script src="../js/vue.js"></script>
<script>
const APP = new Vue({
el: "#app",
data: {
url: "http://www.baidu.com",
colorClass: "blue",
flag: true
}
})
</script>
</body>
</html>
九 分支结构语法
.语法:
1.v-if 如果为真则展现标签
2.v-else-if 必须与v-if连用
3.v-else 必须与v-if连用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>属性绑定</title>
<style>
</style>
</head>
<body>
<div id="app">
<!-- 分支结构
语法:
1.v-if 如果为真则展现标签
2.v-else-if 必须与v-if连用
3.v-else 必须与v-if连用 取反
案例:
要求: 按照用户的考试成绩 评级
>=90分 优秀
>=80分 良好
>=70分 中等
>=60分 及格
否则 不及格
-->
<h3>评级</h3>
请录入分数: <input v-model="score" />
<div v-if="score >= 90 ">优秀</div>
<div v-else-if="score >= 80 ">良好</div>
<div v-else-if="score >= 70 ">中等</div>
<div v-else-if="score >= 60 ">及格</div>
<div v-else>不及格</div>
</div>
<script src="../js/vue.js"></script>
<script>
const APP = new Vue({
el: "#app",
data: {
score: 70
}
})
</script>
</body>
</html>
十 循环结构
1.数组循环语法:v-for((value,index) in array)
2.对象循环语法 v-for((value,key,index) in obj)
3.对象和数组结合的语法:v-for(user in userList) 后续通过user.属性取值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>循环结构</title>
<style>
</style>
</head>
<body>
<div id="app">
<!--
1.什么时候使用循环
多次重复的执行同一个操作.
2.什么数据使用循环
1.数组
2.对象
3.数组套对象(集合)
-->
<!--
1. 遍历数据 将数组中的数据在页面中展现
-->
<p v-for="item in array" v-text="item">
<!-- {{item}} -->
</p>
<!-- 2. 获取下标 30上课
语法: v-for="(遍历的元素,遍历的下标) in array"
-->
<p v-for="(item,index) in array">
下标:{{index}}~~~数据值:{{item}}
</p>
<hr >
<!-- 2. 遍历对象
v-for="(value,key,index下标)
-->
<p v-for="(value,key,index) in user">
{{index}}~~~~{{key}}~~~~{{value}}
</p>
<!-- 3. 遍历"集合" -->
<p v-for="user in userList">
ID: {{user.id}}
| name: {{user.name}}
| age:{{user.age}}
<!-- <p v-for="(value,key,index) in user">
</p> -->
</p>
<!-- 总结:
1. 如果遍历数组 参数 (value,index)
2. 如果遍历对象 参数 (value,key,index)
特点: 遍历数据在页面中展现
-->
</div>
<script src="../js/vue.js"></script>
<script>
const APP = new Vue({
el: "#app",
data: {
array: ["郭晶晶","马龙","姚明"],
user: {
id: 100,
name: "tomcat",
age: 18
},
userList: [
{
id: 100,
name: "tomcat",
age: 18
},
{
id: 200,
name: "mysql",
age: 20
}
]
}
})
</script>
</body>
</html>
十一 form表单数据绑定
form表单中如何实现双向数据绑定.
十二 表单修饰符
语法: .number 只能输入数值类型
.trim 去除左右空格
.lazy 离焦事件才触发
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>表单修饰符</title>
</head>
<body>
<h1>表单修饰符number/trim/lazy</h1>
<div id="app">
<!--
语法:
.number 只能输入数值类型
.trim 去除左右空格
.lazy 离焦事件才触发
-->
<h3>数据展现: {{age}}</h3>
年龄: <input type="text" v-model.number="age" />
<button @click="addNum">增加</button>
<hr />
用户输入的长度: {{name.length}} <br>
用户名: <input type="text" v-model.trim="name" />
<hr />
展现数据lazy~~{{msg}} <br>
<input type="text" v-model.lazy="msg"/>
</div>
<!-- 引入JS文件 -->
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
age: 18,
name: '',
msg: ''
},
methods: {
addNum(){
this.age += 1
}
}
})
</script>
</body>
</html>
十三 计算属性
将用户的输入内容进行反转
API:
1.字符串转化为数组 拆串 split('')
2.将数组倒序 .reverse()
3.将数组转化为字符串 .join('')
计算属性功能用法:
1.插值表达式中应该写简单的算数计算,如果复杂应该封装
2.如果数据操作相同则应该简化过程.
总结: 计算属性相对于方法 效率高(从虚拟DOM中直接获取结果)
- 复杂的操作如果通过{{}} 插值表达式封装 比较冗余.
- 如果将复杂的操作封装为方法 调用一次执行一次 效率低.
- 计算属性:
1.可以封装复杂操作
2.内部有缓存机制,只需要计算一次.多次调用 效率高
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>计算属性</title>
</head>
<body>
<h1></h1>
<div id="app">
<!-- 需求:
将用户的输入内容进行反转
API:
1.字符串转化为数组 拆串 split('')
2.将数组倒序 .reverse()
3.将数组转化为字符串 .join('')
计算属性功能用法:
1.插值表达式中应该写简单的算数计算,如果复杂应该封装
2.如果数据操作相同则应该简化过程.
总结: 计算属性相对于方法 效率高(从虚拟DOM中直接获取结果)
-->
<h3>数据展现:</h3>
{{reverse()}}<br> <!-- 方法多次执行-->
{{reverse()}}<br>
{{reverse()}}<br>
{{reverse()}}<br>
{{reverseCom}}<br> <!-- 计算属性只执行一次-->
{{reverseCom}}<br>
{{reverseCom}}<br>
{{reverseCom}}<br>
<input type="text" v-model="msg"/>
</div>
<!-- 引入JS文件 -->
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
msg: 'abc'
},
methods: {
reverse(){
console.log("方法执行!!!!!")
return this.msg.split('').reverse().join('')
}
},
computed: {
//key:value 必须添加返回值
reverseCom(){
console.log("计算属性!!!!")
return this.msg.split('').reverse().join('')
}
}
})
</script>
</body>
</html>