Vue开发指南(一)

Vue开发指南

编辑人 版本 日期
张岩 V 0.1 2020-05

目录
Vue开发指南
目录

  1. 开发工具
    1.1 Visual Studio Code(推荐)
    1.2 WebStorm
  2. 开发环境搭建
    2.1 安装Node.js
    2.2 安装Vue
    2.3 安装Vue-CLI(旧版本2.x)
    2.4 创建项目
    2.5 运行项目
    2.6 打包项目
    2.7 安装Vue CLI 3.x
  3. 开发框架和功能组件
    3.1 Vue
    3.2 Element
    3.3 VueX
    3.4 VueRouter
    3.5 Axios详解
    3.6 ES6以后新版特性
    3.7 Css3高级功能
    3.8 Sass
    3.9 Echarts
    3.10 TypeScript

1.1 Visual Studio Code(推荐)
1.1.1 下载
官网下载:https://code.visualstudio.com/
1.1.2 汉化中文
点击插件按钮搜索 Chinese, 在弹出的选项中选择第一个中文简体

1.1.3 Vscode更换主题
File(文件)- Preferences(首选项)- Color-Theme (颜色主题)

1.1.4 常用快捷键
 Ctrl + / (单行注释)
 Shift + Alt + A (多行注释)若要取消单行或多行注释在按一次该快捷键即可
 Ctrl + Shift + Enter (上方插入一行,鼠标光标在当前行的任意位置都可以直接换行到上一行)
 Ctrl + Enter (下方插入一行,鼠标光标在当前行的任意位置都可以直接换行到下一行)
 Alt + Shift + F (格式化代码,不需要全选中代码,直接格式化即可)
 Ctrl + Shift + F (查找文件)

1.2 WebStorm
官方下载地址:https://www.jetbrains.com/webstorm/
2. 开发环境搭建
2.1 安装Node.js
2.1.1 下载
官方下载地址:https://nodejs.org/en/
2.1.2 设置全局模块和缓存路径
 在nodejs安装路径下,新建node_global和node_cache两个文件夹

 设置缓存文件夹
npm config set cache “D:\vueProject\nodejs\node_cache”
 设置全局模块存放路径
npm config set prefix “D:\vueProject\nodejs\node_global”
2.1.3 系统变量
新增系统变量NODE_PATH

2.2 安装Vue
npm install vue -g
2.3 安装Vue-CLI(旧版本2.x)
cnpm install vue-cli -g
2.4 创建项目
 打开存放新建项目的文件夹
 打开开始菜单,输入 CMD,或使用快捷键 win+R,输入 CMD,敲回车,弹出命令提示符。打开你将要新建的项目目录

 根据模版创建新项目
在当前目录下输入“vue init webpack-simple 项目名称(使用英文)”。
vue init webpack-simple mytest

 初始化完成后的项目目录结构如下:

 安装工程依赖模块
定位到mytest的工程目录下,安装该工程依赖的模块,这些模块将被安装在:mytest\node_module目录下,node_module文件夹会被新建,而且根据package.json的配置下载该项目的modules
cd mytest
npm install
2.5 运行项目
npm run dev
2.6 打包项目
npm run build
2.7 安装Vue CLI 3.x
2.7.1 安装说明
 关于旧版本
Vue CLI 的包名称由 vue-cli 改成了 @vue/cli。 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vue-cli -g 或 yarn global remove vue-cli 卸载它。
 Node 版本要求
Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+)。你可以使用 nvm 或 nvm-windows 在同一台电脑中管理多个 Node 版本。
2.7.2 安装
npm install -g @vue/cli
检查其版本是否正确 (3.x):vue --version
2.7.3 创建项目
运行以下命令来创建一个新项目:
vue create hello-world
2.7.4 运行项目
npm run serve
3. 开发框架和功能组件
3.1 Vue
官方指南:https://cn.vuejs.org/v2/guide/
3.2 Element
官方开发组件:https://element.eleme.cn/#/zh-CN/component/installation
3.3 VueX
官方指南:https://vuex.vuejs.org/zh/guide/
3.4 VueRouter
官方指南:https://router.vuejs.org/zh/guide/essentials/named-routes.html
3.5 Axios详解
3.5.1 基础使用
 安装:
$ npm install axios
 执行 GET 请求
