Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)

前言

上篇文章对Vue.js有了初步理解,接下来我们把Vue.js基础语法快速的过一遍,先混个脸熟留个印象就好。Vue.js基础主要包括,生命周期,数据绑定,过滤器,方法,计算属性,内置指令,组件,自定义指令,Render函数。

Vue实例与数据绑定

通过构造函数Vue就可以创建一个Vue的根实例,el挂载DOM对象,data绑定数据,页面文本中通过插值显示data数据,插值方式为{{}}双大括号,如<div>{{ name }}</div>。Vue实例中data数据就是Model它默认就是双向绑定的,我们通过维护data数据来可以实时改变视图展示内容。注意:如果有些数据改变不影响视图的变量,尽量不要在data中定义它,因为这样会增加效率问题。

var app = new Vue({
el: '#app', //el指定一个页面中已存在的DOM元素来挂载VUE实例
data() {
return {
name: ''
};
}
})

Vue.js生命周期

每个框架都有它的生命周期,每个Vue实例创建时,都会经历一系列的初始化过程,同时也会调用相应的生命周期钩子,我们可以利用这些钩子,在适合的时机执行我们的业务逻辑。

  • created:实例创建完成后调用,但尚未挂载,$el还不可用。
  • mounted:el挂载到实例上后调用,一般第一个业务逻辑在这里开始。
  • beforeDestroy:实例销毁之前调用。
<!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>Document</title>
</head>
<body>
<div id="app">
<h1>{{ date }}</h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data() {
return {
date: new Date()
};
},
created: function () { //实例创建完成后调用,但尚未挂载,$el还不可用。
console.log(this.$el) //undefined
},
mounted: function () { //el挂载到实例上后调用,一般第一个业务逻辑在这里开始。
var e = this;
this.timer = setInterval(() => {
e.date = new Date();
}, 1000);
},
beforeDestroy: function () { //实例销毁之前调用。
this.timer && clearInterval(this.timer);
}
})
</script>
</body>
</html>

生命周期图示:(官方提供)

过滤器

Vue.js 支持在{{ }}插值的尾部添加一个管道符“|”,对数据进行过滤,经常用于格式化文本,例如对时间进行格式化处理。过滤器可以串联多个,而且还可以接收参数,默认第一个参数为数据本身。过滤器适用于简单的文本转换,如果要实现复杂的数据变换,应该使用计算属性去处理,计算属性在后面介绍它的用法。

  • filters:过滤器选项中创建每个过滤器,过滤规则是自定义的,例:filterA: function(value){}。
  • 管道符:管道符“|”出现在文本插值后面,进行过滤前面数据,例:{{ data | filterA }}。
  • 串联:过滤器也可以串联,数据后面设定多个过滤器,例:{{ message | filterA | filterB }}。
  • 多个参数:每个过滤器可以设定多个参数,例:{{ message | filterA('arg1', 'arg2') }},arg1为过滤器第2个参数,arg2为过滤器第3个参数,因为默认第一个参数为数据本身。
<!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>Document</title>
</head>
<body>
<div id="app">
<h1>{{ date | filterA }}</h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data() {
return {
date: new Date()
};
},
filters: {
filterA: (value) => {
let date = new Date(value),
y = date.getFullYear(),
m = date.getMonth() + 1,
d = date.getDate(),
hh = date.getHours(),
mm = date.getMinutes(),
ss = date.getSeconds();
var dt = y + '-' + (m > 9 ? m : '0' + m) + '-' + (d > 9 ? d : '0' + d) + ' ' +
(hh > 9 ? hh : '0' + hh) + ':' + (mm > 9 ? mm : '0' + mm) + ':' + (ss > 9 ? ss : '0' + ss);
return dt;
}
}
})
</script>
</body>
</html>

方法

methods 声明所有绑定事件监听器实现的方法,每个方法以函数形式声明,实例方法内可以直接使用this获取或修改数据,也可以调用其他申明的方法,外部也可以通过实例去调用。下面实例中用到了v-if="show",这是内置指令后面会详细介绍,@click="hide" 这也是内置指令v-on它是用来绑定事件监听器,@是语法糖,这里主要说明一下方法hide()调用的时候()可以省略。关于箭头函数,作用域不同,根据实际需求选择使用它。

