v-cloak、v-text 和 v-html 的使用
v-cloak 的使用
v-cloak
可以解决当网页很慢时,网页在加载的时候会显示{{ message }}
,等网页加载完毕才显示{{ message }}
的具体内容,即v-cloak
和 CSS 规则如[v-cloak] { display: none }
一起用时,这个指令可以隐藏未编译的{{ message }}
标签直到实例准备完毕。
示例
[v-cloak] {
display: none;
}
<div v-cloak>
{{ message }}
</div>
v-text 的使用
v-text
可以更新元素的文本内容,和{{ message }}
具有相同的功效,但是如果要更新部分的文本内容,需要使用{{ message }}
插值,v-text
会覆盖标签内的全部内容。并且v-text
不会出现网页加载时出现的显示{{ message }}
的问题。
示例
<span v-text="message"></span>
<!-- 和下面的一样 -->
<span>{{ message }}</span>
区别
<div id="app">
<p v-cloak>---- {{ message }} -------</p>
<p v-text="message">---------</p>
</div>
<!--
运行效果:
---- Hello Vue! -------
Hello Vue!
-->
v-html 的使用
v-html
可以更新元素的 innerHTML。
<div id="app">
<p>{{ html }}</p>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
html: "<h1>I am a h1.</h1>"
}
});
</script>
/*
网页显示效果:
<h1>I am a h1.</h1>
*/
使用 v-text
也不会解析 h1
标签,这样的情况可以使用 v-html
来解析 h1
标签:
<div id="app">
<p v-html="html"></p>
</div>
v-html
和v-text
一样都会覆盖标签内的文本内容。
v-bind
用于绑定属性的指令。
<!-- 将 message 的值赋给 title 属性,引号里面的内容也可以时合法的 JS 表达式 -->
<input type="button" value="button" v-bind:title="message" />
<!-- 将引号内的 jS 表达式赋给 title -->
<input type="button" value="button" v-bind:title="message + 'info'" />
v-bind:title
也可以简写成 :title
,即 v-bind
可以简写成 :
。
<input type="button" value="button" v-bind:title="message" />
<!-- 简写 -->
<input type="button" value="button" :title="message" />
v-on
缩写:
@
。用于绑定事件监听器。
<!-- 按钮点击就会触发 sayHello 方法 -->
<!-- click 可以换成 mousemove 等 -->
<input type="button" value="button" v-on:click="sayHello" />
<script>
var vm = new Vue({
el: "#app",
data: {},
methods: {
sayHello: function() {
alert("Hello!");
}
}
});
</script>
缩写样式
<input type="button" value="button" @click="sayHello" />
事件修饰符
修饰符是由点开头的指令后缀来表示的。
-
.stop
:阻止冒泡<!-- 未加上 .stop 之前,点击 button 的时候会先触发 sayHello 后触发 sayWorld,加上 .stop 后阻止冒泡,只触发 sayHello --> <div id="app" @click="sayWorld" style="background-color: red; height: 50px;"> <input type="button" value="button" @click.stop="sayHello" /> </div>
-
.prevent
:阻止默认事件<!-- 当添加 ```.prevent``` 之后,只会触发 sayHello 不会跳转到百度 --> <a href="http://www.baidu.com" @click.prevent="sayHello">有问题,去百度</a>
-
.capture
:添加事件监听器时使用事件捕获模式,即元素自身触发的事件先在此处理,然后才交由内部元素进行处理<!-- 下面的代码会先触发 sayWorld 然后触发 sayHello --> <div id="app" @click.capture="sayWorld" style="background-color: red; height: 50px;" > <input type="button" value="button" @click="sayHello" /> </div>
-
.self
:只有当前元素自身时触发处理函数,即事件不是从内部元素触发的<!-- 点击 button 时,不会触发 sayWorld,只有点击 div 时,才会触发 --> <div id="app" @click.self="sayWorld" style="background-color: red; height: 50px;" > <input type="button" value="button" @click="sayHello" /> </div>
-
.once
:点击事件将只会触发一次<!-- .prevent 只触发一次,第二次点击时就会跳转到百度 --> <a href="http://www.baidu.com" @click.prevent.once="sayHello">百度一下</a>
self 可以阻止自身的冒泡。
<!-- 点击 button 时,指挥触发 sayRed 和 sayButton -->
<div id="app" @click="sayRed" style="background-color: red; height: 100px;">
<div
id="app2"
@click.self="sayBlue"
style="background-color: blue; height: 50px;"
>
<input type="button" value="button" @click="sayButton" />
</div>
</div>
v-model
在表单控件或者组件上创建双向绑定。
v-bind
只能实现单向绑定。
<!-- 当在 input 输入或者修改文本内容时,message 会跟着改变 -->
<input v-model="message" placeholder="edit me" />
<p>Message is: {{ message }}</p>
Class 与 Style 绑定
Class 绑定
<style>
.red {
color: red;
}
.thin {
font-weight: 200;
}
.italic {
font-style: italic;
}
.active {
letter-spacing: 0.5em;
}
</style>
<script>
var vm = new Vue({
el: "#app",
data: {
flag: true
},
})
</script>
数组
<div id="app">
<h1 :class="['thin', 'red']">这是一个 h1</h1>
</div>
数组中使用三元表达式
<div id="app">
<h1 :class="['thin', 'red', flag ? 'active' : '']">这是一个 h1</h1>
</div>
数组中嵌套对象
<div id="app">
<h1 :class="['thin', 'red', {'active' : flag}]">这是一个 h1</h1>
</div>
直接使用对象
<!-- 对象的属性可带引号,也可以不带 -->
<div id="app">
<h1 :class="{red: true, thin: false}">这是一个 h1</h1>
<!--
<h1 :class="{'red': true, 'thin': false}">这是一个 h1</h1>
-->
</div>
也可以写成以下格式:
<div id="app">
<h1 :class="classObj">这是一个 h1</h1>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
classObj: {red: true, thin: false}
},
})
</script>
Style 绑定
直接在元素上通过 :style
的形式,书写样式对象
<div id="app">
<h1 :style="{'color': 'blue', 'font-size': '40px'}">这是一个 h1</h1>
</div>
将样式对象定义到 data
中,并直接引用到 :style
中
<div id="app">
<h1 :style="styleObj">这是一个 h1</h1>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
styleObj: {'color': 'blue', 'font-size': '40px'}
},
})
</script>
在 :style
中通过数组,引用多个 data
上的样式对象
<script>
var vm = new Vue({
el: "#app",
data: {
styleObj1: {'color': 'blue', 'font-size': '40px'},
styleObj2: {'font-style': 'italic'}
},
})
</script>
<div id="app">
<h1 :style="[styleObj1, styleObj2]">这是一个 h1</h1>
</div>
v-for
<script>
var vm = new Vue({
el: "#app",
data: {
// 要遍历的普通数组
arr: [1, 2, 3],
// 要遍历的对象数组
obj: [
{id: 1, name: 'abc1'},
{id: 2, name: 'abc2'},
{id: 3, name: 'abc3'},
],
// 要遍历对象的属性
user:{
id: 1,
name: 'zzz',
age: 10
}
},
})
</script>
迭代普通数组
<div id="app">
<p v-for="item in arr">{{ item }}</p>
</div>
如果需要索引值,则:
<div id="app">
<p v-for="(item, i) in arr">{{ i }}---{{ item }}</p>
</div>
迭代对象数组
<div id="app">
<p v-for="(item, i) in obj">{{ i }}---{{ item.id }}---{{ item.name }}</p>
</div>
迭代对象属性
<div id="app">
<p v-for="(value, key, i) in user">{{ i }}---{{ key }}---{{ value }}</p>
</div>
迭代数字
<div id="app">
<p v-for="count in 10">第 {{count}} 个</p>
</div>
v-if 和 v-show
v-if
根据表达式的值的真假条件渲染元素。
v-show
根据表达式之真假值,切换元素的
display CSS
属性。如display: none
。
过滤器
可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和
v-bind
表达式。
定义
Vue.filter("过滤器名称", function() {});
使用
{{ name | 过滤器名称 }}
示例
该示例通过定义过滤器将“单纯”替换为“邪恶”。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>品牌管理案例</title>
<script src="lib/vue.js"></script>
<link rel="stylesheet" href="lib/bootstrap.css" />
</head>
<body>
<div id="app">
<p>{{ message | messageFormat }}</p>
</div>
</body>
<script>
// 定义一个全局的过滤器,名字叫 messageFormat
// 所谓全局过滤器就是所有的 vm 示例都可以使用
// 方法里的第一个参数指定为过滤器管道符前面传过来的数据
Vue.filter("messageFormat", function(data) {
// replace 方法的第一个参数,除了可以是一个字符串之外,还可以是一个正则
return data.replace(/单纯/g, "邪恶");
});
var vm = new Vue({
el: "#app",
data: {
message:
"曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的人。"
}
});
</script>
</html>
管道符后面过滤器传过来的参数从第二个开始计算:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>品牌管理案例</title>
<script src="lib/vue.js"></script>
<link rel="stylesheet" href="lib/bootstrap.css" />
</head>
<body>
<div id="app">
<p>{{ message | messageFormat('疯狂', '英语') }}</p>
</div>
</body>
<script>
// 定义一个全局的过滤器,名字叫 messageFormat
// 所谓全局过滤器就是所有的 vm 示例都可以使用
// 方法里的第一个参数指定为过滤器传过来的数据
Vue.filter("messageFormat", function(data, crazy, english) {
// replace 方法的第一个参数,除了可以是一个字符串之外,还可以是一个正则
return data.replace(/单纯/g, "邪恶" + crazy + english);
});
var vm = new Vue({
el: "#app",
data: {
message:
"曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的人。"
}
});
</script>
</html>
私有(局部)过滤器补充
var vm = new Vue({
el: "#app",
data: {
message:
"曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的人。"
},
filters: {
messageFormat: function(data, crazy, english) {
return data.replace(/单纯/g, "邪恶" + crazy + english);
}
}
});
在私有过滤器和全局过滤器同名的时候,采取就近原则,访问私有过滤器。
自定义按键修饰符
找到键盘事件对应的键码
自定义按键修饰符
// 定义按键 F2
Vue.config.keyCodes.f2 = 113
使用
<!-- add 为 Vue 里的 methods 定义的事件 -->
<!-- 按 F2 触发 add 事件 -->
<input type="text" @keyup.f2 = "add">
网友评论