axios.get(’/user’, {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
 执行 POST 请求
axios.post(’/user’, {
firstName: ‘Fred’,
lastName: ‘Flintstone’
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
 响应结构
某个请求的响应包含以下信息
{
// data 由服务器提供的响应
data: {},
// status 来自服务器响应的 HTTP 状态码
status: 200,
// statusText 来自服务器响应的 HTTP 状态信息
statusText: ‘OK’,
// headers 服务器响应的头
headers: {},
// config 是为请求提供的配置信息
config: {},
// ‘request’
// request is the request that generated this response
// It is the last ClientRequest instance in node.js (in redirects)
// and an XMLHttpRequest instance the browser
request: {}
}
 拦截器
在请求或响应被 then 或 catch 处理前拦截它们。
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
3.5.2 创建实例
可以使用自定义配置新建一个 axios 实例
const instance = axios.create({
baseURL: ‘https://some-domain.com/api/’,
timeout: 1000,
headers: {‘X-Custom-Header’: ‘foobar’}
});

3.6 ES新版特性
3.6.1 ES6新特性(2015)
3.6.1.1 类(class)
class Animal {
// 构造函数,实例化的时候将会被调用,如果不指定,那么会有一个不带参数的默认构造函数.
constructor(name,color) {
this.name = name;
this.color = color;
}
// toString 是原型对象上的属性
toString() {
console.log(‘name:’ + this.name + ‘,color:’ + this.color);

}

}

var animal = new Animal(‘dog’,‘white’);//实例化Animal
animal.toString();

console.log(animal.hasOwnProperty(‘name’)); //true
console.log(animal.hasOwnProperty(‘toString’)); // false
console.log(animal.proto.hasOwnProperty(‘toString’)); // true

class Cat extends Animal {
constructor(action) {
// 子类必须要在constructor中指定super 函数,否则在新建实例的时候会报错.
// 如果没有置顶consructor,默认带super函数的constructor将会被添加、
super(‘cat’,‘white’);
this.action = action;
}
toString() {
console.log(super.toString());
}
}

var cat = new Cat(‘catch’)
cat.toString();

// 实例cat 是 Cat 和 Animal 的实例,和Es5完全一致。
console.log(cat instanceof Cat); // true
console.log(cat instanceof Animal); // true

3.6.1.2 模块化(Module)
模块的功能主要由 export 和 import 组成。每一个模块都有自己单独的作用域,模块之间的相互调用关系是通过 export 来规定模块对外暴露的接口,通过import来引用其它模块提供的接口。同时还为模块创造了命名空间,防止函数的命名冲突。
 导出(export)
//test.js
var name = ‘Rainbow’;
var age = ‘24’;
export {name, age};
// myModule.js
export function myModule(someArg) {
return someArg;
}
 导入(import)
import {myModule} from ‘myModule’;// main.js
import {name,age} from ‘test’;// test.js
3.6.1.3 箭头(Arrow)函数
基础语法
通常函数的定义方法:
var fn1 = function(a, b) {
return a + b
}

function fn2(a, b) {
return a + b
}
使用ES6箭头函数语法定义函数,将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体:

var fn1 = (a, b) => {
return a + b
}
(a, b) => {
return a + b
}
当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。
// 无参
var fn1 = function() {}
var fn1 = () => {}

// 单个参数
var fn2 = function(a) {}
var fn2 = a => {}

// 多个参数
var fn3 = function(a, b) {}
var fn3 = (a, b) => {}

// 可变参数
var fn4 = function(a, b, …args) {}
var fn4 = (a, b, …args) => {}

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种只包含一个表达式,省略掉了{ … }和return。还有一种可以包含多条语句,这时候就不能省略{ … }和return
() => return ‘hello’
(a, b) => a + b
(a) => {
a = a + 1
return a
}
如果返回一个对象,需要特别注意,如果是单表达式要返回自定义对象,不写括号会报错,因为和函数体的{ … }有语法冲突。
注意,用小括号包含大括号则是对象的定义,而非函数主体
x => {key: x} // 报错
x => ({key: x}) // 正确
3.6.1.4 函数参数默认值
ES6支持在定义函数的时候为其设置默认值:
function foo(height = 50, color = ‘red’)
{
}
3.6.1.5 模板字符串
ES6支持模板字符串,使得字符串的拼接更加的简洁、直观。
var name = 'Your name is ’ + first + ’ ’ + last + ‘.’
使用模板字符串:
var name = Your name is ${first} ${last}.
在ES6中通过${}就可以完成字符串的拼接,只需要将变量放在大括号之中。
3.6.1.6 解构赋值
解构赋值语法是JavaScript的一种表达式,可以方便的从数组或者对象中快速提取值赋给定义的变量。
 获取数组中的值
从数组中获取值并赋值到变量中,变量的顺序与数组中对象顺序对应。
var foo = [“one”, “two”, “three”, “four”];

var [one, two, three] = foo;
console.log(one); // “one”
console.log(two); // “two”
console.log(three); // “three”

//如果你要忽略某些值,你可以按照下面的写法获取你想要的值
var [first, , , last] = foo;
console.log(first); // “one”
console.log(last); // “four”

//你也可以这样写
var a, b; //先声明变量

[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2
如果没有从数组中的获取到值,你可以为变量设置一个默认值。
var a, b;
[a=5, b=7] = [1];
console.log(a); // 1
console.log(b); // 7
通过解构赋值可以方便的交换两个变量的值。
var a = 1;
var b = 3;
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
 获取对象中的值
const student = {
name:‘Ming’,
age:‘18’,
city:‘Shanghai’
};

const {name,age,city} = student;
console.log(name); // “Ming”
console.log(age); // “18”
console.log(city); // “Shanghai”
3.6.1.7 延展操作符(Spread operator)
3.6.1.8 对象属性简写
在ES6中允许我们在设置一个对象的属性的时候不指定属性名。
const name=‘Ming’,age=‘18’,city=‘Shanghai’;
const student = {
name:name,
age:age,
city:city
};
console.log(student);//{name: “Ming”, age: “18”, city: “Shanghai”}
写为:
const name=‘Ming’,age=‘18’,city=‘Shanghai’;
const student = {
name,
age,
city
};
console.log(student);//{name: “Ming”, age: “18”, city: “Shanghai”}
3.6.1.9 Promise
Promise 是异步编程的一种解决方案,比传统的解决方案callback更加的优雅。它最早由社区提出和实现的,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
var waitSecond = new Promise(function(resolve, reject)
{
setTimeout(resolve, 1000);
});

waitSecond
.then(function()
{
console.log(“Hello”); // 1秒后输出"Hello"
return waitSecond;
})
.then(function()
{
console.log(“Hi”); // 2秒后输出"Hi"
});

3.6.1.10 支持let与const
3.6.2 ES7新特性(2016)
3.6.2.1 Array.prototype.includes()
数组includes()方法,用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回true,否则返回false。
includes 函数与 indexOf 函数很相似,下面两个表达式是等价的:
arr.includes(x)
arr.indexOf(x) >= 0
3.6.2.2 指数操作符
在ES7中引入了指数运算符**,具有与Math.pow(…)等效的计算结果。
console.log(Math.pow(2, 10)); // 输出1024
console.log(2
10);// 输出1024
使用指数运算符**,就像+、-等操作符一样
3.6.3 ES8新特性(2017)
3.6.3.1 async/await
在我们处理异步的时候,比起回调函数,Promise的then方法会显得较为简洁和清晰,但是在处理多个彼此之间相互依赖的请求的时候,就会显的有些累赘。这时候,用async和await更加优雅
 async/await使用规则一:凡是在前面添加了async的函数在执行后都会自动返回一个Promise对象.即便代码里test函数什么都没返回,我们依然打出了Promise对象
async function test() {
}
let result = test()
console.log(result) //Promise {: undefined}
 async/await使用规则二:await必须在async函数里使用,不能单独使用

 async/await使用规则三:await后面需要跟Promise对象,不然就没有意义,而且await后面的Promise对象不必写then,因为await的作用之一就是获取后面Promise对象成功状态传递出来的参数。
// 正确的例子:
function fn() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(‘success’)
})
})
}

