0%

Vue_笔记(狂神)

狂神Vue前端教学视频学习笔记,包括Vue基本语法、Vue双向绑定、Axios异步通信、Vue简单案例等内容

1 前端知识体系

1.1 VUE概述

Vue (读音/vju/, 类似于view)是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。

Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库(如: vue-router: 跳转,vue-resource: 通信,vuex:管理)或既有项目整合。

官网:https://cn.vuejs.org/v2/guide/

1.2 前端三要素

  • HTML(结构):超文本标记语言(Hyper Text Markup Language),决定网页的结构和内容
  • CSS(表现):层叠样式表(Cascading Style Sheets),设定网页的表现样式。
  • JavaScript(行为):是一种弱类型脚本语言,其源码不需经过编译,而是由浏览器解释运行,用于控制网页的行为

1.3 JavaScript框架

  • JQuery:大家熟知的JavaScript库,优点就是简化了DOM操作,缺点就是DOM操作太频繁,影响前端性能;在前端眼里使用它仅仅是为了兼容IE6,7,8;
  • Angular:Google收购的前端框架,由一群Java程序员开发,其特点是将后台的MVC模式搬到了前端并增加了模块化开发的理念,与微软合作,采用了TypeScript语法开发;对后台程序员友好,对前端程序员不太友好;最大的缺点是版本迭代不合理
  • React:Facebook 出品,一款高性能的JS前端框架;特点是提出了新概念 【虚拟DOM】用于减少真实 DOM 操作,在内存中模拟 DOM操作,有效的提升了前端渲染效率;缺点是使用复杂,因为需要额外学习一门【JSX】语言;
  • Vue:一款渐进式 JavaScript 框架,所谓渐进式就是逐步实现新特性的意思,如实现模块化开发、路由、状态管理等新特性。其特点是综合了 Angular(模块化)和React(虚拟 DOM) 的优点;
  • Axios:前端通信框架;因为 Vue 的边界很明确,就是为了处理 DOM,所以并不具备通信能力,此时就需要额外使用一个通信框架与服务器交互;当然也可以直接选择使用jQuery 提供的AJAX 通信功能;

前端三大框架:Angular、React、Vue

1.4 前后端分离演变

  • 1 后端为主的MVC时代(JSP时代)

优点:MVC是一个非常好的协作模式, 能够有效降低代码的耦合度从架构上能够让开发者明白代码应该写在哪里。

缺点:前端开发重度依赖开发环境,开发效率低。前后端职责纠缠不清:模板引擎功能强大,依旧可以通过拿到的上下文变量来实现各种业务逻辑。这样,只要前端弱势一点,往往就会被后端要求在模板层写出不少业务代码。

  • 2 基于AJAX带来的SPA时代

SPA(Single Page Application) 单页面应用时代

优点: 前后端的分工非常清晰, 前后端的关键协作点是AJAX接口。

缺点:SPA应用大多以功能交互型为主,JavaScript代码过十万行很正常。大量JS代码的组织,与View层的绑定等,都不是容易的事情。

1595237457081
  • 3 前端为主的MVC时代 (MVC、MVP、MVVM)

优点:前端开发的复杂度可控:前端代码很重,但合理的分层,让前端代码能各司其职。这一块蛮有意思的,简单如模板特性的选择,就有很多很多讲究。并非越强大越好,限制什么,留下哪些自由,代码应该如何组织,所有这一切设计,得花一本书的厚度去说明。

缺点:全异步, 对SEO不利。往往还需要服务端做同步渲染的降级方案。

  • 4 Node JS带来的全栈时代

随着Node JS的兴起, JavaScript开始有能力运行在服务端。

2 第一个Vue程序

2.1 什么是MVVM

先看看MVC模型

  • model 负责控制业务操作、保存数据、修改数据等操作。包含Service、Dao的操作
  • View 视图层负责展示数据模型和提供用户操作的界面
  • Contrller 控制器用于接受用户的请求、并讲该请求调用具体的业务层去实现,获取结果后、进行视图的跳转

1568424227281

再看看MVVM:

