1、v-bind
⽬标 : 给标签属性设置 vue 变量的值
vue 指令 , 实质上就是特殊的 html 标签属性 , 特点 : v- 开头
每个指令 , 都有独⽴的作⽤
语法: v-bind:属性名="vue变量"
简写: : 属性名="vue变量"
<!-- vue 指令 -v-bind 属性动态赋值 -->
<a v-bind:href = "url" > 我是 a 标签 </a>
<img :src = "imgSrc" >
总结 : 把 vue 变量的值 , 赋予给 dom 属性上 , 影响标签显⽰效果
2、v-on
⽬标 : 给标签绑定事件
语法
v-on: 事件名 =" 要执⾏的 == 少量代码 =="
v-on: 事件名 ="methods 中的函数 "
<!-- vue 指令 -v-bind 属性动态赋值 -->
<a v-bind:href = "url" > 我是 a 标签 </a>
<img :src = "imgSrc" > v-on: 事件名 ="methods 中的函数 ( 实参 )"
简写 : @ 事件名 ="methods 中的函数 "
<!-- vue 指令 : v-on 事件绑定 -->
<p> 你要买商品的数量 : {{count}} </p>
<button v-on:click = "count = count + 1" > 增加 1 </button>
<button v-on:click = "addFn" > 增加 1 个 </button>
<button v-on:click = "addCountFn(5)" > ⼀次加 5 件 </button>
<button @click = "subFn" > 减少 </button>
<script>
export default {
// ... 其他省略
methods : {
addFn (){ // this 代表 export default 后⾯的组件对象 ( 下属有 data ⾥ return 出来的属性 )
this . count ++
},
addCountFn ( num ){
this . count += num
},
subFn (){
this . count --
}
}
}
</script>
总结 : 常⽤ @ 事件名 , 给 dom 标签绑定事件 , 以及 = 右侧事件处理函数
3、v-on事件对象
⽬标 : vue 事件处理函数中 , 拿到事件对象
语法:
⽆传参 , 通过形参直接接收
传参 , 通过 $event 指代事件对象传给事件处理函数
<!-- vue 指令 : v-on 事件绑定 -->
<p> 你要买商品的数量 : {{count}} </p>
<button v-on:click = "count = count + 1" > 增加 1 </button>
<button v-on:click = "addFn" > 增加 1 个 </button>
<button v-on:click = "addCountFn(5)" > ⼀次加 5 件 </button>
<button @click = "subFn" > 减少 </button>
<script>
export default {
// ... 其他省略
methods : {
addFn (){ // this 代表 export default 后⾯的组件对象 ( 下属有 data ⾥ return 出来的属性 )
this . count ++
},
addCountFn ( num ){
this . count += num
},
subFn (){
this . count --
}
}
}
</script>
<template>
<div>
<a @click = "one" href = "http://www.baidu.com" > 阻⽌百度 </a>
<hr>
<a @click = "two(10, $event)" href = "http://www.baidu.com" > 阻⽌去百度 </a>
</div>
</template>
<script>
export default
methods : {
one ( e ){
e . preventDefault ()
},
two ( num , e ){
e . preventDefault ()
}
}
}
</script>
4、vue指令-v-on修饰符
⽬的: 在事件后⾯ . 修饰符名 - 给事件带来更强⼤的功能
语法:
@ 事件名 . 修饰符 ="methods ⾥函数 "
.stop - 阻⽌事件冒泡
.prevent - 阻⽌默认⾏为
.once - 程序运⾏期间 , 只触发⼀次事件处理函数
总结 : 修饰符给事件扩展额外功能
methods : {
one ( e ){
e . preventDefault ()
},
two ( num , e ){
e . preventDefault ()
}
}
}
</script>
<template>
<div @click = "fatherFn" >
<!-- vue 对事件进⾏了修饰符设置 , 在事件后⾯ . 修饰符名即可使⽤更多的功能 -->
<button @click.stop = "btn" > .stop 阻⽌事件冒泡 </button>
<a href = "http://www.baidu.com" @click.prevent = "btn" > .prevent 阻⽌默认⾏为 </a>
<button @click.once = "btn" > .once 程序运⾏期间 , 只触发⼀次事件处理函数 </button>
</div>
</template>
<script>
export default {
methods : {
fatherFn (){
console . log ( "father 被触发 " );
},
btn (){
console . log ( 1 );
}
}
}
</script>
5、vue指令-v-on按键修饰符
⽬标 : 给键盘事件 , 添加修饰符 , 增强能⼒
语法:
@keyup.enter - 监测回车按键
@keyup.esc - 监测返回按键
更多修饰符
<template>
<div>
<input type = "text" @keydown.enter = "enterFn" >
<hr>
<input type = "text" @keydown.esc = "escFn" >
</div>
</template>
<script>
export default {
methods : {
enterFn (){
console . log ( "enter 回⻋按键了 " );
},
escFn (){
console . log ( "esc 按键了 " );
}
}
}
</script>
总结 : 多使⽤事件修饰符 , 可以提⾼开发效率 , 少去⾃⼰判断过程
练习
<template>
<div>
<h1> {{ message }} </h1>
<button @click = "btn" > 逆转世界 </button>
</div>
</template>
<script>
export default {
data () {
return {
message : "HELLO, WORLD" ,
};
},
methods : {
btn (){
this . message = this . message . split ( "" ). reverse (). join ( "" )
}
}
};
</script>
6、vue指令 v-model
⽬标 : 把 value 属性和 vue 数据变量 , 双向绑定到⼀起
语法 : v-model="vue 数据变量 "
双向数据绑定
数据变化 -> 视图⾃动同步
视图变化 -> 数据⾃动同步
演⽰ : ⽤户名绑定 - vue 内部是 MVVM 设计模式
<template>
<div>
<h1> {{ message }} </h1>
<button @click = "btn" > 逆转世界 </button>
</div>
</template>
<script>
export default {
data () {
return {
message : "HELLO, WORLD" ,
};
},
methods : {
btn (){
this . message = this . message . split ( "" ). reverse (). join ( "" )
}
}
};
</script> <template>
<div>
<!--
v-model: 是实现 vuejs 变量和表单标签 value 属性 , 双向绑定的指令
-->
<div>
<span> ⽤户名 : </span>
<input type = "text" v-model = "username" />
</div>
<div>
<span> 密码 : </span>
<input type = "password" v-model = "pass" />
</div>
<div>
<span> 来⾃于 : </span>
<!-- 下拉菜单要绑定在 select 上 -->
<select v-model = "from" >
<option value = " 北京市 " > 北京 </option>
<option value = " 南京市 " > 南京 </option>
<option value = " 天津市 " > 天津 </option>
</select>
</div>
<div>
<!-- ( 重要 )
遇到复选框 , v-model 的变量值
⾮数组 - 关联的是复选框的 checked 属性
数组 - 关联的是复选框的 value 属性
-->
<span> 爱好 : </span>
<input type = "checkbox" v-model = "hobby" value = " 抽烟 " > 抽烟
<input type = "checkbox" v-model = "hobby" value = " 喝酒 " > 喝酒
<input type = "checkbox" v-model = "hobby" value = " 写代码 " > 写代码
</div>
<div>
<span> 性别 : </span>
<input type = "radio" value = " 男 " name = "sex" v-model = "gender" > 男
<input type = "radio" value = " ⼥ " name = "sex" v-model = "gender" > ⼥
</div>
<div>
<span> ⾃我介绍 </span>
<textarea v-model = "intro" ></textarea>
</div>
</div>
</template>
<script>
export default {
data () {
return {
username : "" ,
pass : "" ,
from : "" ,
hobby : [],
sex : "" ,
intro : "" ,
};
// 总结 :
// 特别注意 : v-model, 在 input[checkbox] 的多选框状态
// 变量为⾮数组 , 则绑定的是 checked 的属性 (true/false) - 常⽤于 : 单个绑定使⽤
// 变量为数组 , 则绑定的是他们的 value 属性⾥的值 - 常⽤于 : 收集勾选了哪些值
}
};
</script>
总结 : 本阶段 v-model 只能⽤在表单元素上 , 以后学组件后讲 v-model ⾼级⽤法
7、vue 指令 v-model
⽬标 : 把 value 属性和 vue 数据变量 , 双向绑定到⼀起
语法 : v-model="vue 数据变量 "
双向数据绑定
数据变化 -> 视图⾃动同步
视图变化 -> 数据⾃动同步
演⽰ : ⽤户名绑定 - vue 内部是 MVVM 设计模式
<template>
<div>
<h1> {{ message }} </h1>
<button @click = "btn" > 逆转世界 </button>
</div>
</template>
<script>
export default {
data () {
return {
message : "HELLO, WORLD" ,
};
},
methods : {
btn (){
this . message = this . message . split ( "" ). reverse (). join ( "" )
}
}
};
</script> <template>
<div>
<!--
v-model: 是实现 vuejs 变量和表单标签 value 属性 , 双向绑定的指令
-->
<div>
<span> ⽤户名 : </span>
<input type = "text" v-model = "username" />
</div>
<div>
<span> 密码 : </span>
<input type = "password" v-model = "pass" />
</div>
<div>
<span> 来⾃于 : </span>
<!-- 下拉菜单要绑定在 select 上 -->
<select v-model = "from" >
<option value = " 北京市 " > 北京 </option>
<option value = " 南京市 " > 南京 </option>
<option value = " 天津市 " > 天津 </option>
</select>
</div>
<div>
<!-- ( 重要 )
遇到复选框 , v-model 的变量值
⾮数组 - 关联的是复选框的 checked 属性
数组 - 关联的是复选框的 value 属性
-->
<span> 爱好 : </span>
<input type = "checkbox" v-model = "hobby" value = " 抽烟 " > 抽烟
<input type = "checkbox" v-model = "hobby" value = " 喝酒 " > 喝酒
<input type = "checkbox" v-model = "hobby" value = " 写代码 " > 写代码
</div>
<div>
<span> 性别 : </span>
<input type = "radio" value = " 男 " name = "sex" v-model = "gender" > 男
<input type = "radio" value = " ⼥ " name = "sex" v-model = "gender" > ⼥
</div>
<div>
<span> ⾃我介绍 </span>
<textarea v-model = "intro" ></textarea>
</div>
</div>
</template>
<script>
export default {
data () {
return {
username : "" ,
pass : "" ,
from : "" ,
hobby : [],
sex : "" ,
intro : "" ,
};
// 总结 :
// 特别注意 : v-model, 在 input[checkbox] 的多选框状态
// 变量为⾮数组 , 则绑定的是 checked 的属性 (true/false) - 常⽤于 : 单个绑定使⽤
// 变量为数组 , 则绑定的是他们的 value 属性⾥的值 - 常⽤于 : 收集勾选了哪些值
}
};
</script>
总结 : 本阶段 v-model 只能⽤在表单元素上 , 以后学组件后讲 v-model ⾼级⽤法
8、vue指令 v-model修饰符
_vue指令 v-model修饰符
⽬标: 让v-model拥有更强⼤的功能
语法:
- v-model.修饰符="vue数据变量"
- .number 以parseFloat转成数字类型
- .trim 去除⾸尾空⽩字符
- .lazy 在change时触发⽽⾮inupt时
</script>
<template>
<div>
<div>
<span> 年龄 : </span>
<input type = "text" v-model.number = "age" >
</div>
<div>
<span> ⼈⽣格⾔ : </span>
<input type = "text" v-model.trim = "motto" >
</div>
<div>
<span> ⾃我介绍 : </span>
<textarea v-model.lazy = "intro" ></textarea>
</div>
</div>
</template>
<script>
export default {
data () {
return {
age : "" ,
motto : "" ,
intro : ""
</script>
总结: v-model修饰符, 可以对值进⾏预处理, ⾮常⾼效好⽤
9、vue指令 v-text和v-html
⽬的: 更新DOM对象的innerText/innerHTML
语法 :
- v-text="vue数据变量"
- v-html="vue数据变量"
- 注意: 会覆盖插值表达式
</script>
<template>
<div>
<p v-text = "str" ></p>
<p v-html = "str" ></p>
</div>
</template>
<script>
export default {
data () {
return {
str : "<span> 我是⼀个 span 标签 </span>"
}
}
}
</script>
总结 : v-text 把值当成普通字符串显⽰ , v-html 把值当做 html 解析
10、_vue指令 v-show和v-if
⽬标 : 控制标签的隐藏或出现
语法:
- v-show="vue变量"
- v-if="vue变量"
- 原理
- v-show ⽤的display:none隐藏 (频繁切换使⽤)
v-else使⽤
<template>
<div>
<h1 v-show = "isOk" > v-show 的盒⼦ </h1>
<h1 v-if = "isOk" > v-if 的盒⼦ </h1>
<div>
<p v-if = "age > 18" > 我成年了 </p>
<p v-else > 还得多吃饭 </p>
</div>
</div>
</template>
<script>
export default {
data () {
return {
isOk : true ,
age : 15
}
}
}
</script>
总结 : 使⽤ v-show 和 v-if 以及 v-else 指令 , ⽅便通过变量控制⼀套标签出现 / 隐藏
案例-折叠⾯板
⽬标 : 点击展开或收起时,把内容区域显⽰或者隐藏
此案例使⽤了 less 语法 , 项⽬中下载模块
yarn add less@3.0.4 less-loader@5.0.0 -D
只有标签和样式
<template>
<div id = "app" >
<h3> 案例:折叠⾯板 </h3>
<div>
<div class = "title" >
<h4> 芙蓉楼送⾟渐 </h4>
<span class = "btn" >
收起
</span>
</div>
<div class = "container" >
<p> 寒⾬连江夜⼊吴 , </p>
<p> 平明送客楚⼭孤。 </p>
<p> 洛阳亲友如相问, </p>
<p> ⼀⽚冰⼼在⽟壶。 </p>
</div>
</div>
</div>
</template>
<script>
export default {
data () {
return {
}
}
}
</script>
<style lang = "less" >
body {
background-color : #ccc ;
#app {
width : 400px ;
margin : 20px auto ;
background-color : #fff ;
border : 4px solid blueviolet ;
border-radius : 1em ;
box-shadow : 3px 3px 3px rgba ( 0 , 0 , 0 , 0.5 );
padding : 1em 2em 2em ;
h3 {
text-align : center ;
}
.title {
display : flex ;
justify-content : space-between ;
align-items : center ;
border : 1px solid #ccc ;
padding : 0 1em ;
}
.title h4 {
line-height : 2 ;
margin : 0 ;
}
.container {
border : 1px solid #ccc ;
padding : 0 1em ;
}
.btn {
/* ⿏标改成⼿的形状 */
cursor : pointer ;
}
}
}
</style>
正确答案
<template>
<div id = "app" >
<h3> 案例:折叠⾯板 </h3>
<div>
<div class = "title" >
<h4> 芙蓉楼送⾟渐 </h4>
<span class = "btn" @click = "isShow = !isShow" >
{{ isShow ? ' 收起 ' : ' 展开 ' }}
</span>
</div>
<div class = "container" v-show = "isShow" >
<p> 寒⾬连江夜⼊吴 , </p>
<p> 平明送客楚⼭孤。 </p>
<p> 洛阳亲友如相问, </p>
<p> ⼀⽚冰⼼在⽟壶。 </p>
</div>
</div>
</div>
</template>
<script>
export default {
data () {
return {
isShow : false
}
}
}
</script>
11、vue指令-v-for
⽬标 : 列表渲染 , 所在标签结构 , 按照数据数量 , 循环⽣成
语法
- v-for="(值, 索引) in ⽬标结构"
- v-for="值 in ⽬标结构"
⽬标结构:
- 可以遍历数组 / 对象 / 数字 / 字符串 (可遍历结构)
注意:
- v-for的临时变量名不能⽤到v-for范围外
<template>
<div id = "app" >
<div id = "app" >
<!-- v-for 把⼀组数据 , 渲染成⼀组 DOM -->
<!-- ⼝诀 : 让谁循环⽣成 , v-for 就写谁身上 -->
<p> 学⽣姓名 </p>
<ul>
<li v-for = "(item, index) in arr" :key = "item" >
{{ index }} - {{ item }}
</li>
</ul>
<p> 学⽣详细信息 </p>
<ul>
<li v-for = "obj in stuArr" :key = "obj.id" >
<span> {{ obj.name }} </span>
<span> {{ obj.sex }} </span>
<span> {{ obj.hobby }} </span>
</li>
</ul>
<!-- v-for 遍历对象 ( 了解 ) -->
<p> ⽼师信息 </p>
<div v-for = "(value, key) in tObj" :key = "value" >
{{ key }} -- {{ value }}
</div>
<!-- v-for 遍历整数 ( 了解 ) - 从 1 开始 -->
<p> 序号 </p>
<div v-for = "i in count" :key = "i" > {{ i }} </div>
</div>
</div>
</template>
<script>
export default {
data () {
return {
arr : [ " ⼩明 " , " ⼩欢欢 " , " ⼤⻩ " ],
stuArr : [
{
id : 1001 ,
name : " 孙悟空 " ,
sex : " 男 " ,
hobby : " 吃桃⼦ " ,
},
{
id : 1002 ,
name : " 猪⼋戒 " ,
sex : " 男 " ,
hobby : " 背媳妇 " ,
},
],
tObj : {
name : " ⼩⿊ " ,
age : 18 ,
class : "1 期 " ,
},
count : 10 ,
};
},
};
</script>
总结 : vue 最常⽤指令 , 铺设页⾯利器 , 快速把数据赋予到相同的 dom 结构上循环⽣成