async test() {
let result = await fn() //因为fn会返回一个Promise对象
console.log(result) //这里会打出Promise成功后传递过来的’success’
}
test()

// 没有意义的例子(不会报错):
async test() {
let result = await 123
console.log(result)
}
test()
3.6.3.2 Object.values()
const obj = {a: 1, b: 2, c: 3};
const vals=Object.keys(obj).map(key=>obj[key]);
console.log(vals);//[1, 2, 3]
//使用Object.values() :ES8
const values=Object.values(obj1);
console.log(values);//[1, 2, 3]
3.6.3.3 Object.entries()
Object.entries()函数返回一个给定对象自身可枚举属性的键值对的数组。
接下来我们来遍历上文中的obj对象的所有属性的key和value:
Object.keys(obj).forEach(key=>{
console.log(‘key:’+key+’ value:’+obj[key]);
})
//key:a value:1
//key:b value:2
//key:c value:3
使用Object.entries() :ES8
for(let [key,value] of Object.entries(obj1)){
console.log(key: ${key} value:${value})
}
//key:a value:1
//key:b value:2
//key:c value:3

3.6.3.4 String padding
PadStart 和 PadEnd 函数可向左、右填充字符串(如空格)
 String.padStart(targetLength,[padString])
 targetLength:当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
 padString:(可选)填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断,此参数的缺省值为 " "。
 String.padEnd(targetLength,padString])
 targetLength:当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
 padString:(可选) 填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断,此参数的缺省值为 " ";