MVVM 源自于经典的MVC (ModI-View-Controller) 模式。MVVM的核心是ViewModel层,负责转换Model中的数据对象来让数据变得更容易管理和使用,其作用如下:

  • 该层向上与视图层进行双向数据绑定
  • 向下与Model层通过接口请求进行数据交互

20200720222239842

我的理解其实是 “多加”了一个ViewModel层,用来双向绑定View和Model层,而原来的Controller层被“封装”到了现在的Model层中,Model层现在负责处理后台的业务逻辑了。

==ViewModel层中可以做一些以前控制层做的事情,写一个业务的逻辑代码?并且不需要刷新页面就可以直接更新View视图?是这样么==

2.2 为什么用MVVM模型

MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model)。

  • View:还是视图层, 也就是用户界面,用来展示数据和操作。

  • Model: 泛指后端进行的各种业务逻辑处理和数据操控。主要工作在于和前端约定统一的接口规则

  • ViewModel:是由前端开发人员组织生成和维护的视图数据层

    • 前端开发者对从后端获取的Model数据进行转换处理, 做二次封装, 以生成符合View层使用预期的视图数据模型。
    • 视图状态和行为都封装在了View Model里。这样的封装使得View Model可以完整地去描述View层。由于实现了双向绑定, View Model的内容会实时展现在View层, 这是激动人心的,因为避免了操纵DOM来更新页面

总结:View层展现的不是Model层的数据, 而是ViewModel的数据, 由ViewModel负责与Model层交互, 这就完全解耦了View层和Model层, 这个解耦是至关重要的, 它是前后端分离方案实施的重要一环。

2.3 第一个Vue程序

Vue.js就是一个MVVM的实现者, 他的核心就是实现了DOM监听与数据绑定。 Vue.js用于连接视图和数据的中间件,作为实际的ViewModel而存在

1 引入Vue.js

2 编写view,并通过id将vue实例变量与view绑定

  • 1 直接建一个html文件,引入Vue.js即可
1
2
3
4
5
6
<!--1.压缩版的Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>

<!--2.完整版的Vue.js-->
<script src=“https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js”></script>
  • 2 编写view,并通过id将vue实例变量与view绑定
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--view层,模板-->
<div id="app">
{{message}}
</div>

<!--1.导入Vue.js-->
<script
src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>

<!--2.创建一个vue对象,通过Id:app与视图层绑定-->
<script type="text/javascript">
var vm = new Vue({
el:"#app",
/*Model:数据*/
data:{
message:"hello,vue!"
}
});
</script>

</body>
</html>

说明:

el: '#vue':绑定元素的ID

data:{message:'Hello Vue!'}:数据对象中有一个名为message的属性,并设置了初始值 Hello Vue!

  • 3 运行结果:

可以在控制台直接输入vm.message来修改值, 中间是可以省略data的, 在这个操作中, 我并没有主动操作DOM, 就让页面的内容发生了变化, 这就是借助了Vue的数据绑定功能实现的; MV VM模式中要求View Model层就是使用观察者模式来实现数据的监听与绑定, 以做到数据与视图的快速响应。

image-20210625122055568

3 Vue的基本语法

快速预览:

1 v-bind 绑定元素特性,将这个元素节点的title特性和Vue实例的message属性保持一致”。

2 v-if v-else v-else=if 判断语句

3 v-for 循环语句

3.1 v-bind 绑定元素特性

vue中常用的属性绑定v-bind、第一种是完整语法,第二种是缩写方式。

示例一:将元素的title属性和vue实例的相关字段进行绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--view层-->
<div id="demo">
<!--将这个元素节点的 title 属性和 Vue 实例的message 属性绑定到一起。-->
<div v-bind:title="message">DOM元素属性绑定</div>
<div :title="msg">DOM元素属性绑定</div>
</div>

<!--导入Vue.js-->
<script
src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>

<script>
var demo1 = new Vue({
el:'#demo',
data:{
message:'aaa',
msg:'bbb',
}
})
</script>

