目录
注:easy-mock,一个在线模拟后台的数据平台
# -D表示只在开发环境中使用
npm install mockjs -D
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
//增加配置
MOCK:'true'
})
module.exports = {
NODE_ENV: '"production"',
//新增mockjs配置
MOCK:'false'
}
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
//开发环境下才会引入mockjs,新增
//import是ES6标准中的模块化解决方案,require是node中遵循CommonJS规范的模块化解决方案
//后者支持动态引入,也就是require(${path}/xx.js)
process.env.MOCK && require('@/mock')
......
注意:import是ES6标准中的模块化解决方案,require是node中遵循CommonJS规范的模块化解决方案,后者支持动态引入,也就是require(${path}/xx.js)
1) 在src目录下创建mock目录,定义mock主文件index.js,并在该文件中定义拦截路由配置,/src/mock/index.js。 index.js内容如下:
//引入mockjs,npm已安装
import Mock from 'mockjs'
//引入封装的请求地址
import action from '@/api/action'
//全局设置:设置所有ajax请求的超时时间,模拟网络传输耗时
Mock.setup({
//延时400s请求到数据
// timeout: 400
//延时200-400s请求到数据
timeout: 200 - 400
})
为每个组件(*.vue)准备模拟数据。然后导入到mock/index.js中
在mock/index.js中导入,设置请求url,模拟发送数据
。。。。。。
//将模拟数据导入到这里。
import loginData from '@/mock/json/login-mock.js'
//获取请求的url
let url = action.getFullPath("SYSTEM_USER_DOLOGIN");
//通过mockjs模拟发送请求
//url 请求url
//post 请求方式
//loginData 模拟数据
//mockjs会拦截发送的请求,并使用模拟数据充当真实返回的响应数据
//Mock.mock(url, "post", loginData);
//如果请求既可以是get又可以是post的请求方式可以使用如下方式:
Mock.mock(url, /post|get/i, loginData);
//为增加可读性loginData与mack/index.js中导入的名称对应
const loginData = {
"success": true,
"msg": "密码正确"
}
//将当前模块导出,导出后index.js才可以导入
export default loginData
//修改url的获取方式,url已经配置在了action.js中
//post请求方式
/* let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
this.axios.post(url, params).then(resp => {
console.log(resp);
}).catch(resp => {}); */
//get请求方式,注意:与post请求不同的是参数的设置方式
let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
this.axios.post(url, {params: params}).then(resp => {
console.log(resp);
}).catch(resp => {});
//如果请求既可以是get又可以是post的请求方式可以使用如下方式:
//Mock.mock(url, /post|get/i, loginData);
//前端调试模式
Mock.mock(url, /post|get/i, (options) => {
// 最佳实践,
debugger;
return Mock.mock(loginData);
});
//静态响应
/* const loginData = {
"success": true,
"msg": "密码正确"
} */
//随机响应
const loginData = {
//1表示50%概率
"success|1": true,
//2-3指重复2到3次
"msg|2-3": "msg"
}
//get请求方式
let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
this.axios.post(url, {
params: params
}).then(resp => {
//提示成功和失败,主要演示获取响应数据的方法
if (resp.data.success) {
//可以到element-ui官网查看用法
this.$message({
message: '登录成功',
type: 'success'
});
}else{
this.$message({
message: '登录失败',
type: 'error'
});
}
console.log(resp);
}).catch(resp => {});
<!-- 加入忘记密码和注册链接 -->
<el-row style="text-align:center;margin-top: -5px;">
<el-link type="primary" style="margin-right: 40px;">忘记密码</el-link>
<el-link type="primary">用户注册</el-link>
</el-row>
<template>
<div class="login-wrap">
<el-form class="login-container">
<h1 class="title">用户登录</h1>
<el-form-item label="账户">
<el-input type="text" v-model="userNo" placeholder="账户" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input type="password" v-model="userPwd" placeholder="密码" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="确认密码">
<el-input type="password" v-model="userPwd2" placeholder="确认密码" autocomplete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="register()" style="width:48%">注册</el-button>
<el-button type="primary" @click="cancel()" style="width:48%">返回</el-button>
</el-form-item>
</el-form>
</div>
</template>
export default {
name: 'Register',
data: function() {
return {
userNo: '',
userPwd: '',
userPwd2: ''
}
},
methods: {
register: function() {
},
gotoLogin: function() {
//获取路由,转换到根路径,及登录组件
this.$router.push('/');
}
}
}
通过路由跳转,常用方式:
this.router.push(): 跳转到不同的url,这个方法会向history栈添加一个记录,点击后退会返回到上一个页面 this.router.replace() : 同样是跳转到指定的url,但是这个方法不会向history里面添加新的记录,点击返回,会跳转到上上一个页面。上一个记录是不存在的。 this.$router.go(n):相对于当前页面向前或向后跳转多少个页面,类似 window.history.go(n)。n可为正数可为负数。负数返回上一个页面
//首先导入组件
import Login from '@/views/Login'
import Register from '@/views/Register'
Vue.use(Router)
export default new Router({
routes: [
{
//配置路由,根路径访问Login组件
path: '/',
name: 'Login',
component: Login
},
{
//增加注册组件路由
path: '/Register',
name: 'Register',
component: Register
}
]
})
<template>
<el-container class="main-container">
<!-- 侧边栏有折叠效果,通过class控制折叠还是显示的效果 -->
<el-aside v-bind:class="asideClass">
<LeftAside></LeftAside>
</el-aside>
<el-container>
<el-header class="main-header">
<TopNav></TopNav>
</el-header>
<el-main class="main-center">Main</el-main>
</el-container>
</el-container>
</template>
// 导出模块
export default {
//组件名称
name: 'Main',
data: function() {
return {
asideClass: 'main-aside',
}
},
//将import的组件定义的Main中以便于使用
components:{
TopNav, LeftAside
}
};
....
{
//增加Main组件路由
path: '/Main',
name: 'Main',
component: Main
}
export default {
//定义组件名称
name:'TopNav',
data: function() {
return {
//默认展示侧边栏
opened:true,
//require是node中遵循CommonJS规范的模块化解决方案,支持动态引入
imgshow: require('../assets/img/show.png'),
imgsq: require('../assets/img/sq.png')
}
}
}
ES6新特性:使用export和import实现模块化
主要介绍:es6新增的变量声明方式,es6新增的数组方法,字符串模板,箭头函数 =>,解构赋值,class类,for of循环和新增的字符串方法 let 关键字用来声明变量(类似于旧javaScript中的var声明)但是使用 let 声明的变量有以下几个特点 ↓ 1、不存在变量声明提升 2、存在块级作用域 3、存在暂时性死区 4、不允许重复声明 for(作用域A){作用域B} 循环的应用; const 关键字用来声明常量,其使用规则除了声明之后不能修改之外,其他特征和let一样 ↓ const的本质:const定义的变量并非是常量,并非不可变。不允许被改变的是地址,不是变量,使用const定义对象或者是数组时,其实是可变。 但是:我们不能对常量数值进行赋值,会报错 indexof(val,index) 参数1是我们要寻找的项,参数2是我们起始寻找项的索引号 forEach(function(val,index){ }) 对数组进行循环遍历,这个方法没有返回值 filter(callback) 功能上遍历和过滤,返回符合条件的元素,filter在循环的时候会判定一下是true还是false,是true才会返回。 map(callback) map可以改变当前循环的值,返回一个新的被改变过值之后的数组map需return),一般用来处理需要修改某一个数组的值。映射 some() 数组中有一个数组元素满足条件,就返回true every() 数组中所有数组元素满足条件,就返回true reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值 reduceRight() 同上 ↑ reduce(),区别是从右到左 当我们需要输出一段话的时候 旧的写法: 模板字符串的写法 我们在页面中输出一个表格,里面字符串带表达式,等等 箭头函数是函数以往写法的一种简写形式,只能以赋值形式存在,箭头函数如果只有一个参数的情况下,可以直接写参数省略括号使用 也是有好处的,需要:想让定时器或者延时器里面的this指向的也是对象,怎么办呢? 箭头函数本身上面是没有this,它的this可以去上一层去找 箭头函数 ↓ 可以嵌套 对象解构 repeat() 重复功能 ()参数表示重复多少遍 includes() 判定字符串中是否存在某个字符串 startsWith() endsWith() 也是判定字符串中是否存在某个字符串 padStart() 用于头部补全 padEnd() 用于尾部补全。 trimStart()和trimEnd() trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。