<h2 v-text="message+'!'">h2>
message为data对象中的键值对,不能解析标签,会替换标签内的内容
<h2>深圳{{ message+"!" }}h2>
插值表达式可以进行字符串拼接,只是内容的占位符,不会覆盖原内容
差值表达式内支持js表达式的运算甚至数组字符串方法操作
只能用在元素的内容节点,不能用在元素的属性节点
除了可以显示表达式,还是可以显示Vue实例上面的属性
<h2 v-html="message+'!'">h2>
message为data对象中的键值对
与v-text相似但可以解析标签
为元素绑定事件
<div id="app">
<input type="button" value="事件绑定" v-on:click="dolt">
<input type="button" value="事件绑定" @click="dolt">
<input type="button" value="事件绑定" @click="dolt1($event,p2)">
<input type="button" value="事件绑定" @click="a='我是新的值'">
<input type="button" value="事件绑定" @keyup.enter="dolt">
div>
var app = new Vue({
el:'#app',
methods:{
dolt:function(){
//code
}
dolt1:function(p1,p2){
//code
}
}
})
使用v-on进行绑定或简写成@ 事件执行函数则在Vue实例的methods中
当methods中的函数需要对data中的变量进行修改时,this.变量就能读取
可以携带参数,在调用的函数名后传入形参
也可以在事件帮i的那个当中写简单语句
事件对象
当v-on绑定事件需要使用事件对象时
当调用函数没有传参,那可以在函数内部直接使用e事件对象(与事件监听相同)
当调用函数需要传参时,则需要在传参时使用$event
传入并在函数内部进行接收
事件修饰符
事件修饰符 | 说明 |
---|---|
.prevent | 阻止默认行为 |
.stop | 阻止事件冒泡 |
.capture | 捕获阶段处理事件函数 |
.once | 只触发一次 |
.self | 只会触发自己范围内的事件,不会包含子元素 |
.native | 监听组件根元素的原生事件 |
.left | 只有点击鼠标左键触发 |
.right | 只有点击鼠标右键触发 |
.middle | 只有点击鼠标中键触发 |
.passive | 以 { passive: true } 模式添加侦听器 |
` . { keyCode | keyAlias}` |
键盘事件修饰符
事件修饰符 | 说明 |
---|---|
.enter | 回车键 |
.tab | 制表键 |
.delete | 含delete和backspace键 |
.esc | 返回键 |
.space | 空格键 |
.up | 向上键 |
.down | 向下键 |
.left | 向左键 |
.right | 向右键 |
鼠标事件修饰符
事件修饰符 | 说明 |
---|---|
.left | 鼠标左键 |
.middle | 鼠标中间滚轮 |
.right | 鼠标右键 |
修饰键
可以用修饰符开启鼠标或键盘事件监听,使在按键按下时发生响应
事件修饰键 | 说明 |
---|---|
.ctrl | ctrl键 |
.alt | alt键 |
.shift | shift键 |
.meta | mac 的 command 键 (⌘) |
.exact | 控制由精确的系统修饰符组合触发事件(有且仅有加入的修饰符才有效) |
<button @click.ctrl.alt.exact= "fn1">
绑定多个事件
<button v-on:click="fn1(),fn2()">按钮button>
<button v-on:click="fn1();fn2()">按钮button>
<button v-on="{click: clickChange, mouseover: mouseChange}">按钮button>
主动触发click事件
// scroll 标签的ref 需要绑定click
this.$refs.scroll.$trigger("click")
根据表达式的真假,切换元素的显示和隐藏
<div id="app">
<img src="地址" v-show="true">
<img src="地址" v-show="isShow">
<img src="地址" v-show="age>18">
div>
v-show后可以接布尔值 data中的变量 表达式等等
根据表达式的真假,切换元素的显示和隐藏(操纵dom元素)
v-if后可以接布尔值 data中的变量 表达式等等
与v-show类似,区别为v-show是display显示与隐藏 none或非none
v-if则直接在dom文档中将元素注释,因此需要使用更多内存
v-if 引起页面的reflow(重排)v-show 引起页面的redraw(重绘)v-show性能消耗更小
充当v-if的else-if,可以连续使用
必须配合v-if一起使用,否则不会被识别
当前面 v-if,v-else-if均不符合条件时执行,所以v-else后不需跟判断条件
设置元素的属性(比如:src,title,class)
<div id="app">
<img v-bind:src="imgSrc">
<img v-bind:tittle="imgtitle+'!!!!'">
<img v-bind:style="{height:'100px'}">
<img v-bind:class="isActive?'active':''">
<img v-bind:class="{active:isActive}">
div>
<div id="app">
<img :src="imgSrc">
<img :tittle="imgtitle+'!!!!'">
<img :style="{height:'100px'}">
<img :class="isActive?'active':''">
<img :class="{active:isActive}">
div>
var app = new Vue({
el:"#app",
data:{
imgSrc:"图片地址",
imgTitle:"黑马程序员",
isActive:false
}
})
设置动态属性
<a :[myHref]="href">百度a>
export default {
data () {
return {
myHref: 'href',
href: 'http://www.baidu.com'
}
}
}
class绑定对象
<div :class="{'active': isActive, 'error': hasError}">div>
export default {
data () {
return {
isActive: true,
hasError: false
}
}
}
对应为true则添加类 为false则不添加
class绑定多个动态属性
<div :class="{'active': isActive, 'error': hasError}">div>
<div class="blue" :class="{'active': isActive}">div>
<div :class="[errorClass, baseClass]">div>
class数组结合三目
<div :class="[isActive? activeClass:errorClass]">div>
export default {
data () {
return {
isActive: true,
activeClass: 'active',
errorClass: 'error'
}
}
}
对应为true则添加类 为false则不添加
根据数据生成列表结构
<div id="app">
<ul>
<li v-for="(item,index) in arr" :title="item">
{{index}}{{item}}
li>
<li v-for="(item,index) in objArr">
{{index.name}}
li>
ul>
div>
var app = new Vue({
el:"#app",
data:{
arr:[1,2,3,4,5],
objArr:[
{name:"jack"},
{name:"rose"}
]
}
})
注:
将v-for标签循环生成,遍历多少次生成多少个
item为遍历的每个元素(如果数组中存的对象则item为整个对象),index为索引
使用v-for必须要配合:key使用,提升性能,防止列表状态紊乱
key的值只能是字符串或数字,且必须具有唯一性
建议把id作为key,使用index作为key没有意义(index会变动)
v-for可以遍历字符串 遍历生成字符串长度的结构 (‘abc’,生成3个结构且item分别为a,b,c)
v-for可以遍历整数 遍历生成数字大小的结构 (3,生成3个结构且item,index相同)
<template v-for="(item, index) in arr" :key="index">
<li v-if="item.checked">
<input type="checkbox">
li>
template>
获取和设置表单元素的值(双向数据绑定)
<div id="app">
<input type="text" v-model="message">
div>
const app =new Vue({
el:"#app",
data:{
message:"ccc"
}
})
通过v-model绑定后表单修改值会同步到data中,可以进行调用,data中值修改同样作用在表单中
与普通元素也能绑定但没意义
v-model修饰符
对用户输入的内容进行处理
事件修饰键 | 作用 |
---|---|
.number | 自动将用户输入的值转为数字类型 |
.trim | 自动过滤用户输入的首尾空格 |
.lazy | 在’change’时而非’input’时更新 |
与checkbox双向数据绑定
<ul>
<li v-for="(item, index) in arr" :key="index">
<input type="checkbox" v-model="item.checked">
li>
ul>
数据只绑定一次,后续数据修改不更新
<div v-once>{{ a }}</div>
跳过这个元素和他的子元素的编译过程 用来显示原始的Mustache标签
跳过大量没有指令的节点会加快编译速度
<span v-pre>{{ this will not be compiled }}</span>
页面中直接显示标签内的内容(不进行vue的编译)
{{ this will not be compiled }}
这个指令保持在元素上知道关联实例结束编译
和css规则一起使用时,这个指令可以隐藏未编译的Mustache标签直到实例准备结束
[v-cloak]{
display:none;
}
<div v-cloak>
{{ message }}
</div>
不会显示 直到编译结束
在每个vue组件中,可以在directives节点下声明私有自定义指令
<h1 v-s>hello vue</h1> //v-为命令前缀 本质上命令为s
<h1 v-s="'red'">hello vue1</h1>
//可以通过=后面进行命令函数的传参
//可以为变量,如果是字符串则需在嵌套单引号(v-bind)
new Vue({
directives:{
s:{
bind(el,binding,Vnode,oldVonde){
// 接收四个参数 第一个为当前指令所挂载的元素
// 第二个为当前指令的参数 为一个对象,包含了命令的信息,.value才是具体传入的值(指令的传参)
// 第三个为Vue 编译生成的虚拟节点 通过 .context可以获取到Vue实例
// 第四个为一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用
//code
}
}
}
}).$mount('#app')
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中,因为DOM节点插入是异步的)。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。
指令的值可能发生了改变,也可能没有。
但是可以通过比较更新前后的值来忽略不必要的模板更新。
先触发update再触发componentUpdated
componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:只调用一次,指令与元素解绑时调用。
注:
在自定义指令的钩子函数中不能通过访问this的形式来获取组件实例自身
只能通过传参中的Vnode虚拟节点下的context获取当前组件实例
directives: {
s: {
// bind函数只调用一次,当指令第一次绑定到元素时调用,当DOM更新时bind函数不会被触发
bind(el,binding,Vnode,oldVonde) {
el.style.color = binding.value
},
// update函数会在每次DOM更新时被调用
update(el,binding,Vnode,oldVonde) {
el.style.color = binding.value
},
inserted(el,binding,Vnode,oldVonde){ ... },
componentUpdated(el,binding,Vnode,oldVonde){ ... },
unbind(el,binding,Vnode,oldVonde){ ... },
}
}
当bind函数与update函数中的逻辑完全相同,则对象格式的自定义指令可以简写成函数格式
directives: {
//在insert和update时,会触发相同的业务逻辑
s(el,binding) {
el.style.color = binding.value
}
}
全局共享的自定义指令需要通过"Vue.directive()"继续声明
//参数1:字符串,用来表示全局自定义指令的名字
//参数2:对象,用来接收指令的参数值
Vue.directive('s', function(el,binding,Vnode,oldVonde) {
el.style.color = binding.value
})
Vue.directive('ani',{
inserted(el,binding,Vnode,oldVonde){
el.classList.add('ant')
}
})
此时用的为简写函数形式,也可以写成对象形式