<!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>Document</title>
</head>
<body>
<div id="app">
<input type="button" value="点击隐藏1" @click="hide">
<input type="button" value="点击隐藏2" @click="hide2">
<h1 v-if="show">{{ message }}</h1>
<h1 v-if="show">{{ getmessage() }}</h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data() {
return {
show: true,
message: 'HelloWord!'
};
},
methods: {
hide: function(){
//console.log(this.show);
this.show = false;
},
hide2: ()=>{ //箭头函数作用域不一样,通过this无法改变数据。
console.log(this.show); // undefined
this.show = false;
//app.show =false; //通过实例调用来完成修改数据
},
getmessage: function(){
return this.message; //带返回值方法,可以在插值中输出
}
}
})
</script>
</body>
</html>

计算属性

computde计算属性,模板内的表达式仅用于简单的运算,复杂的逻辑都可以通过计算属性代替,计算属性是基于它的依赖缓存的,一个计算属性所依赖的数据发生变化时,它才会重新取值。计算属性还可以返回多个Vue实例的数据,其中一个数据变化,计算属性会重新被执行。

  • computde:计算属性选项。
  • 用法:计算属性包含get和set函数,默认不写只触发getter函数来读取。
  • 缓存:计算属性与方法不一样地方,它是依赖数据发生变化时才会重新计算,高效率。
<!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>Document</title>
</head>
<body>
<div id="app">
<input type="button" value="点击" @click="onmode">
<h1>{{ count }} </h1>
<h1>{{ cpdate }} </h1>
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data() {
return {
count: 0,
date: '',
message: 'Hello'
};
},
methods: {
onmode: function () {
this.count++;
}
},
computed: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
},
cpdate: function () {
//var d = this.count; //当计算属性中依赖属性发生变化时,会被重新计算。
this.date = new Date();
return this.date;
}
}
})
</script>
</body>
</html>

内置指令

指令 (Directives) 是带有 v- 前缀的特殊属性,指令是Vue模板中最常用的一项功能,它带有前缀v-,主要职责就是当其表达式的值改变时,将某些行为应用到DOM上。

  • v-if:条件渲染指令,动态在DOM内添加或删除DOM元素。
  • v-else:条件渲染指令,必须跟v-if成对使用。
  • v-else-if:判断多层条件,必须跟v-if成对使用。
  • v-show:条件渲染指令,为DOM设置css的style属性,v-show不能在<template>上使用,频繁切换场景中适合使用。
  • v-text:更新元素的textContent;例如:<span v-text="msg"></span> 等同于 < span>{{msg}} </ span>。
  • v-html:更新元素的innerHTML;会把标签名也带上。
  • v-for:循环指令;<li v-for="book in books">{ { book.name } }</li>
  • v-for:表达式遍历数组时支持一个可选参数作为当前项的索引;<li v-for="(book , index) in books ">{{ index}} - {{book.name })</li>
  • v-for:表达式遍历对象属性时,有两个可选参数,分别是键名和索引;<li v-for="(value , key , index) in user ">{ { index } } - { { key } } : { { value } }</li>
  • v-cloak:不需要表达式,这个指令保持在元素上直到关联实例结束编译; v-cloak 是一个解决初始化慢导致页面闪动的最佳实践。
  • v-once:也是一个不需要表达式的指令,作用是定义它的元素或组件只渲染一次,包括元素或组件的所有子节点。
  • v-pre:不需要表达式,跳过这个元素以及子元素的编译过程,以此来加快整个项目的编译速度。
  • v-bind:响应并更新DOM特性;例如:v-bind:href  v-bind:class  v-bind:title  等等。语法糖:"v-bind:” 可以用":"代替。
  • v-on:用于监听DOM事件; 例如:v-on:click  v-on:keyup。语法糖:“v-on:”可以用“@”代替。
  • v-model:数据双向绑定;用于表单输入等;例如:< input v-model= "message">。v-model也是一个特殊的语法糖,使用@input来替代v-model。

方法与事件:

Vue 提供了一个特殊变量$event ,用于访问原生DOM 事件,可以阻止事件冒泡或者阻止链接打开。

写一个阻止冒泡的例子:

    <div @click="stopClick1('stop1',$event)">
