Vue2
1、什么是Vue
- Vue 是目前最火的一个前端框架,React是最流行的一个前端框架
- Vue 是前端的主流框架之一,和Angular、React 一起,并成为前端三大主流框架!
- Vue 是一套构建用户界面的框架,只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合。
- 下载用于传统的html项目使用,若是Vue项目则不需要下载
- 下载地址:Vue
2、Vue的优点
- 轻量级,体积小是一个重要指标
- 易上手,学习曲线平稳,文档齐全
- 吸取了 Angular(模块化)和 React(虚拟 DOM)的长处,并拥有自己独特的功能,如:计算属性
- 开源,社区活跃度高
3、什么是MVVM
MVVM(Model-View-ViewModel)是一种软件架构设计模式,是一种简化用户界面的事件驱动编程方式
MVVM 的核心是 ViewModel 层,负责转换 Model 中的数据对象来让数据变得更容易管理和使用
- 该层向上与视图层进行双向数据绑定
- 向下与 Model 层通过接口请求进行数据交互

4、MVVM的优点
- 双向绑定技术,当Model变化时,View-Model会自动更新,View也会自动变化。
- View的功能进一步的强化,具有控制的部分功能,若想无限增强它的功能,甚至控制器的全部功几乎都可以迁移到各个View上(不过这样不可取,那样View干了不属于它职责范围的事情)。View可以像控制器一样具有自己的View-Model.
- 由于控制器的功能大都移动到View上处理,大大的对控制器进行了瘦身。不用再为看到庞大的控制器逻辑而发愁了。
- 可以对View或ViewController的数据处理部分抽象出来一个函数处理model。这样它们专职页面布局和页面跳转,它们必然更一步的简化。
5、MVVM的缺点
- 数据绑定使得 Bug 很难被调试。
- 一个大的模块中,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当长期持有,不释放内存,就造成了花费更多的内存。
- 数据双向绑定不利于代码重用。
6、第一个vue项目
使用html导入vue.js,实现vue项目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <!DOCTYPE html> <html> <body>
<div id="vue"> {{message}} </div> <script src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#vue', data: { message: 'Hello Vue!' } }); </script> </body> </html>
|
7、vue的基本语法
1、v-bind
用于绑定标签内的属性
例:
1 2 3
| <span v-bind:id="testId"> 测试 </span>
|
v-bind可以省略
简写:
1 2 3
| <span :id="testId"> 测试 </span>
|
注意:如果testId在vue实例化中的data内不存在,则会报错
2、条件判断
1、v-if、v-else-if、v-else
条件判断语句应该用的最多,就不需要解释了
例:
1 2 3
| <span v-if="judge">测试1</span> <span v-else="judge==1">elseif测试</span> <span v-else>else测试</span>
|
若judge在vue实例化中是布尔类型,则可以直接使用,如果是数据则可以==或===比较
==比较值
===比较类型跟值
2、v-show
使用跟v-if一致,
唯一的区别:
- v-if如果条件不成立,该条标签不显示,
- 如果使用v-show的话则会使用样式的display:none远程
3、v-for
调用格式为:v-for=”item in items”
注:items表示数组,item 表示迭代的别名
例:
1 2 3
| <ul> <li v-for="ary in arr" :id="ary.id">{{ary.name}}</li> </ul>
|
1 2 3 4 5 6 7 8
| <script> let test=new Vue({ el:"#test", data:{ arr:[{id:1,name:"数组1"},{id:2,name:"数组2"},{id:3,name:"数组3"}] } }) </script>
|
4、v-on
用于绑定事件
例:
1
| <p v-on:click="test">111</p>
|
可以使用@符号等代替v-on简化
1
| <p @click="test">111</p>
|
绑定的方法也需要在vue实例化中写,如果方法没有参数,括号可以省略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <script> let test=new Vue({ el:"#test", data:{ name:"znsd", id:1, url:"www.baidu.com", judge:false, arr:[{id:1,name:"数组1"},{id:2,name:"数组2"},{id:3,name:"数组3"}], key:['id','name'] }, methods:{ test(){ alert(111) } } }) </script>
|
8、双向数据绑定
双向数据绑定,也就是视图发生改变时,数据会根据同步发生改变,数据发生改变,视图也会发生该表
注意!!!
使用v-model进行表单双向绑定时候,会跟随
- input的value值,
- selecet默认选中值value(selected)
- input中type=checkbox的checked的选中的value
注意:下面的例子都需要用id为test的包起来
1、单行文本
1
| <input type="text" v-model="message" :value="message"/>
|
1 2 3 4 5 6 7 8
| <script> let test = new Vue({ el: "#test", data: { message: "文本框" } }) </script>
|
当input文本框的value发生改变,vue实例对象的对应data也会发生改变
2、单选框
1 2
| <input type="radio" name="gender" v-model="gender" value="1"> 男 <input type="radio" name="gender" v-model="gender" value="2"> 女
|
1 2 3 4 5 6 7 8
| <script> let test = new Vue({ el: "#test", data: { gender: 1 } }) </script>
|
当值gender为1的时候,默认选中input中value为1的值
当单选框选值发生改变,data中gender也发生该表,例选中女,女的value为2,则gender值为2
3、多选框
这里我偷懒,使用了vue的for循环,暂时不知道怎么显示name值
1
| <input type="checkbox" v-for="hobby in hobbys" v-model="hobbysChecked" :value="hobby.id">
|
1 2 3 4 5 6 7 8 9
| <script> let test = new Vue({ el: "#test", data: { hobbys: [{id: 1, name: "篮球"}, {id: 2, name: "排球"}], hobbysChecked: [1] } }) </script>
|
因为是多选框,所以莫默认选中值则是一个数组,具体操作跟单选框差不多
4、下拉框
这里继续偷懒
1 2 3 4
| <select v-model="hobbySelected"> <option value="0">请选择爱好</option> <option v-for="hobby in hobbys" :value="hobby.id">{{hobby.name}}</option> </select>
|
1 2 3 4 5 6 7 8 9
| <script> let test = new Vue({ el: "#test", data: { hobbys: [{id: 1, name: "篮球"}, {id: 2, name: "排球"}], hobbySelected: 1 } }) </script>
|
因为下拉框只有一个选中,所以将双向绑定绑定于select,会随data中的hobbySelected值找对应的value来默认selected选中
9、Axios
Axios 是一个开源的可以用在浏览器端和 NodeJS
的异步通信框架,她的主要作用就是实现 AJAX 异步通信,其功能特点如下:
- 从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 拦截请求和响应
- 转换请求数据和响应数据
- 自动转换 JSON 数据
GitHub源码地址:https://github.com/axios/axios
中文文档:http://www.axios-js.com/
1、为什么要使用 Axios
由于 Vue
是一个 视图层框架 并且作者(尤雨溪)严格准守 SoC (关注度分离原则),所以 Vue
并不包含 AJAX 的通信功能,为了解决通信问题,作者单独开发了一个名为 vue-resource
的插件,不过在进入 2.0 版本以后停止了对该插件的维护并推荐了 Axios
框架。
2、Axios的生命周期

