什么是指令?
指令就是Vue内部提供的一些自定义属性,这些属性中封装了Vue内部的一些功能,只要使用这些指令就可以使用Vue中的对应的功能。
此内容并不详细,只是为了方便快速查找了解
v-text v-html 绑定文本内容
插值表达式功能:把数据插入指定的位置(不会解析html标签)
v-text功能:绑定文本内容,相当于innerText(不会解析html标签)
v-html功能:绑定文本内容,相当于innerHTML(会解析html标签)
1 2 3 4 5 6 7 8 9 10
| <div id="app"> <div> <!-- 插值表达式 --> {{ msg }} </div> <!-- v-text不会解标签 --> <div v-text="msg"></div> <!-- v-html会解析标签 --> <div v-html="msg"></div> </div>
|
v-show 逻辑判断(修改样式)
功能:根据true/false切换元素的显示状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div id="app"> <p v-show="true">显示</p> <!-- 取值false就根本不会创建这个元素 --> <p v-show="false">隐藏</p>
<p v-show="show">显示</p> <p v-show="hidden">隐藏</p>
<p v-show="age >= 18">成年人</p> <p v-else>未成年</p> 请输入年龄:<input type="text" v-model="age">
<p v-show="score >= 90">优秀</p> <!-- 中间不能插入其他标签 --> <p v-else-if="score >= 60">及格</p> <!-- 中间不能插入其他标签 --> <p v-else="score < 60">不及格</p> 输入成绩:<input type="text" v-model="score"> </div>
|
v-if 逻辑判断(操作DOM)
功能:根据true/false切换元素的显示状态
v-if是操作DOM所以跟消耗资源所以,频繁切换使用v-show,反之v-if
v-else 和 v-else-if 注意点:
- 不能单独出现
- v-if和v-else中间不能出现其他标签内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div id="app"> <p v-if="true">显示</p> <!-- 取值false就根本不会创建这个元素 --> <p v-if="false">隐藏</p>
<p v-if="show">显示</p> <p v-if="hidden">隐藏</p>
<p v-if="age >= 18">成年人</p> <p v-else>未成年</p> 请输入年龄:<input type="text" v-model="age">
<p v-if="score >= 90">优秀</p> <!-- 中间不能插入其他标签 --> <p v-else-if="score >= 60">及格</p> <!-- 中间不能插入其他标签 --> <p v-else="score < 60">不及格</p> 输入成绩:<input type="text" v-model="score"> </div>
|
v-for 根据数据生成列表结构
功能:根据数据生成列表结构
可以遍历:Array | Object | number | string | Iterable
index:索引号(从0开始)
item:每一项
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
| <div id="app"> <!-- 数组 --> <ul> <li v-for="item in arr">数组:{{item}}</li> </ul> <ul> <li v-for="(item,index) in arr">数组:{{index+1}} {{item}}</li> </ul> <!-- 对象 --> <ul> <li v-for="item in obj">对象:{{item}}</li> </ul> <ul> <li v-for="(val,key) in obj">对象:{{key}}:{{val}}</li> </ul> <!-- 数组对象 --> <ul> <li v-for="item in arrObj">数组对象:{{item.name}}</li> </ul> <!-- 字符串 --> <ul> <li v-for="item in 'abc'">字符串:{{item}}</li> </ul> <!-- 数字 --> <ul> <li v-for="item in 3">{{item}}</li> </ul> </div>
|
v-on 事件监听(简写 @)
功能:为元素绑定事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <div id="app"> <!-- 不能直接写函数 --> <!-- <button v-on:click="alert('Hello Vue')">按钮</button> -->
<button v-on:click="fn">v-on指令</button> <!-- 简写:@ --> <button @click="fn">@简写</button><br> <!-- 可以加(),也可以不加 --> <button @click="fn()">可加 | 可不加 ()</button> <!-- 加(),可以传递参数 --> <button @click="fnx('加()可以传递参数')">加 () 可传参</button><br> <!-- 获取原生事件对象 --> <button @click=fnEven($event)>获取原生事件对象</button> <!-- 获取data里的数据 --> <button @click="fnData">获取data里的数据</button><br>
<button @click="fn1">使用fn1(){}</button> <button @click="fn2">使用fn2:function(){}</button><br>
<!-- 常用事件修饰符 --> <!-- enter按键事件 --> 按enter触发事件:<input type="text" @keyup.enter="fnKeyup" v-model="data"> 按对应键值触发事件:<input type="text" @keyup.13="fnKeyup" v-model="data"><br> </div>
|
v-on 修饰符
v-on修饰符:
在事件中有很多东西需要处理,比如:事件冒泡,事件捕获,阻止默认行为等。
在Vue中可以用过修饰符来处理。
v-on常见修饰符:
.once 只触发一次回调函数
.prevent 阻止事件默认行为,调用 event.preventDefault()
.stop 阻止事件冒泡,调用event.stopPropagation()
.self 只当事件是从侦听器绑定当元素本身触发时才触发回调
.capture 添加事件侦听器时使用 capture 模式
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
| <div id="app"> <!-- 默认情况下,事件的回调函数被触发,就可以反复执行, --> <button @click="fn">反复执行</button> <button @click.once="fn">只执行一次</button>
<!-- a标签有默认行为会进行跳转 --> <a href="https://kzero.vip" @click="fn">a标签有默认行为</a> <!-- 使用.prevent阻止默认行为 --> <a href="https://kzero.vip" @click.prevent="fn">阻止a标签默认行为</a>
<!-- 默认情况下,嵌套元素中如果监听了相同的事件,那么会触发事件冒泡 --> <!-- 事件冒泡:会一层一层向外触发到最顶层 --> <div class="grandpa" @click="grandpa"> <div class="father" @click.stop="father"> <div class="son" @click="son"></div> </div> </div>
<div class="grandpa" @click="grandpa"> <!-- .self 只有当前元素触发事件才执行回调函数 --> <div class="father" @click.self="father"> <div class="son" @click="son"></div> </div> </div>
<!-- 默认情况下是事件冒泡,如果想变成事件捕获,那么就需要使用.capture --> <!-- 事件捕获:会一层一层向内触发到最里层 --> <div class="grandpa" @click="grandpa"> <div class="father" @click.capture="father"> <div class="son" @click="son"></div> </div> </div> </div>
|
v-bind 绑定属性(简写:)
功能:为元素绑定属性
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
| <div id="app"> <img v-bind:src="imgUrl" v-bind:title="imgTitle"> <!-- 简写 : --> <img :src="imgUrl" :title="imgTitle">
<br> <button @click="active">按键聚焦内容</button>
<!-- 绑定属性类名 --> <!-- 使用类名 --> <p :class="['color','bold','border']">绑定v-bind使用类名</p> <!-- 使用属性三元运算符 --> <p :class="flag? 'border': ''">使用三元运算符</p> <p :class="{ 'border': flag }">内容1</p> <p :class="['color',flag?'border':'','bold']">内容2</p> <p :class="['color',{'border':flag},'bold']">内容3</p> <!-- 使用data里对象 --> <p :class="obj">使用data里对象</p>
<!-- 使用表达式 --> <input type="text" :value="age + 1"></input>
<!-- 绑定属性样式 --> <!-- 绑定属性样式的值,要用引号引起来 --> <p :style="{color: 'deeppink', 'font-size': '20px'}">绑定样式</p> <!-- 绑定属性样式名带 - ,要用引号引起来 --> <p :style="{color:'deeppink', 'font-size':'50px'}">绑定样式</p> <!-- 绑定属性样式名 使用对象 --> <p :style="styleObj1">绑定样式</p> <!-- 绑定属性样式名 使用多对象 --> <p :style="[styleObj1,styleObj2]">绑定样式</p> </div>
|
v-model 数据双向绑定
功能:便捷的设置和获取表单元素的值
只支持:input、textarea、select元素
1 2 3 4 5 6 7
| <div id="app"> <p> {{data}} </p> <input type="text" v-model="data"><br><br> <textarea name="" id="" cols="30" rows="10" v-model="data"></textarea> </div>
|
v-once 只渲染一次
功能:让当前元素只渲染一次
1 2 3 4
| <div id="app"> <p v-once>原始数据:{{msg}}</p> <p>当前数据:{{msg}}</p> </div>
|
v-cloak 体验感优化
功能:解决渲染之前显示模版内容,让用户看到模版内的内容
Vue数据绑定过程:
先将未绑定数据界面展示给用户
在根据模型中数据和控制的区域,生成绑定数据之后的html
最后将绑定数据之后的html渲染到界面上
正是在最终的html被生成渲染之前会先显示模版内容
所以如果用户网速比较慢或者网页性能比较差,那么用户会看到模版内的内容
如何解决:
利用v-cloak,配合样式:[v-cloak] {display: none} 先隐藏未渲染的界面
等到生成html渲染之后在重新显示
1 2 3
| <div id="app" > <p v-cloak>{{msg}}</p> </div>
|
自定义指令
自定义指令:在Vue中除了可以使用Vue内置的一些指令外,还可以自定义指令
自定义指令时一定要明确指令的业务逻辑更适合在哪个阶段执行
例如:指令业务逻辑代码中没有用拿到元素事件,那么可以在bind阶段执行
例如:指令业务逻辑代码中用到了元素事件,那么就需要inserted阶段执行
注意:使用是需要加上v-,而在自定了时不需要加上v-
directive方法接收两个参数
第一个参数是接收指令的名称
第二个参数是接收对象
注意:
在自定义指令的适合,在指定指令名称的适合,不需要写v-
指令可以在不同的生命周期阶段执行
bind:指令被绑定到元素上的时候执行
inserted:绑定指令的元素被添加到父元素上的时候调用
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
| <div id="app"> <p v-color>自定义指令</p> <p v-color=" 'blue' ">自定义指令</p> <input type="text"> <input type="text" value="使用自定义属性聚焦" v-focus> </div> <script> Vue.directive('color', { bind: function (el, obj) { el.style.color = 'deeppink'; el.style.color = obj.value; } }); Vue.directive('focus', { inserted: function (el) { el.focus(); } }) var app = new Vue({ el: '#app', data: { curColor: 'green', } }) </script>
|