<div @click="stopClick2('stop2',$event)">
<div @click="stopClick3('stop3',$event)">阻止冒泡</div>
</div>
</div> methods:{
stopClick3: function(message, event){
console.log(message);
event.stopPropagation(); //阻止冒泡
},
stopClick2: function(message, event){
console.log(message);
},
stopClick1: function(message, event){
console.log(message);
}
}

修饰符:
在@绑定的事件后加小圆点“.”,再跟一个后缀来使用修饰符。
上面的阻止冒泡事件,可以直接用户修饰符的方式写为:

<div @click.stop="stopClick3('stop3')">阻止冒泡</div>  //不用通过$event事件再来写了

常用的一些修饰符有:.stop、.prevent、.capture、.self、once,修饰符可以串联使用。

<!--阻止单击事件冒泡-->
<a @click.stop="handle"></a>
<!--修饰符可以串联-->
<a @click.stop.prevent="handle"></a>
<!--添加事件侦听器时使用事件捕获模式-->
<div @click.capture="handle"> ... </div>
<!--只当事件在该元素本身(而不是子元素) 触发时触发回调-->
<div @click.self="handle"> ... </div>
<!--只触发一次,组件同样适用-->
<div @click.once="handle"> ... </div>

数组更新:
当我们修改数组时, Vue 会检测到数据变化,所以用v-for 渲染的视图也会立即更新。

  • push()
  • pop()
  • shift()
  • unshit()
  • splice()
  • sort()
  • reverse()

以上方法会改变被这些方法调用的原始数组,也有些方法不会改变原数组,它们返回的是一个新数组,在使用这些非变异的方法时,可以用新数组来替换原数组,相同的元素不会重新渲染。

例如:

  • filter()
  • concat()
  • slice()
app.books = app.books.filter(function(item){
return item.name.match(/JavaScript/);
});

过滤与排序:

当你不想改变原数组,想通过一个数组的副本来做过滤或排序显示时,可以使用计算属性来返回过滤或排序后的数组。

表单与v-model

表单控件在实际业务中较为常见,比如单选、多选、下拉选项、输入框等,用它们可以完成数据的录入、校验、提交等,上面内置指令中提到了v-model指令,用于在表单类元素上双向绑定数据,可以将输入的内容实时映射到绑定的数据上。

备注:v-model 也有修饰符,用于控制数据同步的时机,如:使用修饰符.lazy 会转变为在change事件中同步;使用修饰符.number 可以将输入转换为Number类型;使用修饰符.trim 可以自动过滤输入的首尾空格。

输入框:

<!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>Document</title>
</head>
<body>
<div id="app">
<input type="text" v-model="message" placeholder="输入...">
<p>输入的内容是:{{ message }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
}
})
</script>
</body>
</html>

在输入框输入的同时,{{ message }} 也会实时将内容渲染在视图中。

单选按钮:

单选按钮在单独使用时,不需要 v-model,直接使用 v-bind 绑定一个布尔值类型的值,为真时选中,为否时不选。

<div id="app">
<input type="radio" :checked="picked">
<label>单选按钮</label>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
picked: true
}
})
</script>

如果是组合使用来实现互斥选择的效果,就需要 v-model 配合 value 来使用。

<div id="app">
<input type="radio" v-model="picked" value="html" id="html"><label for="html">HTML</label>
<input type="radio" v-model="picked" value="js" id="js"><label for="js">JavaScript</label>
<input type="radio" v-model="picked" value="css" id="css"><label for="css">CSS</label>
<br>
<p>选择的项是:{{ picked }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
picked: 'js'
}
})
</script>

复选框:

复选框也是分单独使用和组合使用,不过用法稍与单选不同,复选框单独使用时也是用 v-model 来绑定一个布尔值。

   <div id="app">
<input type="checkbox" v-model="checked" id="checked">
<label for="checked">选择状态:{{ checked }}</label>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
checked: false
}
})
</script>

组合使用时,也是 v-model 与 value 一起,多个勾选框都绑定到同一个数组类型的数据,value的值在数组当中,就会选择这一项。

    <div id="app">
