Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。
Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
那么该如何在页面上引入Vue?又该如何使用Vue进行开发呢?我们接下来一起初步认识一下Vue。首先创建一个html页面,并引入Vue.js:
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
你也可以将vue.js文件直接下载到本地,然后引入。
接下来看一段示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id="app">
<!-- {{}} 可以取出data定义的数据 -->
<p>{{msg}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:'#app',
data:{
msg:'Hello Vue!'
}
});
</script>
</body>
</html>
创建Vue实例,其中的el指定需要控制的DOM,这里指定为#app,则id为app的div范围是Vue的控制范围;其次是data,它可以定义该范围内使用的数据,形式为键值对,当然Vue实例中可以定义的内容远不止如此,但我们先来看看这段代码的效果:
Vue指令
Vue提供了一种非常简便的方式来控制和操作DOM,那就是Vue指令,Vue提供了各式各样的指令,我们先来了解比较常用的几个指令。
v-cloak
在刚才我们使用了 {{}}
符号来取出data中定义的数据,这一符号称为 插值表达式
,然而这种方式取出数据有一个弊端,当网络出现波动时,页面上会将插值表达式显示出来而非显示真正的数据:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<style>
[v-cloak] {
display: none;
}
</style>
<body>
<div id="app">
<p v-cloak>{{msg}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:'#app',
data:{
msg:"Hello Vue!"
}
});
</script>
</body>
</html>
<p v-text="msg"></p>
<p v-html="msg"></p>
<div>
<p v-text="msg"></p>
<p v-html="msg"></p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:'#app',
data:{
msg:"<h1>Hello Vue!</h1>"
}
});
</script>
v-bind
<div id="app">
<input type="button" v-bind:title="msg" value="按钮"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:'#app',
data:{
msg:"这是一个按钮"
}
});
</script>
v-bind指令用于绑定DOM属性,也就是说,只要是DOM的属性,它都能够直接进行绑定,比如input框的value属性:
<input type="button" v-bind:title="msg" v-bind:value="msg"/>
<style>
.red {
color: red;
}
.thin {
font-weight: 200;
}
</style>
<body>
<div id="app">
<h1 v-text="msg" v-bind:class="['red','thin']"></h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
msg: 'Hello Vue!'
},
});
</script>
<div id="app">
<h1 v-text="msg" v-bind:class="{red:true,thin:true}"></h1>
</div>
:true
或
:false
,所以我们可以通过在data中定义一个flag进行动态设置:
<div id="app">
<h1 v-text="msg" v-bind:class="{red:flag,thin:flag}"></h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
msg: 'Hello Vue!',
flag: true
},
});
</script>
:
,例如:
<input type="button" :title="msg" :value="msg"/>
v-for
<div id="app">
<p v-for="item in array">
{{item}}
</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
array: [1, 2, 3, 4, 5]
},
});
</script>
item(为数组中的每一项取一个名字) in list(待遍历的数组名)
,然后item就是数组中的每一个元素,效果如下:
<p v-for="(item,index) in array">
{{index}} ---- {{item}}
</p>
<div id="app">
<p v-for="(user,index) in array">
索引值:{{index}}--id:{{user.id}}--name:{{user.name}}--age:{{user.age}}
</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
array:[
{id:1,name:'张三',age:20},
{id:2,name:'李四',age:21},
{id:3,name:'王五',age:22},
]
},
});
</script>
<div id="app">
<p v-for="(value,key,index) in user">
索引:{{index}}---{{key}}:{{value}}
</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
user: { id: 1, name: '张三', age: 20 }
}
});
</script>
当Vue用v-for正在更新已经渲染过的元素列表时,默认使用的是 就地复用
策略,如果数据项的顺序被改变,Vue将简单复用此处每个元素,而不是移动DOM中的元素来匹配顺序;
为了给Vue一个提示,以便Vue能够跟踪每个节点的身份,从而复用和重新排序现有的元素,我们需要为每项提供一个唯一属性key:
<div id="app">
<div>
<label>id:</label>
<input type="text" v-model="id">
<label>name:</label>
<input type="text" v-model="name">
<input type="button" value="添加" @click="add">
</div>
<p v-for="user in array">
<input type="checkbox">
{{user.id}}--{{user.name}}
</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
id: '',
name: '',
array: [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' },
{ id: 3, name: '王五' }
]
},
methods: {
add() {
this.array.unshift({ id: this.id, name: this.name });
}
},
});
</script>
选中的数据被修改为了2号,这就是没有指定key的后果,我们只需在遍历的时候为key设置一个唯一的属性即可:
<p v-for="user in array" :key="user.id">
<input type="checkbox">
{{user.id}}--{{user.name}}
</p>
<div id="app">
<p v-if="flag">v-if</p>
<p v-show="flag">v-show</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
flag: true
}
});
</script>
<div id="app">
<input type="button" value="按钮" v-on:click="show"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:'#app',
data:{
},
methods: {
show(){
alert("点击了按钮");
}
}
});
</script>
<input type="button" value="按钮" v-on:mouseover="show"/>
@
:
<input type="button" value="按钮" @click="show"/>
事件修饰符
-
stop:阻止事件冒泡
-
prevent:组织默认行为
-
capture:添加事件侦听器时使用事件捕获模式
-
self:只当事件元素在该元素本身(比如不是子元素)触发时触发回调
-
once:使事件只触发一次
stop
<div id="app" style="width: 150px;height: 150px;background-color: red;" @click="divClick">
<input type="button" value="按钮" @click="btnClick"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
methods: {
divClick(){
alert("点击了DIV");
},
btnClick(){
alert("点击了按钮");
}
},
});
</script>
由于事件冒泡机制,在点击按钮时,会先触发按钮的事件,还会触发div的点击事件,但有些场景下,我们并不想在点击的按钮时触发父标签的事件,为此,可以使用stop来阻止事件的冒泡:
<input type="button" value="按钮" @click.stop="btnClick"/>
prevent
<div id="app">
<a href="http://www.baidu.com" @click="aClick">百度一下</a>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
methods: {
aClick(){
alert("点击了超链接");
}
},
});
</script>
<a href="http://www.baidu.com" @click.prevent="aClick">百度一下</a>
通过capture能够修改事件监听器为捕获模式,默认是冒泡机制,如果使用了capture,可以使事件从外向里传递:
<div id="app" style="width: 150px;height: 150px;background-color: red;" @click.capture="divClick">
<input type="button" value="按钮" @click="btnClick" />
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
},
methods: {
divClick() {
alert("点击了DIV");
},
btnClick() {
alert("点击了按钮");
}
},
});
</script>
self
<div id="app" style="width: 150px;height: 150px;background-color: red;" @click.self="divClick">
<input type="button" value="按钮" @click="btnClick" />
</div>
<div id="app">
<a href="http://www.baidu.com" @click.prevent.once="aClick">百度一下</a>
</div>
<div id="app">
<input type="text" :value="msg"/>
<input type="text" :value="msg"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
msg: 'Hello Vue!'
},
});
</script>
<div id="app">
<input type="text" v-model="msg"/>
<input type="text" v-model="msg"/>
</div>
<div id="app">
<label>{{new Date()}}</label>
</div>
<div id="app">
<label>{{new Date() | dateFormat}}</label>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 定义全局的过滤器
Vue.filter('dateFormat', function (dateStr) {
// 根据时间字符串构建Date对象
var dt = new Date(dateStr);
// 获取年、月、日
var year = dt.getFullYear();
var month = dt.getMonth() + 1;
var day = dt.getDate();
// 格式化日期
return `${year}-${month}-${day}`;
});
var app = new Vue({
el: '#app',
data: {
}
});
</script>
|
连接需要处理的数据,管道符后跟过滤器的名字,此时管道符前面的数据将会作为过滤器的处理函数的参数。
<label>{{new Date() | dateFormat('yyyy-mm-dd')}}</label>
<script>
Vue.filter('dateFormat', function (dateStr,pattern) {
......
});
</script>
<script>
var app = new Vue({
el: '#app',
data: {
},
filters: {
// 定义私有过滤器
dateFormat: function (dateStr) {
// 根据时间字符串构建Date对象
var dt = new Date(dateStr);
// 获取年、月、日
var year = dt.getFullYear();
var month = dt.getMonth() + 1;
var day = dt.getDate();
// 格式化日期
return `${year}-${month}-${day}`;
}
}
});
</script>
<div id="app">
<input type="text" v-model="msg" @keyup.enter="add">
<p>{{result}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
msg: '',
result:''
},
methods: {
add(){
this.result = this.msg;
}
},
});
</script>
.enter
,它表示回车键。其它的按键修饰符如下:
-
.tab
-
.delete
-
.esc
-
.space
-
.up
-
.down
-
.left
-
.right
<input type="text" v-model="msg" @keyup.113="add">
F2
,此时点击F2就会触发回调函数。为了便于区分,我们也可以为这些关键字码设置别名:
<script>
// 定义按键修饰符
Vue.config.keyCodes = {
"F1": 113,
};
</script>
<input type="text" v-model="msg" @keyup.f2="add">
自定义指令
<div id="app">
<input type="text" id="it">
</div>
focus
函数:
<div id="app">
<input type="text" id="it">
</div>
<script>
document.getElementById('it').focus();
</script>
<div id="app">
<input type="text" v-focus>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 自定义指令
Vue.directive('focus', {
// 当指令绑定到指定元素上时调用此函数,只执行一次
bind(el) { // el即为绑定该指令的元素
},
// 当元素插入到DOM时调用此函数,只执行一次
inserted(el) {
el.focus();
},
// 当元素更新时调用此函数,执行多次
updated(el) {
}
});
</script>
Vue.directive
进行设置,它需要两个参数,第一个参数为指令的名称,第二个参数为一个对象,在该对象内需要定义指令生效的三个周期函数,周期函数的入参中可以获取到绑定该指令的元素,然后调用
focus
获取焦点即可。
v-
前缀。
<div id="app">
<input type="text" v-color="'red'">
</div>
<script>
// 自定义指令
Vue.directive('color', {
// 当指令绑定到指定元素上时调用此函数,只执行一次
bind(el,binding) { // el即为绑定该指令的元素
el.style.color = binding.value;
},
// 当元素插入到DOM时调用此函数,只执行一次
inserted(el) {
},
// 当元素更新时调用此函数,执行多次
updated(el) {
}
});
</script>
binding
,我们能够获取到很多信息,其中value属性即为指令设置的值,将该值设置到样式中即可。
<script>
var app = new Vue({
el: '#app',
data: {
},
directives: {
// 自定义私有指令
'color': {
// 当指令绑定到指定元素上时调用此函数,只执行一次
bind(el, binding) { // el即为绑定该指令的元素
el.style.color = binding.value;
},
// 当元素插入到DOM时调用此函数,只执行一次
inserted(el) {
},
// 当元素更新时调用此函数,执行多次
updated(el) {
}
}
}
});
</script>
<script>
Vue.directive('Vue', function (el,binding) {
el.style.color = binding.value;
});
</script>
推荐阅读
1. 一份 Spring Boot 项目搭建模板
2.
Spring Boot 实现应用监控和报警
3. Nginx 从入门到实战
4. 一键式搭建分布式文件服务器
5. 团队开发中 Git 最佳实践
喜欢文章,点个
在看
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。