created by YZX at 2021-06-07
一、环境搭建
- 脚手架:可以认为是软件开发中快速搭建环境的一种工具。(脚手架会提供很多高效开发的功能、文件模板等等)
- vue2.0的脚手架叫 @vue/cli
- 搭建前端工程化环境,一定要用到node.js。
- vue3.0环境创建:@vue/cli、vite
1、安装node.js
- node官网上下载node.js、安装node.js
- 建议安装 node v12 版本。
2、安装git
- 因为里面有很linux风格的命令,为使用Mac打下一点基础。
- 验证node是否安装成功:
node -v
npm -v
2、使用cnpm淘宝镜像
npm install cnpm -g --registry=https://registry.nlark.com
- cnpm安装成功后,先关闭git bash,再打开才能使用cnpm。
cnpm install @vue/cli -g # 脚手架安装成功,关闭git bash,再打开
vue -V # 验证脚手架是否安装成功
4、创建vue项目、运行项目
vue create 项目名称
# 选择 vue2.0
cd 项目目录
npm run serve
5、项目目录分析
- README.md 程序员写笔记的地方(必读)
- 是npm生成的包管理器文件,记录着当前项目所需要的各种依赖包、命令行配置。
- 如果node_modules出现了错误,怎么办?
rm -rf node_modules
cnpm install
- babel.config.js 这是Babel编译器的配置文件
- node_modules 是根据package.json来安装的所有第三方依赖包,一般不要动它。
- public目录,是当前本地服务的静态资源服务器
- public/index.html 是Vue单页面应用程序的唯一的html文件,项目编译打包的.js文件会被自动插入这个文件中去。
- src目录,是我们写代码的地方。
- src/main.js是整个Vue应用程序的入口文件,第一行运行的js代码就是这里面。
- src/App.vue 这种.vue文件是Vue官方设计的一种单文件组织,便于我们组织Vue代码。
6、初步体验Vue脚手架环境
- eslint,是一个代码检测工具,如果你写的代码不符合eslint的规则,就给你报错。
- TodoList.vue 实现
二、Vue路由
1、基本使用
- 单页面应用程序(SPA)的本质:只有一个html页面(Vue系统),当url发生变化时,Vue系统找到当前url所对应的组件,将其替换到App根容器。
- 在单页面应用程序中,视图(页面)切换变化,实际就是一组Vue组件的显示(created)与隐藏(destroyed)。
- 安装vue-router(3.x)
cnpm install vue-router -S
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
export default new VueRouter({routes: [{path, component}]})
- 在main.js入口文件中挂载router,编码如下:
import router from './router.js'
new Vue({router})
<template>
<div> <router-view></router-view> </div>
</template>
- 怎么测试?在浏览器的地址栏中手动改变url,看效果。
2、学习路由,搞明白三个问题?
- 如何定义一一对应的路由匹配规则?(使用到很routes字段属性)
- 如何更改URL?(声明式路由跳转、编程式路由跳转)
- 当URL发生变化时,path所对应的组件应该放在哪里进行显示?()
3、vue环境支持sass
- @vue/cli 背后是webpack4.0
- sass-loader是一个webpack的Loaders,作用是加载src源码的sass资源,并交给sass编译器进行编译。
- 注意:sass-loader@12.0.0 用于支持webpack5.0
- 我们的做法是:
# 建议使用 node v12
cnpm i sass -D
cnpm i sass-loader@7.3.1 -D
- 在.vue文件中使用
<style lang='scss'></style>
4、可以使用另一个更好用的包管理器
npm install yarn -g
yarn add vue-router
# 删除node_modules包
rm -rf node_modules
# 根据package.json重新安装node_modules包
yarn
# 或者
cnpm install
5、路由基础知识点
- 1、两个内置组件:
<router-view>、<router-link>
- 2、两个内置API:
$route、$router
,watch可以监听$route的变化。 - 3、两种路由跳转方式:
- 声明式跳转(
<router-link to='/path'>
) - 编程式跳转(
this.$router.push()/go()/back()/replace()
)
- 4、两种路由通信方式:
- query传参(this.
r
o
u
t
e
r
.
p
u
s
h
(
‘
/
d
e
t
a
i
l
?
i
d
=
router.push(`/detail?id=
router.push(‘/detail?id={id}&age=
a
g
e
‘
)
)
,
在
另
一
个
页
面
使
用
‘
t
h
i
s
.
{age}`)),在另一个页面使用`this.
age‘)),在另一个页面使用‘this.route.query`接收。
- 动态路由传参(this.
r
o
u
t
e
r
.
p
u
s
h
(
‘
/
d
e
t
a
i
l
/
router.push(`/detail/
router.push(‘/detail/{id}/
a
g
e
‘
)
)
,
在
路
由
匹
配
规
则
‘
r
o
u
t
e
s
:
[
p
a
t
h
:
′
/
d
e
t
a
i
l
/
:
i
d
/
:
a
g
e
′
]
‘
,
在
另
一
个
页
面
中
使
用
‘
t
h
i
s
.
{age}`)),在路由匹配规则`routes:[{path:'/detail/:id/:age'}]`,在另一个页面中使用`this.
age‘)),在路由匹配规则‘routes:[path:′/detail/:id/:age′]‘,在另一个页面中使用‘this.route.params`接收。
- 5、重定向
routes: [{path:'/*', redirect:'/已定义过一个path'}]
,一般放在路由规则的最后一条。 - 6、别名:
routes:[{path:'/abcdefafesef', alias:'/abc'}]
,访问别名和访问path,显示的是同一个组件。 - 7、命名路由:
routes:[{path:'home', name:'h'}]
,使用它:this.$router.push({name:'h', ...})
。 - 8、命名视图:给
<router-view name='abc'>
加个名字,默认叫default
。此时路由规则的写法是routes:[{path:'',components:{abc:Home}}]
。 - 9、嵌套路由:
routes:[{path,component,children:[{path,component}]}]
,一级路由规则的视图容器定义在App.vue中,二级路由规则的视图容器定义在一级路由所对应的Vue组件中。 - 10、路由懒加载:是一种性能优化方案,背后的技术是异步组件和Webpack代码分割,写法
const Home = ()=>import('')
。 - 11、两种路由模式:history模式 vs. hash模式,背后原理是什么?部署服务时谁会404?如何解决问题?
- 12、路由守卫、路由元信息:项目实战中再讲。
三、状态管理
1、基本背景
- 通信:组件之间、端与端之间的数据交互。
- 状态:在应用程序中,指的是“数据”。
- Flux数据架构思想:解决的核心问题——如何科学地管理大型应用程序中的数据(状态)?
- Vuex,是在Flux思想下诞生的一款Vue状态管理工具,是一个具体的可落地的数据解决方案。
- React配套的状态管理有:Mobx、Redux。
- Vuex,只是一种数据管理的解决方案,不是必选的,也就是说小型的Vue项目可以不使用Vuex。
2、Vuex的作用
- 作用1:使用Vuex在多个组件之间共享数据(这是Vue技术栈中终极的通信方案)。
- 作用2:使用Vuex实现应用程序的数据缓存。
3、使用Vuex
cnpm install vuex -S
- 在src/store/index.js中编码如下:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({state:{}, mutations:{}, actions: {}})
import store from './store/index.js'
new Vue({ store, el:'#app'})
4、五个核心概念
- state:用于定义组件间可共享的数据。
- getters:相当于是Vue组件中的计算属性,它依赖于Vuex的state,当它所关联的state变量变化时,getters方法才会重新执行。
- mutations:用于同步地修改state数据。事实上在mutations方法中也可以做异步操作(比如调接口),但不推荐。
- actions:用于与后端API进行交互。事实上在actions方法也可以直接修改state,但也不推荐这么做。
- modules:只是一种架构思想,为了让多个开发者高效协作,把根store拆分多个独立的子store。
5、四个API(map*系列函数)
- 严格建议在Vue组件中,使用map*系列函数来访问Vuex中的数据和方法,尽量不要使用this.$store来访问数据和方法。
- 当你在Vue组件中使用map*系列方法时,Vuex的子store一定要开启命名空间(
namespaced:true
)。 - mapState和mapGetters 写在Vue组件的 computed中。语法:
...mapState('命名空间', [])
。 - mapMutations和mapActions 写在Vue组件的 methods中。语法:
...mapActions('命名空间', [])
。
6、使用 vue-devtools
- 解压 VueDevtools.zip 到电脑某盘。
- 打开谷歌浏览器 -> 设置 -> 扩展程序 -> 加载已解压的应用程序插件 -> 选择“某盘/VueDevtools/chroome”文件夹 -> 关闭谷歌浏览器 -> 再打开谷歌浏览器 -> 在浏览器右上角点击“扩展程序”icon -> 把vue-devtools固定到浏览器右上角 -> 完成。
7、使用Vuex实现Cnode文章列表功能的思路
- 需求:要在Find.vue页面中渲染Cnode文章列表(文章列表数据放在远程数据库中)
- 在Vuex的 state 中声明一个变量 list:[] (放置文章列表数据)
- 在 Find.vue 中使用
v-for='item in $store.state.list'
来访问并渲染(render)文章列表。 - 在 Vuex的actions中,封装一个 getList(store, 调接口的入参),用于和后端接口交互。
- 在Find.vue的 mounted()生命周期中,触发调接口的actions方法:this.$store.dispatch(‘getList’, 入参)
- getList() 这个actions方法被触发后,开始异步地调接口,当拿到后端数据时,通过 store.commit(‘updateList’, 文章列表) 触发 updateList() 这个mutations方法。
- 在Vuex的mutations中定义一个 updateList(state, 文章列表),用于更新 state.list。
- 当Vuex中的state.list 发生更新时,使用了它的组件页面会自动更新。
8、axios使用步骤
cnpm install axios -S
- 在src/utils/fetch.js中创建axios实例、封装拦截器,并抛出。
- 在src/utils/api.js中封装“获取文章列表”的接口方法,并抛出,给到Vuex的actions使用。
9、ajax数据(前端数据流)
- 浏览器的CORS同源策略会阻塞AJAX跨域请求(其它宿主环境没有这个策略)。
- 不跨域,那么CORS将不再限制我。
- 不使用AJAX,那么CORS不再限制我。
- 服务器开放了CORS。
- 以下三种情况都是跨域(跨域是非常常见的)
http://qf.com vs. https://qf.com
http://qf.com vs. http://mi.com
http://12.67.23.204:8001 vs. http://12.67.23.204:8002