示例二:将其他的属性字段进行绑定,最常见的是对于样式的绑定,即class和style属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--view层-->
<div id="demo">
<div v-bind:class="{active:isActive,'text-danger':hasError}">给class绑定一个对象,动态切换class</div>
<div :class="{active:isActive,'textDanger':!isActive}">给class绑定一个对象,动态切换class</div>
<div :class="classObj">给class绑定一个对象,动态切换class</div>
</div>

<!--导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>

<script>
var demo1 = new Vue({
el:'#demo',
data:{
isActive:true,
hasError:true,
classObj:{
'textColor':true,
'textSize':false
}
}
})
</script>
image-20210625131012282

3.2 v-if v-else v-else=if 判断语句

直接看代码吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--view层,模板-->
<div id="demo">
<h1 v-if="type==='A'">type的值是A</h1>
<h1 v-else-if="type==='B'">type的值是B</h1>
<h1 v-else-if="type==='C'">type的值是C</h1>
<h1 v-else>type的值是其他</h1>
</div>

<!--1.导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:"#demo",
/*Model:数据*/
data:{
type: 'A'
}
});
</script>
image-20210625142236188

3.3 v-for

view视图层代码:

  • 注:items是数组,item是数组元素迭代的别名。我们之后学习的Thymeleaf模板引擎的语法和这个十分的相似!
1
2
3
4
5
6
<div id="app">
<li v-for="(item,index) in items">
{{item.message}}---{{index}}
</li>

</div>

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--view层,模板-->
<div id = "demo">
<li v-for="(item,index) in items">
元素和索引分别为:{{item.message}},{{index}}
</li>
</div>

<!--1.导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:"#demo",
// model 数据
data:{
items:[
{message:'AA'},
{message:'BB'},
{message:'CC'},
]
}
});
</script>

image-20210625144129557

  • 还可以在控制台追加元素:

在控制台输入vm.items.push({message:'DD'}),尝试追加一条数据,你会发现浏览器中显示的内容会增加一条DD.

image-20210625144337948

3.4 v-on 事件绑定

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>狂神说Java</p>

<!--view层 模板-->
<div id="app">
<button v-on:click="sayHi">Click Me</button>
</div>
</body>

<!--导入js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm = new Vue({
el: "#app",
data: {
message: "你点我干嘛?"
},
methods: {
//方法必须绑定在Vue的Methods对象中,v-on:事件
sayHi: (function (event) {
alert(this.message)
})
}
})
</script>
</html>
image-20210625145712923

4 Vue双向绑定 v-model

为什么要实现数据的双向绑定?

在Vue.js 中,如果使用vuex ,实际上数据还是单向的,之所以说是数据双向绑定,这是用的UI控件来说,对于我们处理表单,Vue.js的双向数据绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项,方便跟踪;局部性数据流使用双向,简单易操作。

在表单中使用双向数据绑定

你可以用v-model指令在表单

注意:v-model会忽略所有元素的value、checked、selected特性的初始值而总是将Vue实例的数据作为数据来源,你应该通过JavaScript在组件的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
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<!--view层 模板-->
<div id="app">
下拉框:
<select v-model="selected">
<option value="" disabled>-请选择-</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<p>value:{{selected}}</p>
</div>
</body>

<!--导入js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm = new Vue({
el: "#app",
data: {
selected: ""
}
})
</script>
</html>

image-20210625150723173

5 Axios异步通信

5.1 什么是Axios

  Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 她的主要作用就是实现AJAX异步通信,这里就是替代jQuery的AJAX,其功能特点如下:

  • 从浏览器中创建XMLHttpRequests
  • 从node.js创建http请求
  • 支持Promise API[JS中链式编程]
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防御XSRF(跨站请求伪造)

GitHub:https://github.com/axios/axios

中文文档:http://www.axios-js.com/

​ 由于Vue.js是一个视图层框架并且作者(尤雨溪) 严格准守SoC(关注度分离原则)所以Vue.js并不包含AJAX的通信功能, 为了解决通信问题, 作者并推荐使用Axios框架。少用jQuery, 因为它操作Dom太频繁!

5.2 第一个Axios应用程序

1 先建一个保存JSON数据的文件data.json

2 引入vue的组件 和 axios的组件

