点滴:绝不做 鸡肋 的努力
本文纲领:本文会详细介绍 vue 以下指令 及其 语法、用法,以及 指令之间的详细对比,涉及指令有:
- v-text,v-html,v-if,v-else,v-else-if,v-show,v-for,v-on,v-bind、v-model,v-pre,v-cloak,v-once
“Mustache”语法 (双大括号)
的文本插值,Mustache
标签将会被对应数据对象上属性的值替代。只要绑定的数据对象上属性发生了改变,插值处的内容都会更新。{{ message }}
是将数据解析成纯文本的,也就是说,就算message
中含有了 html 标签,它也是只看做纯文本的,不能输出真正的 html。 <div id="app">
<p>{{ message }}p>
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'asc
'
}
})
script>
v-text
与插值表达式相同的地方是,它也是将数据解析成纯文本(解释html标签可能导致xss攻击),但它与花括号的区别是使用v-text
在页面加载时不会显示{{}},解决了插值表达式闪烁问题,因为他是属性而不是插值表达式 <div id="app">
<p v-text="msg">这里的内容会被替换p>
div>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: "Hello! v-text
",
}
})
script>
{{ message }}
,然后再编译对应的数据 <div id="app">
<p v-text="msg">这里的内容会被替换p>
div>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: "Hello! v-html
",
}
})
script>
v-if
指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。 <div id="app">
<p v-if="true"> v-if 为 true 时显示p>
<p v-if="false"> v-if 为 false 时显示p>
div>
<script>
var vm = new Vue({
el: "#app",
data: {
true: true,
false: false,
}
})
script>
v-if
是“真正”的条件渲染,因为它会确保在切换过程中 条件块内的事件监听器 和 子组件 适当地被销毁和重建。v-if
是惰性的,如果初始渲染时条件为 假,那么就什么也不用做,直到第一次条件变为 真,才开始渲染条件块。v-if
通常用于以下两种情况:
<div id="app">
<div style="color:red">v-if的简单实用div>
<template>
<div v-if="type == 'A'">Adiv>
<div v-else-if="type=='B'">Bdiv>
<div v-else>Cdiv>
template>
<div>
<p>v-if的弹框切换p>
div>
<template v-if="loginType === 'username'">
<label>用户名:label>
<input placeholder="Enter your username" key="username-input">
template>
<template v-else>
<label>密码:label>
<input placeholder="Enter your email address" key="email-input">
template>
<button @click="changeloginType">切换状态button>
div>
<script>
var app = new Vue({
el: '#app',
data: {
type: 'C',
loginType: 'username'
},
methods: {
changeloginType() {
let self = this;
if (self.loginType == 'username') {
self.loginType = ''
} else {
self.loginType = 'username'
}
}
}
})
script>
v-else
并不像一个单独功能的指令,而是偏辅助功能的,而且 v-else
必须和 v-if
连用,否则会报错。 <div id="app">
<p v-if="msg1">The msg1 is truep>
<p v-else>The msg1 is falsep>
<input type="button" @click="button" value="Button"/>
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
msg1: true,
},
methods: {
button: function(){
this.msg1 = !this.msg1;
}
}
})
script>
v-else
相同,v-else-if
也必须和v-if
连用,其实道理很简单,类比 C语言的if
、else
、else if
,这里的v-else-if
也是用在v-if
和v-else
中间,实现多次判断 <div id="app">
<p v-if="10>20">v-if 赢了p>
<p v-else-if="10>5">v-else-if 赢了p>
<p v-else>好吧,v-else 赢了p>
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
})
script>
v-show
也是用来 控制元素是否显示 的,其功能与v-if
指令相似。 <div id="app">
<p v-show="msg">显示成功p>
<input type="button" @click="show" value="Do you want to hide it?" />
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
msg: true,
},
methods: {
show: function(){
this.msg = !this.msg;
}
}
})
script>
v-show
与v-if
有什么 联系 呢?
v-show
与v-if
都是通过 动态地操作DOM 来实现显示与隐藏的v-show
与v-if
的 区别 是什么呢?
v-if
是动态地向DOM树内动态地添加或删除DOM元素,如果v-if
的值是false
就会在DOM中删除,相当于visibility:hidden;
,如果是true
把元素克隆到相应的DOM树上去,支持加在
标签上;而v-show
是动态地设置DOM元素的display
属性,而不会删除DOM元素,是display:none;
,不支持加在
标签上。v-if
在切换时会有一个局部编译/卸载的过程,在切换时适当地销毁和重建内部的事件监听 和 子组件,因为v-if
可能是数据绑定或者子组件;而v-show
只是简单地进行 CSS 属性的切换。v-if
是真真正正的条件渲染,但它是惰性的,如果初始条件为假,则什么也不用做,只有在第一次条件变为真时才开始局部编译,编译会被缓存,之后等到再切换时再进行局部卸载;而v-show
不管其值是否为真,都进行编译,然后编译被缓存,而且DOM元素也保留。v-if
有着更高的切换消耗,v-show
有着更高的初识渲染消耗v-if
来渲染更加合适v-show
更加合适,实现一次渲染,多次切换v-show
;如果是要么显示要么隐藏的情况下,那么v-if
更加合理,因为借助v-if
的惰性,如果一开始它的值即为false,那么甚至都不需要创建DOM,如果其值为true,则效果与v-show
完全一样。display:none
与 visibility:hidden
的区别:
display:none
是彻底消失,不在文档流中占位,浏览器也不会解析该元素;visibility:hidden
可以理解为透明度为0的效果,它只是视觉上的消失,在文档流中是占位的,浏览器也会解析该元素。visibility:hidden
要比display:none
性能更好,用display
切换时,页面会产生 回流 (当页面中的一部分元素需要改变规模尺寸、布局、显示隐藏等,页面需要 重新构建,即为回流。所有页面第一次加载时需要产生一次回流),而用visibility
切换时不会产生回流。display:none
,则无法通过设置v-if
或者v-show
来让元素显示,因为切换时只会修改元素 element.style 的“display”属性为“none”或者“block”,并不会覆盖或者修改已经存在的CSS属性v-for
循环普通数组: <div id="app">
<p v-for="value in list">{{ value }}p>
<p v-for="(value,i) in list">索引:{{ i }} => 值:{{ value }}p>
div>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
list: [1,2,3,4,5]
}
})
script>
v-for
循环对象数组: <div id="app">
<p v-for="(value,i) in list">
索引:{{ i }} —— Id:{{ value.id }} —— Name:{{ value.name }}
p>
div>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
list: [
{ id: 1, name: 'first' },
{ id: 2, name: 'second' },
{ id: 3, name: 'third' },
]
}
})
script>
v-for
循环对象: <div id="app">
<p v-for="(value,key,i) in student">
索引:{{ i }} —— 键:{{ key }} —— 值:{{ value }}
p>
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
student: {
id: 0,
name: 'Tom',
gender: '男'
}
}
})
script>
v-for
迭代数字: <div id="app">
<p v-for="count in 10">这是第{{ count }}次循环p>
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
})
script>
v-for
中的key
属性的使用: <div id="app">
<div>
<label>Id:
<input type="text" v-model="id" />
label>
<label>Name:
<input type="text" v-model="name" />
label>
<input type="button" @click="add" value="添加" />
div>
<p v-for="item in list" :key='item.id'>
<input type="checkbox" />{{ item.id }} --- {{ item.name }}
p>
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
id: '',
name: '',
list: [
{ id: 1, name: '李斯' },
{ id: 2, name: '嬴政' },
{ id: 3, name: '赵高' },
]
},
methods: {
add(){
this.list.unshift({ id: this.id, name: this.name });
}
}
})
script>
<div id="app">
<input type="button" v-on:click="click" value="点此弹出语句"/>
div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
methods: {
click(){
alert('Hello Vue!');
}
}
})
script>
v-on
可简写为@
v-bind
指令主要用于 绑定属性,可以动态地绑定一个或多个属性,比如 class属性、style属性、value属性、href属性,只要是属性,就可以用v-bind
进行绑定。它的语法是:v-bind:属性名 = "变量名"
,规定v-bind
可以缩写为:
,如语法可以缩写为:属性名 = "变量名"
。v-bind:class
一个对象,以动态地切换 class属性,如: <div v-bind:class="{ active: isActive }">div>
<script>
var vm = new Vue({
el: '#app',
data: {
isActive: true //此时可以展示active
}
})
script>
<div class="static" v-bind:class="{ A:isA, 'B': isB }">div>
<script>
var vm = new Vue({
el: '#app',
data: {
isA: true,
isB: false,
}
})
//结果渲染为:
script>
<div v-bind:class="classObject">div>
<script>
var vm = new Vue({
el: '#app',
data: {
classObject{
isA: true,
isB: false,
}
}
})
script>
<div v-bind:class="classObject">div>
<script>
var vm = new Vue({
el: '#app',
data: {
isA: true,
isB: false,
},
computed: {
classObject: function () {
return {
active: this.isA && !this.isB,
statiq: this.isB && this.isB.type === 'fatal'
}
}
}
})
script>
v-bind:class
,以应用一个 class列表: <div id="app">
<div v-bind:class="[activeClass, errorClass]">div>
div>
<script>
var vm = new Vue({
el: '#app',
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
})
//渲染为
script>
v-bind
指令详解请参考:详解v-bind指令 以及 vue.js中的v-bind语法的使用详解v-model
会忽略所有表单元素的 value、checked、selected特性的初始值,因为v-model
选择Vue实例数据来作为具体的值。 <div id="app">
<input v-model="somebody">
<p>hello {{somebody}}p>
div>
<script>
var app = new Vue({
el: '#app',
data: {
somebody: '小明'
}
})
script>
v-pre
会 按原样输出,标签中的内容是什么就输出什么,主要用来跳过这个元素以及它的子元素的编译过程,可以用来显示原始的Mustache标签。 <div id="app">
<p v-pre>{{msg}}p>
<p>{{msg}}p>
div>
<script>
var app = new Vue({
el: '#app',
data: {
msg:"'v-pre'是不会管我的..."
}
})
script>
v-cloak
来解决这一问题。 <div id="app" v-cloak> {{ context }} div>
<script>
var app = new Vue({
el: '#app',
data: {
context:'Hello Vue!'
}
});
//用'v-cloak'则不会出现闪烁
script>
v-once
关联的实例 只会渲染一次,执行 一次性地插值,当数据改变时,插值处的内容不会更新,v-once所定义的元素或组件只会渲染一次,首次渲染后,不再随着数据的改变而重新渲染。若之后牵涉到重新渲染,那么 它关联的实例及其所有子节点 会被视为 静态内容 而被跳过,这可以用来优化更新性能。 <div id="app">
<p v-once>{{msg}}p>
<p>{{msg}}p>
<p> <input type="text" v-model="msg" name=""> p>
div>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
msg: "hello"
}
});
script>
创作不易,点个小赞再走呗,(¬_¬)