语法
v-once
插值只渲染一次
<div>
<!-- msg可以改变 -->
<span class="text">this is a dynamic sentence:{{msg}}</span>
<!-- msg值在第一次选然后就不会改变了 -->
<span v-once class="text">this is a static sentence:{{msg}}</span>
<!-- 双向绑定 -->
<input type="text" v-model="msg" placeholder="请输入somthing">
</div>
动态渲染html样式
你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值
v-html
<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
mustache语法与attribute
Mustache 语法不能作为属性值,但可以将属性与v-bind:结合后,将变量世界作为属性值,就可以形成动态绑定 -
<span v-html="styles">{{styles}}</span>
javascript表达式
表达式可以直接写在mustache语法中。例如:{{ number + 1 }}
模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。
动态参数
可以用来绑定属性,也可用用来绑定事件
这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。
<a v-bind:[attributeName]="url"> ... </a>
动态参数预期会求出一个字符串,异常情况下值为 null。这个特殊的 null 值可以被显性地用于移除绑定。任何其它非字符串类型的值都将会触发一个警告。
修饰符
修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。
例如:.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()
<form v-on:submit.prevent="onSubmit">...</form>
Class与Style的绑定
对象语法
<!-- 普通命名方式不用再次加引号,但这样的'text-a'要使用引号包裹 -->
<!-- 对象中可以只放一个键值对,也可以有多个键值对 -->
<!-- 当isShow的值是true时这个class名就会显示,反之不显示 -->
<!-- 因为这时动态绑定,所以要使用v-bind: -->
<span v-bind:class="{class1:isShow,'text-live':isShow}">123s</span>
也可以将动态绑定的值换成一个变量,如下:(只要变量中value为true就会显示对应的class名了)
<span v-bind:class="checkClass">123s</span>
checkClass:{class1:true,'text-live':true}
数组语法
动态绑定一个数组,数组中元素(变量)的值是什么,那么class就会后对应的class名,如果元素(变量)为空则不会添加这个class名
<span v-bind:class="[a,b,c]">123s</span>
对象语法
可以通过以下方式动态绑定内联样式。当然直接绑定一个对象会更好。
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
activeColor: 'red',
fontSize: 30
}
自动添加前缀
当 v-bind:style 使用需要添加浏览器引擎前缀的 CSS property 时,如 transform,Vue.js 会自动侦测并添加相应的前缀。
条件渲染
v-if
v-else
v-else-if
v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。
条件为true时显示,反之不显示。这些元素一般用于兄弟元素之间
<div v-if="msg === 'A'">
A
</div>
<div v-else-if="msg === 'B'">
B
</div>
<div v-else-if="msg === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>
<input type="text" v-model="msg">
用key管理可复用的元素
用key管理可复用(key是一个标记,这个标记最好是唯一的,能提高效率,判断能否复用这个标记)
v-show
根据条件展示元素的选项是 v-show 指令。使用方法和v-if类似,值为true时显示,反之隐藏
<h1 v-show="ok">Hello!</h1>
v-show是通过display样式实现显示和隐藏,v-if是通过创建和删除节点来实现显示和隐藏。
这也就是说v-if是条件为true时才会渲染,v-show总是会被渲染。
所以v-show开销小,常用于频繁切换的节点。v-if则适合用于隐藏广告等。
注意,v-show 不支持 元素,也不支持 v-else。
v-if和v-for不建议同时使用,因为v-for有更高的优先级。
注意我们不推荐在同一元素上使用 v-if 和 v-for。 遍历的对象可以是数组也可以是对象,一般都要和key连用。 你也可以用 of 替代 in 作为分隔符,因为它更接近 JavaScript 迭代器的语法: 下面遍历对象: 在遍历对象时,会按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下都一致。 不要使用对象或数组之类的非基本类型值作为 v-for 的 key。请用字符串或数值类型的值。
变更方法,顾名思义,会变更调用了这些方法的原始数组。 filter()、concat() 和 slice() 有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法: .stop —阻止点击事件冒泡 使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。
.enter keyCode 的事件用法已经被废弃了并可能不会被最新的浏览器支持。
注意:在 Mac 系统键盘上,meta 对应 command 键 (⌘)。在 Windows 系统键盘 meta 对应 Windows 徽标键 (⊞)。在 Sun 操作系统键盘上,meta 对应实心宝石键 (◆)。在其他特定键盘上,尤其在 MIT 和 Lisp 机器的键盘、以及其后继产品,比如 Knight 键盘、space-cadet 键盘,meta 被标记为“META”。在 Symbolics 键盘上,meta 被标记为“META”或者“Meta”。 .exact 修饰符允许你控制由精确的系统修饰符组合触发的事件。 v-model=”checked”在这里代替了checked属性 可以通过v-for动态渲染option选项 如果 v-model 表达式的初始值未能匹配任何选项,v-if 和v-for
v-for与v-if一同使用
当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你只想为部分项渲染节点时,这种优先级的机制会十分有用,列表渲染
v-for的使用
v-for 还支持一个可选的第二个参数,即当前项的索引,例如:v-for=”(item ,index)in list”
下面遍历的是数组:<ul >
<li v-for="item in list" :key="item">{{item}}</li>
</ul>
<div v-for="item of items"></div>
value:是值,key是键,index:是索引<ul >
<li v-for="(value,key,index) in list" :key="item">{{key}}:{{value}}:{{index}}</li>
</ul>
v-for使用一个范围值
<div>
<span v-for="n in 10">{{ n }} </span>
</div>
//返回1~10
变更方法
Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。
包括:
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
替换数组
它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组替换旧数组:
例子:手动添加或删除一个节点
<div id="todo-list-example">
<form v-on:submit.prevent="addNewTodo">
<label for="new-todo">Add a todo</label>
<input
v-model="newTodoText"
id="new-todo"
placeholder="E.g. Feed the cat"
>
<button>Add</button>
</form>
<ul>
<li
is="todo-item"
v-for="(todo, index) in todos"
v-bind:key="todo.id"
v-bind:title="todo.title"
v-on:remove="todos.splice(index, 1)"
></li>
</ul>
</div>
Vue.component('todo-item', {
template: '\
<li>\
{{ title }}\
<button v-on:click="$emit(\'remove\')">Remove</button>\
</li>\
',
props: ['title']
})
new Vue({
el: '#todo-list-example',
data: {
newTodoText: '',
todos: [
{
id: 1,
title: 'Do the dishes',
},
{
id: 2,
title: 'Take out the trash',
},
{
id: 3,
title: 'Mow the lawn'
}
],
nextTodoId: 4
},
methods: {
addNewTodo: function () {
this.todos.push({
id: this.nextTodoId++,
title: this.newTodoText
})
this.newTodoText = ''
}
}
})
事件处理
方法绑定,并传参
<div id="example-3">
<button v-on:click="say('hi')">Say hi</button>
<button v-on:click="say('what')">Say what</button>
</div>
new Vue({
el: '#example-3',
methods: {
say: function (message) {
alert(message)
}
}
})
<button v-on:click="warn('Form cannot be submitted yet.', $event)">
Submit
</button>
// ...
methods: {
warn: function (message, event) {
// 现在我们可以访问原生事件对象
if (event) {
event.preventDefault()
}
alert(message)
}
}
事件修饰符
v-on的修饰符
.prevent —阻止默认事件
.capture —在捕获阶段触发事件
.self —只会触发自己范围内的事件,不包含子元素
.once —只执行一次,如果我们在@click事件上添加.once修饰符,只要点击按钮只会执行一次。
.passive —是不拦截默认事件
不要把 .passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive 会告诉浏览器你不想阻止事件的默认行为。<!-- 阻止单击事件继续传播 -->
//阻止冒泡
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
//阻止默认事件
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
按键修饰符
.tab
.delete(捕获“删除”和“退格”键)
.esc
.space
.up
.down
.left
.right
有一些按键 (.esc 以及所有的方向键) 在 IE9 中有不同的 key 值, 如果你想支持 IE9,这些内置的别名应该是首选。
你还可以通过全局 config.keyCodes 对象自定义按键修饰符别名:// 可以使用 `v-on:keyup.f1`
Vue.config.keyCodes.f1 = 112
keyup.enter
<!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
<input v-on:keyup.enter="submit">
按键码
<input v-on:keyup.13="submit">
系统修饰键
<!-- Alt + C -->
<input v-on:keyup.alt.67="clear">
<!-- Ctrl + Click(点击) -->
<div v-on:click.ctrl="doSomething">Do something</div>
.exact修饰符
<!-- 即使 Alt 或 Shift 被一同按下时也会触发 -->
<button v-on:click.ctrl="onClick">A</button>
<!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button v-on:click.ctrl.exact="onCtrlClick">A</button>
<!-- 没有任何系统修饰符被按下的时候才触发 -->
<button v-on:click.exact="onClick">A</button>
鼠标按钮修饰符
表单
你可以用 v-model 指令在表单 、) 并不会生效,应用 v-model 来代替(即改变他的value值)。
复选框
<!-- id属性用来匹配label标签 -->
<input type="checkbox" v-model="checked" id="box">
<!-- for属性用匹配input标签 -->
<label for="box">{{checked}}</label>
、多个复选框绑定同一个数组
<!-- 当checked的值为true(选中时)时,v-model会将value的值保存到checkedNames中 -->
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<br>
<span>Checked names: {{ checkedNames }}</span>
单选框
<!-- 当selected绑定了v-model后,会在每一次选择完毕时将选项的value值给v-model绑定的变量 -->
//再给selected标签添加一个multiple 属性后就可以多选了,通过按下ctrl键后就可以选择多个
<select name="" v-model="selected" id="">
<!-- disabled选项被设置为不可选 -->
<option value="请选择" disabled>hh</option>
<option value="11">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<span>Selected: {{ selected }}</span>