3 使用data()函数和mounted()钩子函数,获取JSON格式的数据,保存在Vue的对象变量中

4 view视图层展示 获取到的变量

  • 1 先建一个保存JSON数据的文件data.json
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
{
"name": "狂神说Java",
"url": "https://blog.kuangstudy.com",
"page": 1,
"isNonProfit": true,
"address": {
"street": "含光门",
"city": "陕西西安",
"country": "中国"
},
"links": [
{
"name": "bilibili",
"url": "https://space.bilibili.com/95256449"
},
{
"name": "狂神说Java",
"url": "https://blog.kuangstudy.com"
},
{
"name": "百度",
"url": "https://www.baidu.com/"
}
]
}
  • 2 引入vue的组件 和 axios的组件
1
2
3
4
<!--引入vue、axios的组件-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  • 3 使用data()函数和mounted()钩子函数,获取JSON格式的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script type="text/javascript">
var vm = new Vue({
el:"#vue",
//data()函数
data(){
return{
info:{
name:null,
address:{
country:null,
city:null,
street:null
},
url:null
}
}
},
mounted(){//钩子函数
axios
.get('data.json')
.then(response=>(this.info=response.data));
}
});
</script>
  • 4 view视图层展示 获取到的变量
1
2
3
4
5
<div id="vue"  v-cloak>
<div>地名:{{info.name}}</div>
<div>地址:{{info.address.country}}--{{info.address.city}}--{{info.address.street}}</div>
<div>链接:<a v-bind:href="info.url" target="_blank">{{info.url}}</a> </div>
</div>
image-20210625154044593

说明:

  1. 在这里使用了v-bind将a:href的属性值与Vue实例中的数据进行绑定
  2. 使用axios框架的get方法请求AJAX并自动将数据封装进了Vue实例的数据对象中
  3. 我们在data中的数据结构必须和Ajax响应回来的数据格式匹配!

5.3 Vue的生命周期

官方文档:https://cn.vuejs.org/v2/guide/instance.html#生命周期图示

Vue实例有一个完整的生命周期,也就是从开始创建初女台化数据、编译模板、挂载DOM、渲染一更新一渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。

在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册JS方法,可以让我们用自己注册的JS方法控制整个大局,在这些事件响应方法中的this直接指向的是Vue的实例。

1595253373596

6 第一个vue-cli项目

6.1 vue-cli 环境

(简单来说就是类似我们后端的maven,新建vue项目的一个骨架)

  • vue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板
  • 预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个估计项目就是脚手架,我们的开发更加的快速;

环境安装

1 安装nodejs

2 安装Node.js淘宝镜像加速器(cnpm)

3 安装vue-cli

  • 1 安装nodejs

Node.js:http://nodejs.cn/download/ 安装就是无脑的下一步就好,安装在自己的环境目录下

cmd下输入node -v,查看是否能够正确打印出版本号即可!

cmd下输入npm -v,查看是否能够正确打印出版本号即可!

  • 2 安装Node.js淘宝镜像加速器(cnpm)
1
2
# -g 就是全局安装
npm install cnpm -g
  • 3 安装vue-cli
1
2
3
cnpm instal1 vue-cli-g
#测试是否安装成功#
vue list

安装的位置默认:C:\Users\administrator\AppData\Roaming\npm

6.2 第一个vue-cli项目

1 创建一个Vue项目,我们随便建立一个空的文件夹在电脑上,我这里在D盘下新建一个目录

1
D:\Project\vue-study;

2 创建一个基于webpack模板的vue应用程序

1
2
3
4
5
#1、首先需要进入到对应的目录 cd D:\Project\vue-study
#2、这里的myvue是顶日名称,可以根据自己的需求起名
vue init webpack myvue

# 一路都选择no即可;

3 初始化并运行

1
2
3
cd myvue
npm install
npm run dev

执行完成后,目录多了很多依赖,http://localhost:8080/运行结果如下(运行完之后用ctrl+c关闭)

image-20210625164125927

6.3 用IDEA打开 看看项目结构

目录结构如下:src下写源码