10、vue-cli
ue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板
主要的功能:
- 统一的目录结构
- 本地调试
- 热部署
- 单元测试
- 集成打包上线
1、需要的环境
Node.js下载地址Node.js
Git下载地址:Git
确认nodejs安装成功:
- cmd 下输入
node -v
,查看是否能够正确打印出版本号即可!
- cmd 下输入
npm-v
,查看是否能够正确打印出版本号即可!
Node.js会默认去下载国外的,所以我们为了添加下载速度,需要配置淘宝镜像加速器
1 2 3 4 5 6 7 8
| # -g 就是全局安装 npm install cnpm -g
# 或使用如下语句解决 npm 速度慢的问题(如安装axios) npm install axios --registry=https://registry.npm.taobao.org
# 永久更改使用指定镜像(淘宝) npm config set registry https://registry.npm.taobao.org
|
虽然安装了cnpm,但是尽量少用!
安装地址在C盘的用户里面的AppData\Roaming\npm
2、安装 vue-cli
1 2 3
| npm install vue-cli -g #或 cnpm install vue-cli -g
|
测试是否安装成功

3、第一个vue-cli程序
选中一个文件夹进入cmd输入命令
1 2
| # 这里的 myvue 是项目名称,可以根据自己的需求起名 vue init webpack myvue
|
安装中会有一些选中,这里推荐
- Project name:项目名称,默认 回车 即可
- Project description:项目描述,默认 回车 即可
- Author:项目作者,默认 回车 即可
- Install vue-router:是否安装 vue-router,选择 n 不安装(后期需要再手动添加)
- Use ESLint to lint your code:是否使用 ESLint 做代码检查,选择 n 不安装(后期需要再手动添加)
- Set up unit tests:单元测试相关,选择 n 不安装(后期需要再手动添加)
- Setup e2e tests with Nightwatch:单元测试相关,选择 n 不安装(后期需要再手动添加)
- Should we run npm install for you after the project has been created:创建完成后直接初始化,选择 n,我们手动执行;运行结果!
初始化并且运行
1 2 3
| cd myvue #这个是你创建的名字 npm install npm run dev
|
然后输入http://localhost:8080就可以访问
也可以npm run build 将vue项目打包
打包以后可以直接放入nginx的html文件夹直接访问
4、vue-cli的目录结构