<input type="checkbox" v-model="checked" value="html" id="html"><label for="html">HTML</label>
<br>
<input type="checkbox" v-model="checked" value="js" id="js"><label for="js">JavaScript</label>
<br>
<input type="checkbox" v-model="checked" value="css" id="css"><label for="css">CSS</label>
<br>
<p>选择的项是:{{ checked }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
checked: ['html','css']
}
})
</script>

选择列表:

选择列表就是下拉选择器,同样也是分为单选和多选方式。

    <div id="app">
<select v-model="selected">
<option>HTML</option>
<option value="js">JavaScript</option>
<option>CSS</option>
</select>
<p>选择的项是:{{ selected }}</p> <select v-model="selected2" multiple>
<option value="html">HTML</option>
<option value="js">JavaScript</option>
<option value="css">CSS</option>
</select>
<p>选择的项是:{{ selected2 }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
selected: 'HTML',
selected2: ['html','js']
}
})
</script>

Class 与 Style 绑定

对于数据绑定,一个常见的需求是操作元素的class样式列表和它的内联样式。我们可以用v-bind绑定元素属性,表达式的结果类型可以是字符串,也可以是对象或数组,v-bind:class 指令也可以与普通的 class 属性共存。

表达式为对象时:

<div id='example' class="h12" :class="{'active':isActive,'error':isError}"></div>
var vm = new Vue({
el: '#example',
data: {
isActive: true,
isError: false
}
})

渲染为:

<div id='example' class="h12 active"></div>

以上例子普通class绑定h12样式,通过v-bind:class绑定的表达式为对象,渲染结果中h12样式永远存在,当数据isActive和isError变化时,为true的对应的class样式被添加到class列表中。

我们也可以直接绑定数据中的一个对象,代码示例如下:

<div id='example' class="h12" :class="container"></div>
var vm = new Vue({
el: '#example',
data: {
container:{
'active': true,
'error': false
}
}
})

当然除了绑定数据外,我们也可以直接绑定计算属性使用,处理更复杂的业务逻辑,不过在项目中很少用到。

表达式为数组时:

<div id='example' :class="[active, error]"></div>
var vm = new Vue({
el: '#example',
data: {
active: 'active',
error: 'error',
isError: true
}
})

渲染为:

<div id='example' class="active error"></div>

如果想根据条件切换列表中的class,则可以用三元表达式,代码示例如下:

<div id='example' :class="[active, isError ? error : '']"></div>

 

绑定内联样式:

v-bind:style的表达式可以绑定对象,也可以是数组,CSS属性名可以用驼峰命名式(camelCase)或短横分隔命名式(kebab-case),代码示例如下:

<div id='example' :style="{'color':color,'fontSize':fontSize+'px'}">样式</div>
var vm = new Vue({
el: '#example',
data: {
color: 'orange',
fontSize: 13
}
})

渲染为:

<div style="color: orange; font-size: 13px;">样式</div>

通常直接绑定到一个样式对象更好,让模板更清晰,代码示例如下:

<div id='example' :style="ddfe">样式</div>
var vm = new Vue({
el: '#example',
data: {
ddfe: {
color: 'orange',
fontSize: 13
}
}
})

v-bind:style 的数组语法可以将多个样式对象应用到一个元素上,代码示例如下:

<div id='example' :style="[ddfe, ddcolor]">样式</div>

目录导航

参考资料

