Vue的基本指令使用附上Vue过滤器的使用
在Vue中,基本上的指令在调用的时候,都是以 【 v- 】 开头的
v-text
更新DOM元素的内容,比之插值表达式用法不同的一点是,v-text中的是直接更新到元素中去的,相当于直接写入,如果原来的元素中有内容,那原来元素中的内容会被覆盖
<span v-text="msg"></span>
<!-- 和下面的一样 -->
<span>{{msg}}</span>
<!-- 和下面的就不一样 -->
<!-->这里面的span标签内是有一些原始值的,如下面的 ‘Vue的使用’<-->
<span>Vue的使用 ----- {{msg}}</span>
v-html
这个不用讲应该也很清楚,和v-text不同的点就是v-text是插入纯文本内容,就是有什么显示什么,而v-html 是会读取出其中的html标签,并在DOM树中生效
<div v-html="html"></div>
<!-- 显示的内容不包含html标签或其他与heml文件相关的内容 -->
<span v-text="msg"></span>
<!-- 直接显示出全部的文本 -->
v-show 和 v-if
<h1 v-show="ok">Hello!</h1>
<h1 v-if="is">Hello!</h1>
v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
注:
当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。
v-else和v-else-if
和js中的if else 以及else if使用方法很类似,这里就不解释了
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>
v-bind
v-bind 可简写成冒号 ”:“,单向绑定 ,
<!-- 绑定一个 attribute -->
<img v-bind:src="imageSrc">
<!-- 动态 attribute 名 (2.6.0+) -->
<button v-bind:[key]="value"></button>
<!-- 缩写 -->
<img :src="imageSrc">
<!-- 动态 attribute 名缩写 (2.6.0+) -->
<button :[key]="value"></button>
<!-- 内联字符串拼接 -->
<img :src="'/path/to/images/' + fileName">
<!-- class 绑定 -->
<div :class="{ red: isRed }"></div>
<div :class="[classA, classB]"></div>
<div :class="[classA, { classB: isB, classC: isC }]">
<!-- style 绑定 -->
<div :style="{ fontSize: size + 'px' }"></div>
<div :style="[styleObjectA, styleObjectB]"></div>
<!-- 绑定一个全是 attribute 的对象 -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>
<!-- 通过 prop 修饰符绑定 DOM attribute -->
<div v-bind:text-content.prop="text"></div>
<!-- prop 绑定。“prop”必须在 my-component 中声明。-->
<my-component :prop="someThing"></my-component>
<!-- 通过 $props 将父组件的 props 一起传给子组件 -->
<child-component v-bind="$props"></child-component>
<!-- XLink -->
<svg><a :xlink:special="foo"></a></svg>
v-model:
双向绑定 只能应用于表单元素
v-model双向数据绑定实现原理是什么?
v-model 实现双向数据绑定的原理底层就是用到了 object.defineproperty
Object.defineProperty(obj, prop, descriptor)
obj
要定义属性的对象。
prop
要定义或修改的属性的名称或 Symbol 。
descriptor
要定义或修改的属性描述符。
有三个修饰符:
.lazy - 取代 input 监听 change 事件
.number - 输入字符串转为有效的数字
.trim - 输入首尾空格过滤
<div id="add">
<!-- 普通文本输入框和p标签实现双向绑定 -->
<input v-model="message" placeholder="edit me">
<br>
文本同时输出: <input v-model="message" placeholder="edit me">
<p>文本输出: {{ message }}</p>
</div>
v-on
可简写成 @ 符号 属于事件绑定,
常见用法:
1. @click 点击事件 v-on:mouseover 输入移入事件 等鼠标监听事件
2. 2.@keyup 监听键盘事件(监听回车键 @keyup.enter = ‘方法名’)
自定义键盘码方法:Vue.config.keyCodes.按键名 = 按键名对应的键盘码
修饰符:
.stop - 调用 event.stopPropagation()。
.prevent - 调用 event.preventDefault()。
.capture - 添加事件侦听器时使用 capture 模式。
.self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调。
.left - (2.2.0) 只当点击鼠标左键时触发。
.right - (2.2.0) 只当点击鼠标右键时触发。
.middle - (2.2.0) 只当点击鼠标中键时触发。
.passive - (2.3.0) 以 { passive: true } 模式添加侦听器
<!-- 方法处理器 -->
<button v-on:click="doThis"></button>
<!-- 动态事件 (2.6.0+) -->
<button v-on:[event]="doThis"></button>
<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>
<!-- 缩写 -->
<button @click="doThis"></button>
<!-- 动态事件缩写 (2.6.0+) -->
<button @[event]="doThis"></button>
<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>
<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>
<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>
<!-- 串联修饰符 -->
<button @click.stop.prevent="doThis"></button>
<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">
<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">
<!-- 点击回调只会触发一次 -->
<button v-on:click.once="doThis"></button>
<!-- 对象语法 (2.4.0+) -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>
v-cloak
这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。
<style>
[v-cloak] {
display: none;
}
</style>
<div v-cloak>
{{ message }}
</div>
v-for
可用于在DOM中遍历数组或者是对象
<div v-for="item in items">
{{ item.text }}
</div>
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, name, index) in object"></div>
<!--> 遍历数字 <p v-for = "num in 10"> 这是第{{ num }}次循环</p> 注意: 这里的num是从1开始遍历的<-->
v-for 的默认行为会尝试原地修改元素而不是移动它们。要强制其重新排序元素,你需要用特殊 attribute key 来提供一个排序提示:
<div v-for="item in items" :key="item.id">
{{ item.text }}
</div>
v-pre
跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。说白了就是对插值表达式等不进行编译,在网页中进行原样显示
<span v-pre>{{ this will not be compiled }}</span>
v-slot
可放置在函数参数位置的 JavaScript 表达式 (在支持的环境下可使用解构)。可选,即只需要在为插槽传入 prop 的时候使用。
<!-- 具名插槽 -->
<base-layout>
<template v-slot:header>
Header content
</template>
Default slot content
<template v-slot:footer>
Footer content
</template>
</base-layout>
<!-- 接收 prop 的具名插槽 -->
<infinite-scroll>
<template v-slot:item="slotProps">
<div class="item">
{{ slotProps.item.text }}
</div>
</template>
</infinite-scroll>
<!-- 接收 prop 的默认插槽,使用了解构 -->
<mouse-position v-slot="{ x, y }">
Mouse position: {{ x }}, {{ y }}
</mouse-position>
v-once
只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
<!-- 单个元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 有子元素 -->
<div v-once>
<h1>comment</h1>
<p>{{msg}}</p>
</div>
<!-- 组件 -->
<my-component v-once :comment="msg"></my-component>
<!-- `v-for` 指令-->
<ul>
<li v-for="i in list" v-once>{{i}}</li>
</ul>
====================================================================
**
定义全局自定义指令
**
Vue.directive('参数1’,‘参数2’)//全局指令
directives:{ 对象体(写入相关的操作函数) } //局部指令,比全局指令多一个 S 后缀,在Vue这个对象里面定义和data,methods等同级。
参数1:指令的名称,注意,在定义的时候,指令的名称前面,不需要加 v- 前缀
参数2:是一个对象{ },在这个对象上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作。有三个比较主要的方法:
1、 bind:function(element,binding){} //当指令绑定到元素上的时候,会立即执行这个bind函数,只执行一次
*注: 和样式style相关的操作,一般都可以在bind中定义执行
2、 inserted:function(element,binding){ el.参数1()} //inserted 表示元素插入到DOM中的时候,
会执行inserted函数 【只触发一次】
*注: 和JS行为相关的操作,最好在inserted中去执行防止JS不生效
3、 update:function(element,binding){} //当VNods更新的时候,会执行update,可能会触发多次
注意:element是一个原生的HTML对象,不可更改,是一个必要的形参,binding也是形参,是作为一个对HTML对象的相关操作的形参,如对input的value进行操作,但是binding是一个可选参数,如果不需要更改,可以不写
✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦✦
过滤器的基本使用语法
< div > {{参数 | 过滤器名(形参)}}< /div > //这里面的形参可以有多个
基本语法(全局过滤器)
Vue.filter('过滤器名‘,处理函数方法(形参){ 方法体})
//这里的形参第一个参数为div中的参数,第二个为过滤器传过来的值
基本语法(局部过滤器)
filters:{方法体(可以写入对应的方法函数)}
//局部过滤器,同自定义指令类似,这里的局部过滤器也是会多了一个S后缀,同样的和data等对象同级定义
注:
过滤器可以多次调用 如:
< div> {{参数 | 过滤器名1(形参)| 过滤器名2(形参)}}< /div>
//这里面的形参可多个
作为学习笔记使用,如有错误,欢迎大家指正修改,