image-20210625164949201
  • 主页面index.html
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>myvue</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
  • src下的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

/* eslint-disable no-new */
new Vue({
el: '#app',
components: { App },
template: '<App/>'
})
  • components下的HelloWorld.vue,,这里我把删一点 只留一个图片和几个字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<h2>吴康最帅</h2>

</div>
</template>

<script>
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

运行结果如下:

image-20210625165607461

7 Webpack打包

7.1 Webpack的安装和配置

WebPack 是一款模块加载器兼打包工具,说白了就是能将ES6的项目代码打包后、在ES5的浏览器上可以运行。

安装命令如下:

1
2
npm install webpack -g
npm install webpack-cli -g

测试安装成功: 输入以下命令有版本号输出即为安装成功

1
2
webpack -v
webpack-cli -v

配置:创建 webpack.config.js配置文件

  • entry:入口文件, 指定Web Pack用哪个文件作为项目的入口
  • output:输出, 指定WebPack把处理完成的文件放置到指定路径
  • module:模块, 用于处理各种类型的文件
  • plugins:插件, 如:热更新、代码重用等
  • resolve:设置路径指向
  • watch:监听, 用于设置文件改动后直接打包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module.exports = {
entry:"",
output:{
path:"",
filename:""
},
module:{
loaders:[
{test:/\.js$/,;\loade:""}
]
},
plugins:{},
resolve:{},
watch:true
}

  直接运行webpack命令打包

7.2 使用webpack

首先是打包部分、将一个项目打包:

1 创建项目(创建一个空文件夹,用idea打开)

2 创建一个名为modules的目录,用于放置JS模块等资源文件

3 在modules下创建模块文件,如hello.js,用于编写JS模块相关代码

1
2
3
4
5
6
7
8
//暴露一个方法
exports.sayHi = function() {
document.write("<h1>狂神说ES6</h1>")
}

exports.sayHi2 = function() {
document.write("<h1>狂神说ES6 2</h1>")
}

4 在modules下创建一个名为main.js的入口文件,用于打包时设置entry属性

1
2
3
4
//require 导入一个模块,就可以调用这个模块中的方法了
var hello = require("./hello");
hello.sayHi();
hello.sayHi2();

5 在项目目录下创建webpack.config.js配置文件,并使用webpack命令打包,命令就是webpack

1
2
3
4
5
6
module.exports = {
entry:"./modules/main.js",
output:{
filename:"./js/bundle.js"
}
}

打包完我们发现 主目录生成了一个dist文件 生成的打包文件路径为/ dist/js/bundle.js

image-20210626001521761

其次是运行打包好的js文件:

1 在主目录创建index.html 并导入bundle.js

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="dist/js/bundle.js"></script>
</head>
<body>

</body>
</html>

2 直接运行这个html页面,得到我们在hello中写的两个方法

image-20210626001711269

完毕。

8 vue-router路由

vue.js专注于视图,所以连跳转的功能都没有,需要借助Vue Router来实现路径的跳转。

Vue Router是Vue.js官方的路由管理器(路径跳转)。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌。

8.1 安装

打开命令行工具,进入你的项目目录,输入下面命令。

1
npm install vue-router --save-dev

安装完之后去node_modules路径看看是否有vue-router信息 有的话则表明安装成功

如果在一个模块化工程中使用它,必须要通过Vue.use()明确地安装路由功能:

1
2
3
4
import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter);

8.2 使用Vue Router的项目

1 创建一个名为 hello-vue 的工程

2 安装依赖,我们需要安装 vue-router、element-ui、sass-loader 和node-sass 四个插件

1
2
3
4
5
6
7
8
9
10
11
12
# 进入工程目录
cd hello-vue
# 安装 vue-router
npm install vue-router --save-dev
# 安装 element-ui
npm i element-ui -S
# 安装依赖
npm install
# 安装 SASS 加载器
cnpm install sass-loader node-sass --save-dev
# 启动测试
npm run dev