Vue.js

Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)的更多相关文章

  1. Vue.js+vue-element搭建属于自己的后台管理模板:什么是Vue.js?(一)

    Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js是什么?(一) 前言 本教程主要讲解关于前端Vue.js框架相关技术知识,通过学习一步一步学会搭建属于自己的后台管理模板,并 ...

  2. Vue.js+vue-element搭建属于自己的后台管理模板:创建一个项目(四)

    Vue.js+vue-element搭建属于自己的后台管理模板:创建一个项目(四) 前言 本章主要讲解通过Vue CLI 脚手架构建工具创建一个项目,在学习Vue CLI之前我们需要先了解下webpa ...

  3. Vue.js+vue-element搭建属于自己的后台管理模板:更深入了解Vue.js(三)

    前言 上一章我们介绍了关于Vue实例中一些基本用法,但是组件.自定义指令.Render函数这些放到了本章来介绍,原因是它们要比前面讲的要难一些,组件是Vue.js最核心的功能,学习使用组件也是必不可少 ...

  4. Vue + ElementUI 后台管理模板推荐

    最近学习和项目都用到了Vue和ElementUI,自己不是专业前端,搞这些UI上的东西还是有些难度,这里推荐两个Vue + ElementUI后台管理模板 vue-element-admin vue- ...

  5. 写了一个vue+antdv的后台管理模板

    1,项目简介 写在前面===>这是一个vue+antdv的后台管理模板 项目地址: https://github.com/BaiFangZi/vue-antd-manage 1.1,概述 ​ 最 ...

  6. 28个漂亮的React.js后台管理模板

    React管理模板 为您的React Web应用程序开发一个管理区域可能非常耗时.它与设计所有前端页面一样重要. 这是2020年设计出色的顶级React.js后台管理模板的列表. 这些模板确实有价值, ...

  7. GitHub Vue项目推荐|Vue+Element实现的电商后台管理系统功能丰富

    GitHub Vue项目推荐|mall-admin-web是一个电商后台管理系统的前端项目基于Vue+Element实现 主要包括商品管理.订单管理.会员管理.促销管理.运营管理.内容管理.统计报表. ...

  8. 使用vue3.0和element实现后台管理模板

    通过自己所学的这段时间,利用空余时间,使用vue3.0脚手架搭建的一个关于后台的管理模板,所实现功能也是模仿一个后台的界面,数据分为两种存放,一种是直接存储到mlab,这里的数据是存放这登录注册,只有 ...

  9. sae后台管理端的js,daterangepicker使用

    原本只为了日期范围选择器看下sae的前端怎么实现 然后... 公共函数两个文件,第一个是各种插件: typeahead.js 自动完成 //关键词自动完成 $('#page-auto-complete ...

随机推荐

  1. c++ 开发JNI

    c++ 开发JNI C的预处理命令 #开头的就是c/c++的预处理命令 在编译之前 先会走预编译阶段 预编译阶段的作用就是 把 include进来的头文件 copy到源文件中 define这些宏定义 ...

  2. 01 Python 基础数据类型

    基础数据类型,有7种类型,存在即合理. 1.int 整数 主要是做运算的 .比如加减乘除,幂,取余  + - * / ** %...2.bool 布尔值 判断真假以及作为条件变量3.str 字符串 存 ...

  3. FEL,项目实装记录

    FEL,即Fast EL ,版本0.8,具体内容我就不贴了,自行百度 实装遇到的问题: Spring Boot 打包后无法进行表达式编译. 根据百度以及源码,确定这东西是在用JavaCompiler将 ...

  4. [python]python字典

    1.简介 字典是python中的映射数据类型,由‘键-值’(key-value)对构成. 键:几乎所有类型的python对象都可以用作键,不过一般还是以数字或者字符串最为常用. 值:可以是任意类型的p ...

  5. CodeForces 809B Glad to see you!

    Glad to see you! 题解: 交互题一般都是需要用二分去完成. 在二分时候每次检查左边和右边哪边会和答案更近, 然后在更近的那段新区间去重复检查, 知道区间长度为1. 在检查的时候,可以使 ...

  6. 背包形动态规划 fjutoj2347 采药

    采药 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld   Problem Description 辰辰是个天资聪颖的 ...

  7. hdu1255 覆盖的面积(线段树面积交)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 面积交与面积并相似相比回了面积并,面积交一定会有思路,当然就是cover标记大于等于两次时. 但 ...

  8. codeforces H. Queries for Number of Palindromes(区间dp)

    题目链接:http://codeforces.com/contest/245/problem/H 题意:给出一个字符串还有q个查询,输出每次查询区间内回文串的个数.例如aba->(aba,a,b ...

  9. 接口压测工具WRK的学习与使用

    之前一直在使用jmeter,第一次接触wrk,记录下使用过程以便自己再次使用. 首先,WRK是linux系统上才可以使用的工具,我也不想剑走偏锋的去研究如何让wrk可以在windows系统上使用. 临 ...

  10. csapp:第八章 异常控制流ECF

    第八章 异常控制流ECF 8.1 异常 Exception graph LR E[异常Exception]-->E2[中断:异步异常] E-->E3[同步异常] E3-->陷阱 E3 ...