- build 和 config:WebPack 配置文件
- node_modules:用于存放 npm install 安装的依赖文件
- src: 项目源码目录
- static:静态资源文件
- .babelrc:Babel 配置文件,主要作用是将 ES6 转换为 ES5
- .editorconfig:编辑器配置
- eslintignore:需要忽略的语法检查配置文件
- .gitignore:git 忽略的配置文件
- .postcssrc.js:css 相关配置文件,其中内部的 module.exports 是 NodeJS 模块化语法
- index.html:首页,仅作为模板页,实际开发时不使用
- package.json:项目的配置文件
- name:项目名称
- version:项目版本
- description:项目描述
- author:项目作者
- scripts:封装常用命令
- dependencies:生产环境依赖
- devDependencies:开发环境依赖
5、src目录介绍
src
目录是项目的源码目录,所有代码都会写在这里
1、main.js
main.js是入口文件,里面会默认生成以下代码
1 2 3 4 5 6 7 8 9 10 11
| import Vue from 'vue' import App from './App'
Vue.config.productionTip = false
new Vue({ el: '#app', components: { App }, template: '<App/>' })
|
代码分析
import Vue from 'vue'
:ES6 写法,会被转换成 require(“vue”);
import App from './App'
:意思同上,但是指定了查找路径,./ 为当前目录
Vue.config.productionTip = false
:关闭浏览器控制台关于环境的相关提示
new Vue({...})
:实例化 Vue
el: '#app'
:查找 index.html 中 id 为 app 的元素
template: '<App/>'
:模板,会将 index.html 中的App替换
omponents: { App }
:引入组件,使用的是 import App from ‘./App’ 定义的 App 组件;
2、App.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <template> <div id="app"> <img src="./assets/logo.png"> <HelloWorld/> </div> </template>
<script> import HelloWorld from './components/HelloWorld'
export default { name: 'App', components: { HelloWorld } } </script>
<style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
|
- template:HTML 代码模板,会替换 中的内容
- import HelloWorld from ‘./components/HelloWorld’:引入 HelloWorld 组件,用于替换 template 中的
- export default{…}:导出 NodeJS 对象,作用是可以通过 import 关键字导入
- name: ‘App’:定义组件的名称
- components: { HelloWorld }:定义子组件
11、安装Webpack
1、安装
安装:
1 2
| npm install webpack -g npm install webpack-cli -g
|
测试是否安装成功:
1 2
| webpack -v webpack-cli -v
|
2、webpack.config.js 配置文件
- entry:入口文件,指定 WebPack 用哪个文件作为项目的入口
- output:输出,指定 WebPack 把处理完成的文件放置到指定路径
- module:模块,用于处理各种类型的文件
- plugins:插件,如:热更新、代码重用等
- resolve:设置路径指向
- watch:监听,用于设置文件改动后直接打包
使用webpack命令即可打包
3、使用webpack
1、创建目录modules,用于放js模块等资源
2、创建一个js文件
1 2 3
| exports.testznsd =function(){ document.write("<h1>测试</h1>") }
|
3、在创建一个main.js的入口文件
1 2
| let test= require("./test") test.testznsd()
|
4、在项目目录下创建webpack.config.js 配置文件
1 2 3 4 5 6
| module.exports = { entry: "./modules/main.js", output: { filename: "./js/app.js" } };
|
5、使用webpack打包
6、随便创建一个html文件引入打包后的js即可调用
12、Vue-Router
1、介绍
Vue Router 是 Vue 官方的路由管理器。它和 Vue 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:
- 嵌套的路由/视图表
- 模块化的、基于组件的路由配置
- 路由参数、查询、通配符
- 基于 Vue 过渡系统的视图过渡效果
- 细粒度的导航控制
- 带有自动激活的 CSS class 的链接
- HTML5 历史模式或 hash 模式,在 IE9 中自动降级
- 自定义的滚动条行为
2、下载
需要进入你vue-cli创建的项目先查询package.json查询是否安装,然后在安装
1
| npm install vue-router --save-dev
|
3、使用
1、创建views文件内创建俩个vue文件,一个Main.vue,一个Content.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <template> <div> <h1>主页面</h1> <!--这个main的,Content为页面内容,也可以自定义--> </div> </template>
<script> export default { name: "Main" <!--这个在创建的时候会自动生成--> } </script>
<style scoped> </style>
|
2、创建router文件夹中创建index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import Vue from "vue"; import Router from "vue-router"; import Main from "../views/Main"; import Content from "../views/Content";
Vue.use(Router)
export default new Router({ routes:[{ name:"main", path: "/main", component:Main },{ name:"content", path: "/content", component:Content } ] })<!--创建路由器对象-->
|
3、在main.js中引入路由
1 2 3 4 5 6 7 8 9 10 11 12 13
| import Vue from 'vue' import App from './App' import router from './router/index'
Vue.config.productionTip = false
new Vue({ el: '#app', router, components: { App }, template: '<App/>' })
|
4、在App.vue中添加
1 2 3
| <router-link to="/main">主页面</router-link> <router-link to="/content">内容</router-link> <router-view /> <!--不加这个则会不显示内容-->
|
即可直接使用npm run dev
13、ElementUI使用
1、安装ElementUI
1 2 3
| npm i element-ui -S # 安装 SASS 加载器 cnpm install sass-loader node-sass --save-dev
|
2、导入ElementUI
在 main.js 中写入
1 2 3 4 5 6 7 8 9 10 11
| import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; import App from './App.vue';
Vue.use(ElementUI);
new Vue({ el: '#app', render: h => h(App) });
|
注意:不要直接cv,一步一步粘贴到指定位置
3、基本使用
直接去官网粘贴代码即可使用
Element
14、富文本编辑器
1、安装富文本编辑器组件
1
| npm install vue-quill-editor --save
|
2、页面对应黏贴就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <template> <el-card style="height: 610px;"> <quill-editor v-model="content" ref="myQuillEditor" style="height: 500px;" :options="editorOption"> </quill-editor> </el-card> </template>
<script> import { quillEditor } from 'vue-quill-editor' import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' import 'quill/dist/quill.bubble.css' export default { name: 'FuncFormsEdit', components: { quillEditor }, data() { return { content: null, editorOption: {} } } }
</script>
<style scoped> </style>
|
3、实现自定义上传图片接口
1、引入图片上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <template> <div> <!-- 图片上传组件辅助--> <el-upload class="avatar-uploader" :action="serverUrl" name="img" :headers="header" :show-file-list="false" :on-success="uploadSuccess" :on-error="uploadError" :before-upload="beforeUpload"> </el-upload> <!--富文本编辑器组件--> <el-row v-loading="uillUpdateImg"> <quill-editor v-model="detailContent" ref="myQuillEditor" :options="editorOption" @change="onEditorChange($event)" @ready="onEditorReady($event)" > </quill-editor> </el-row> </div> </template> <script> export default { data() { return { quillUpdateImg: false, // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示 serverUrl: '', // 这里写你要上传的图片服务器地址 header: {token: sessionStorage.token}, // 有的图片服务器要求请求头需要有token之类的参数,写在这里 detailContent: '', // 富文本内容 editorOption: {} // 富文本编辑器配置 } }, methods: { // 上传图片前 beforeUpload(res, file) {}, // 上传图片成功 uploadSuccess(res, file) {}, // 上传图片失败 uploadError(res, file) {} } } </script>
|
2、修改data数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| export default { data() { return { serverUrl: '', header: {token: sessionStorage.token}, detailContent: '', editorOption: { placeholder: '', theme: 'snow', modules: { toolbar: { container: toolbarOptions, handlers: { 'image': function (value) { if (value) { document.querySelector('#quill-upload input').click() } else { this.quill.format('image', false); } } } } } } } } }
|
3、配置工具栏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <script> // 工具栏配置 const toolbarOptions = [ ['bold', 'italic', 'underline', 'strike'], // toggled buttons ['blockquote', 'code-block'],
[{'header': 1}, {'header': 2}], // custom button values [{'list': 'ordered'}, {'list': 'bullet'}], [{'script': 'sub'}, {'script': 'super'}], // superscript/subscript [{'indent': '-1'}, {'indent': '+1'}], // outdent/indent [{'direction': 'rtl'}], // text direction
[{'size': ['small', false, 'large', 'huge']}], // custom dropdown [{'header': [1, 2, 3, 4, 5, 6, false]}],
[{'color': []}, {'background': []}], // dropdown with defaults from theme [{'font': []}], [{'align': []}], ['link', 'image', 'video'], ['clean'] // remove formatting button ] </script>
|
4、修改editorOption属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| export default { data() { return { editorOption: { placeholder: '', theme: 'snow', modules: { toolbar: { container: toolbarOptions, handlers: { 'image': function (value) { if (value) { alert(1) } else { this.quill.format('image', false); } } } } } } } } }
|
5、修改editorOption内属性handlers
1 2 3 4 5 6 7 8 9 10
| handlers: { 'image': function (value) { if (value) { document.querySelector('.avatar-uploader input').click() } else { this.quill.format('image', false); } } }
|
6、修改上传图片的回调方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| beforeUpload() { this.quillUpdateImg = true }, uploadSuccess(res, file) { let quill = this.$refs.myQuillEditor.quill if (res.code === '200' && res.info !== null) { let length = quill.getSelection().index; quill.insertEmbed(length, 'image', res.info) quill.setSelection(length + 1) } else { this.$message.error('图片插入失败') } this.quillUpdateImg = false },
uploadError() { this.quillUpdateImg = false this.$message.error('图片插入失败') }
|
15、绘画饼图
1、安装插件
1
| npm install echarts --save
|
2、main.js里面引入echarts
1 2 3
| import echarts from 'echarts' Vue.prototype.$echarts = echarts
|
3、插入代码
对应粘贴代码即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| <template> <div> <div id="chartPie" class="pie-wrap"></div> </div> </template>
<script> import echarts from "echarts"; require("echarts/theme/macarons"); //引入主题,可以不引入,有默认的 export default { data() { return {}; }, mounted() { //如果你需要多个,调用下面方法即可 this.drawPieChart(); }, methods: { //需要多个,多复制几次这个方法,修改一下即可 drawPieChart() { this.chartPie = echarts.init( document.getElementById("chartPie"), "macarons" ); this.chartPie.setOption({ //显示在上面的文字 tooltip: { trigger: "item", // formatter: "{a}<br/>{b}: <br/>{c}({d}%)", 其中 {a}指向name名称(访问来源) formatter: "{b}: <br/>{c}({d}%)", }, legend: { data: ["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"], right: 500, orient: "vertical", }, series: [ { name: "访问来源", type: "pie", //圆圈的粗细 radius: ["50%", "80%"], //圆圈的位置 center: ["50%", "50%"], data: [ { value: 335, name: "直接访问", }, { value: 310, name: "邮件营销", }, { value: 234, name: "联盟广告", }, { value: 135, name: "视频广告", }, { value: 1548, name: "搜索引擎", }, ], //动画持续时间:单位毫秒 animationDuration: 2000, //控制是否显示指向文字的,默认为true label: { show: false, position: "center", }, }, ], }); }, }, }; </script>
<style lang="scss" scoped> .pie-wrap { width: 100%; height: 126px; } </style>
|