3 Npm命令解释

  • npm install moduleName:安装模块到项目目录下
  • npm install -g moduleName:-g 的意思是将模块安装到全局,具体安装到磁盘的哪个位置,要看 npm config prefix的位置
  • npm install moduleName -save:–save的意思是将模块安装到项目目录下,并在package文件的dependencies节点写入依赖,-S为该命令的缩写
  • npm install moduleName -save-dev:–save-dev的意思是将模块安装到项目目录下,并在package文件的devDependencies节点写入依赖,-D为该命令的缩写

4 创建成功后用idea打开,并删除净东西 创建views和router文件夹用来存放视图和路由

5 在views创建Main.vue

6 在views中创建Login.vue视图组件

7 创建路由。在 router 目录下创建一个名为 index.js 的 vue-router 路由配置文件

8 在main.js中配置相关。 main.js是index.html调用的 所以前面注册的组件要在这里导入

一定不要忘记扫描路由配置并将其用到new Vue中

9 在App.vue中配置显示视图

10 测试运行

1
npm run dev

各个步骤的文件:

  • Main.vue
1
2
3
4
5
6
7
8
9
10
<template>
<h1>首页</h1>
</template>
<script>
export default {
name: "Main"
}
</script>
<style scoped>
</style>
  • Login.vue(用的ElementUI中的代码)
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
88
<template>
<div>
<el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box">
<h3 class="login-title">欢迎登录</h3>
<el-form-item label="账号" prop="username">
<el-input type="text" placeholder="请输入账号" v-model="form.username"/>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" placeholder="请输入密码" v-model="form.password"/>
</el-form-item>
<el-form-item>
<el-button type="primary" v-on:click="onSubmit('loginForm')">登录</el-button>
</el-form-item>
</el-form>

<el-dialog
title="温馨提示"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose">
<span>请输入账号和密码</span>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="dialogVisible = false">确 定</el-button>
</span>
</el-dialog>
</div>
</template>

<script>
export default {
name: "Login",
data() {
return {
form: {
username: '',
password: ''
},

// 表单验证,需要在 el-form-item 元素中增加 prop 属性
rules: {
username: [
{required: true, message: '账号不可为空', trigger: 'blur'}
],
password: [
{required: true, message: '密码不可为空', trigger: 'blur'}
]
},

// 对话框显示和隐藏
dialogVisible: false
}
},
methods: {
onSubmit(formName) {
// 为表单绑定验证功能
this.$refs[formName].validate((valid) => {
if (valid) {
// 使用 vue-router 路由到指定页面,该方式称之为编程式导航
this.$router.push("/main");
} else {
this.dialogVisible = true;
return false;
}
});
}
}
}
</script>

<style lang="scss" scoped>
.login-box {
border: 1px solid #DCDFE6;
width: 350px;
margin: 180px auto;
padding: 35px 35px 15px 35px;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
box-shadow: 0 0 25px #909399;
}

.login-title {
text-align: center;
margin: 0 auto 40px auto;
color: #303133;
}
</style>

  • index.js:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import Vue from "vue";
import Router from "vue-router";
import Main from "../views/Main";
import Login from "../views/Login";

Vue.use(Router);

export default new Router({
routes: [
{
path: '/main',
component: Main
},
{
path: '/login',
component: Login
}
]
});

  • main.js:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import Vue from 'vue'
import App from './App'
//扫描路由配置
import router from './router'
//导入elementUI
import ElementUI from "element-ui"
//导入element css
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(router);
Vue.use(ElementUI)

new Vue({
el: '#app',
router,
render: h => h(App),//ElementUI规定这样使用
})

  • App.vue
1
2
3
4
5
6
7
8
9
10
11
12
<template>
<div id="app">
<router-link to="/login">login</router-link>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App',
}
</script>

运行结果

在这里插入图片描述

测试:在浏览器打开 http://localhost:8080/#/login
如果出现错误: 可能是因为sass-loader的版本过高导致的编译错误,当前最高版本是8.0.2,需要退回到7.3.1
去package.json文件里面的 “sass-loader”的版本更换成7.3.1,然后重新cnpm install就可以了;

9 实站上手项目

8.2就是一个简单的项目框架了…Vue先不看了。狂神讲的并不好。

-------------感谢阅读没事常来-------------