示例:
// padStart:
‘abc’.padStart(6);
// <- ’ abc’
‘abc’.padStart(2);
// <- ‘abc’
‘abc’.padStart(5, ‘x’);
// <- ‘xxabc’
‘abc’.padStart(7, ‘xo’);
// <- ‘xoxoabc’
‘abc’.padStart(6, ‘xo’);
// <- ‘xoxabc’
‘12’.padStart(10, ‘YYYY-MM-DD’);
// <- ‘YYYY-MM-12’
‘09-12’.padStart(10, ‘YYYY-MM-DD’);
// <- ‘YYYY-09-12’
// padEnd:
‘123’.padEnd(6);
// <- '123 ’
‘123’.padEnd(6, ‘x’);
// <- ‘123xxx’
‘123’.padEnd(6, ‘123456’);
// <- ‘123123’
‘2016’.padEnd(10, ‘YYYY-MM-DD’);
// <- ‘2016YYYY-M’
3.6.3.5 函数中允许尾随逗号参数
foo(
‘a’,
‘b’,
‘c’, // this threw a Parse Error before Node 8
);
3.7 Css3高级功能
3.7.1 动画特效
 基础用法

 属性:
值 描述
animation-name 规定需要绑定到选择器的 keyframe 名称。。
animation-duration 规定完成动画所花费的时间,以秒或毫秒计。
animation-timing-function 规定动画的速度曲线。
animation-delay 规定在动画开始之前的延迟。
animation-iteration-count 规定动画应该播放的次数。
animation-direction 规定是否应该轮流反向播放动画。
animation-play-state 规定控制动画的播放状态
 兼容设置:
@keyframes mymove
{
from {background: red;}
to {background: yellow;}
}

@-moz-keyframes mymove /* Firefox */
{
from {background: red;}
to {background: yellow;}
}

@-webkit-keyframes mymove /* Safari 和 Chrome */
{
from {background: red;}
to {background: yellow;}
}

@-o-keyframes mymove /* Opera */
{
from {background: red;}
to {background: yellow;}
}

3.7.2 Flex 布局
3.7.2.1 基本概念
采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
3.7.2.2 容器的属性
3.7.2.2.1 flex-direction属性
flex-direction属性决定主轴的方向(即项目的排列方向)。
.box {
flex-direction: row | row-reverse | column | column-reverse;
}

它可能有4个值。
row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿。
3.7.2.2.2 flex-wrap属性
默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。

.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
它可能取三个值。
(1)nowrap(默认):不换行。

(2)wrap:换行,第一行在上方。

(3)wrap-reverse:换行,第一行在下方。

3.7.2.2.3 flex-flow
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。

.box {
flex-flow: || ;
}
3.7.2.2.4 justify-content属性
justify-content属性定义了项目在主轴上的对齐方式。

.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}

它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。
flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
3.7.2.2.5 align-items属性
align-items属性定义项目在交叉轴上如何对齐。

.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}

它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。
flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
3.7.2.2.6 align-content属性
align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

该属性可能取6个值。
flex-start:与交叉轴的起点对齐。
flex-end:与交叉轴的终点对齐。
center:与交叉轴的中点对齐。
space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
stretch(默认值):轴线占满整个交叉轴。
3.7.2.3 项目的属性
3.7.2.3.1 order属性
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

.item {
order: ;
}

3.7.2.3.2 flex-grow属性
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

.item {
flex-grow: ; /* default 0 */
}

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
3.7.2.3.3 flex-shrink属性
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

.item {
flex-shrink: ; /* default 1 */
}

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
负值对该属性无效。
3.7.2.3.4 flex-basis属性
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

.item {
flex-basis: | auto; /* default auto */
}
它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。
3.7.2.3.5 flex属性
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

.item {
flex: none | [ <‘flex-grow’> <‘flex-shrink’>? || <‘flex-basis’> ]
}
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
3.7.2.3.6 align-self属性
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

该属性可能取6个值,除了auto,其他都与align-items属性完全一致。

3.8 Sass
官方指导:https://www.sass.hk/guide/
3.9 Echarts
官方文档:https://echarts.apache.org/zh/api.html#echarts
3.10 TypeScript
官方文档:https://www.tslang.cn/docs/release-notes/typescript-3.1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值