vue-cli 初始化创建 vue2.9.6 项目路由守卫封装axiosvuex

Posted 知其黑、受其白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-cli 初始化创建 vue2.9.6 项目路由守卫封装axiosvuex相关的知识,希望对你有一定的参考价值。

阅读目录

Vue如何封装Axios请求

我使用的是 vue-cli 框架,vscode编辑器。

1 安装axios

在控制台通过 npm i axios --save 安装:

PS E:\\node\\vue296> npm i axios --save
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules\\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted "os":"darwin","arch":"any" (current: "os":"win32","arch":"x64")
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13 (node_modules\\watchpack-chokidar2\\node_modules\\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted "os":"darwin","arch":"any" (current: "os":"win32","arch":"x64")
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13 (node_modules\\webpack-dev-server\\node_modules\\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted "os":"darwin","arch":"any" (current: "os":"win32","arch":"x64")

+ axios@0.27.2
added 5 packages from 4 contributors in 12.422s

PS E:\\node\\vue296>

安装好之后,在 package.json 中检查,如图,如果有的话,就说明安装成功。

2 封装代码 axios

(1)首先在 src 目录下,新建一个 utils 文件夹,用来放置封装的代码文件。

(2)在 utils 问价夹中新建一个 request.js 文件。

(3)在 request.js 中编写代码。

//引入axios
import axios from "axios"

//创建axios实例
const instance = axios.create(
  baseURL: 'http://tt.cc/testData/',//公共地址
  timeout: 1000,//请求超时时间
);

// 添加请求拦截器
instance.interceptors.request.use(function (config) 
    // 在发送请求之前做些什么
    return config;
  , function (error) 
    // 对请求错误做些什么
    return Promise.reject(error);
  );

// 添加响应拦截器
instance.interceptors.response.use(function (response) 
    // 对响应数据做点什么
    return response;
  , function (error) 
    // 对响应错误做点什么
    return Promise.reject(error);
  );

//导出axios实例
export default instance

应用方式

到这一步,封装基本完成,使用时,在 Vue 组件中引入即可,如图:

利用 async,await 对其进行进一步封装。

//引入 axios 实例
import instance from "./utils/request"

# 第一种应用方式
const ax = instance.get('text.php').then(function(response)
	localStorage.setItem("token", response.data.name);
	return response;
)

# 第一种应用方式
ax.then(res=>
	console.log(res.data);
	this.list = res.data;
);
# 第一种取值方式
setTimeout(() => 
	console.log(this.list.name);
, 300);
console.log(localStorage.getItem("token"))

# 第二种应用方式
async function getRotationChart() 
		let data = await instance.get('text.php')
		console.log(data,"sadfasdfasdfs");
		return data

console.log(getRotationChart())

Vue 中的路由守卫

路由守卫的分类,Vue 中的路由守卫可以分为:

       全局的路由守卫; 
单个路由独享的路由守卫;
     组件级的路由守卫;

1、vue-router 全局有三个守卫:

   router.beforeEach 全局前置守卫 进入路由之前
router.beforeResolve 全局解析守卫(2.5.0+) 在 beforeRouteEnter 调用之后调用
    router.afterEach 全局后置钩子 进入路由之后

2、vue-router 组件内的守卫:

 beforeRouteEnter 进入路由之前
beforeRouteUpdata (2.2新增) 路由更新时
 beforeRouteLeave 离开路由之前

3、vue-router 单个路由独享的守卫

beforeEnter

路由守卫钩子函数里面有三个参数

to,from,next 这三个参数:

to 和 from 是将要进入和将要离开的路由对象,路由对象指的是平时通过 this.$route 获取到的路由对象。

next:Function 这个参数是个函数,且必须调用,否则不能进入路由(页面空白)。
next() 进入该路由。

next(false): 取消进入路由,url 地址重置为 from 路由地址(也就是将要离开的路由地0址)。 next 跳转新路由,当前的导航被中断,重新开始一个新的导航。

使用演示

1 全局守卫

全局守卫写在路由的 js 文件内。如图。

router.beforeEach 里在循环所有的路由地址。

2 组件级守卫

组件级的守卫写在页面组件中,与 data,methods 同级。

如图:这些与全局的方法,参数是一样的,里面写逻辑。

3 单个路由独享的守卫

单个路由独享的守卫写在路由配置中,与path,name同级。如图。

4 官网整个路由守卫被触发流程的步骤:

1.导航被触发。
2.在失活的组件里调用离开守卫。
3.调用全局的 beforeEach 守卫。
4.在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
5.在路由配置里调用 beforeEnter。
6.解析异步路由组件。
7.在被激活的组件里调用 beforeRouteEnter。
8.调用全局的 beforeResolve 守卫 (2.5+)。
9.导航被确认。
10.调用全局的 afterEach 钩子。
11.触发 DOM 更新。
12.用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

安装 vuex

PS E:\\node\\vue296> npm install --save vuex@3.6.2
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules\\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted "os":"darwin","arch":"any" (current: "os":"win32","arch":"x64")
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13 (node_modules\\webpack-dev-server\\node_modules\\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted "os":"darwin","arch":"any" (current: "os":"win32","arch":"x64")
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13 (node_modules\\watchpack-chokidar2\\node_modules\\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted "os":"darwin","arch":"any" (current: "os":"win32","arch":"x64")

+ vuex@3.6.2
added 1 package from 1 contributor in 14.372s
PS E:\\node\\vue296>

注意版本问题:vue 的 2.x 版本对应 vuex 的 3.x 版本,vue 的 3.x 版本对应 vuex 的 4.x 版本。

1 Vuex 的基本使用

安装浏览器插件:devtools 方便调试

state:存放需要共享的状态信息,使用时通过 $store.state.count 即可拿到状态信息。


src 目录下新建 vuex 文件夹(文件夹名称可随意命名),创建 store.js 文件引入、安装、创建并导出 Vuex 对象。

E:\\node\\vue296\\src\\vuex\\store.js

import Vue from 'vue'
import Vuex from 'vuex'

// 1.安装插件
Vue.use(Vuex)

//2.创建对象
const store = new Vuex.Store(
  state: 
    count: 0
  ,
  mutations: 
    inscrease() 
        this.state.count ++
    
  ,
  actions: 
  ,
  getters:
 
  ,
  modules:
    
  
)

//3.导出使用
export default store

2 main.js 文件中挂载使用 vuex 对象

和 vue-router 的使用方式一样,在 main.js 文件中挂载使用。

E:\\node\\vue296\\src\\main.js

import Vue from 'vue'
import App from './App'
import router from './router'

// 引入store
import store from './vuex/store'
 
Vue.config.productionTip = false
 
/* eslint-disable no-new */
new Vue(
  el: '#app',
  router,
  store, // 全局注入
  components:  App ,
  template: '<App/>'
)

store 对象中存放的东西是固定的,主要有:state、mutations、actions、getters、modules

下图是官方给出的vuex状态管理图例:

3 组件中应用 vuex

E:\\node\\vue296\\src\\components\\HelloWorld.vue

对 state 的状态信息进行修改:
先拿到 store 对象,然后通过 commit 提交 mutations 中的方法。

<template>
   <div>
     <p>导航 :
        <router-link to="/">首页  msg  </router-link> <br/>&nbsp;&nbsp;
        <router-link to="/hello"> 单页 hello</router-link><br/>&nbsp;&nbsp;
        <router-link to="/login"> 登陆 </router-link>
      </p>
      hello info component
      <button type="button" @click="add()">添加</button>
    </div>
</template>

<script>
import store from '../vuex/store.js'

export default 
  name: 'HelloWorld',
  store,
  data () 
    return 
      msg: 'HelloWorld'
    
  ,
  methods:
    add() 
      console.log('add Event from info!')
      store.commit('inscrease')
    
  

</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
a 
  text-decoration:none;

</style>

E:\\node\\vue296\\src\\components\\Login.vue

<template>
    <div class="hello">
        <h1> msg </h1>
        <p>vuex  msg_vuex  </p>
        <button @click="goHome">回到首页</button>
    </div>
</template>
<script>
import store from '../vuex/store.js'

export default 
    name:'Login',
    store,
    data () 
        return 
            msg: 'Login Vuex test!',
            // 展示 vuex 的 store 里的 count
            msg_vuex : store.state.count
        
    ,
    methods: 
        goHome()
            this.$router.push('/');
        
    

</script>
<style scoped>

</style>

4 预览使用 devtools 调试界面,可以跟踪查看每一次事件操作。

快速认识 vuex

为什么要用Vuex?

首先我来引入一个概念,单向数据流的概念。


我们页面是有很多个视图 View 组成的,用户的操作 Actions 会带来视图上状态 State 变化,状态的变化又会驱动视图的更新,如果我们的页面没有采用这样的数据流方式开发的话,那么组件间的状态管理就会异常复杂。

我们常见的用 vuex 解决问题,多个视图依赖同一个状态的这样问题,比如菜单导航。

来自不同视图的行为需要改变同一状态的问题,比如评论的弹幕,当我们发出一条评论的时候,我们要去改变弹幕的状态,去给它新增一条弹幕或者说删除一条旧的弹幕。

什么是 vuex ?
vuex 就是为 vue.js 开发的 状态管理模式组件状态集中管理,组件状态改变遵循统一的原则。

组件之间传值

目标:熟悉组件之间传值的各种情况(关注非父子之间传值)

父组件向子组件传值 props
子组件向父组件传值 $emit
非父子组件之间传值 : 爷孙;兄弟 (发布订阅模式(微博:大V----粉丝))

基于Vue实现发布订阅模式

// 相当于中介
const eventBus = new Vue()

// 订阅事件
eventBus.$on('event-b', (param) => 
  console.log(param) // 123
)

// 发布事件
eventBus.$emit('event-b', 123)

通过兄弟组件之间的传值进行验证。

总结:

1 少量的组件之间数据传递可以用这种模式
2 但是不建议大量的组件通信采用这种机制(代码比较乱,后期维护比较麻烦)

状态管理必要性分析

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

如果使用了 Vuex,就可以非常方便的进行复杂的组件之间数据传递(非父子关系)

总结:

1 所有组件的数据进行统一管理(存储和变更),每个组件内部就不再需要维护这些数据了

2 数据变更时,统一修改 Store 中数据即可,组件中用到这个数据的组件会自动更新(数据是响应式的)

目标:熟悉 Vuex 是如何实现上述集中管理组件数据这种思想(模式)的。

Devtools 指的是浏览器的 Vue 插件调试工具,它可以监控到数据的所有变更操作。

Vuex 的学习内容

  1. state: 统一定义公共数据(类似于data()return a:1, b:2,xxxxxx)
  2. mutations : 使用它来修改数据(类似于 methods ) 更改 state 中的数据必须使用mutations 来进行更改。
  3. getters: 类似于 computed ( 计算属性,对现有的状态进行计算得到新的数据—派生 )
  4. actions: 发起异步请求
  5. modules: 模块拆分

其中最为重要的内容是 state 和 mutations。

Vuex 在 Vue 项目使用 Vuex

情况1:在老项目中使用。 先额外安装 vuex 包,然后在配置。

情况2:在新项目中使用, 在配置 vue-cli 中创建项目时,就可以直接选中 vuex 项,这样就不用做任何配置了(脚手架会自动帮我们完成的)。

具体如下图示:

在旧项目中:

1、安装。它是一个独立的包,需要先安装。
2、配置 store/index.js
3、创建 Vuex.Store 实例
4、向 Vue 实例注入 store
5、使用,在组件中使用 store

实例化 store

与 router 一样,当我们在项目中使用 vuex 之后,为了方便代码维护,我们一般需要做特殊的目录调整,约定的结构如下:

|--src
|----- main.js
|----- store
|----------- index.js

store/index.js 中放置具体的代码,具体如下:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store(
  state: 
    count: 0
  
)
export default store

向 Vue 实例注入 store。在 src/main.js 中:

// 省略其他
// 1. 导入store
import store from './store' 

new Vue(
  // 省略其他...
  store // 2. 注入Vue实例
)

组件中使用 store

在任意组件中,通过 this.$store.state 来获取公共数据。

methods:
  add() 
    console.log('add Event from info!')
    console.log(this.$store.state)
    console.log(this.$store.state.count)
    store.commit('inscrease')
  

Vuex state 定义公共数据并在组件中使用

state 的作用:vuex 用它来保存公共数据。

定义公共数据

格式

new Vuex.store(
  state: 
   	属性名: 属性值 
  
)

示例

new Vuex.store(
  state: 
    userInfo: 
       name: 'tom',
	 skills: ['A站', 'B站', 'p站'],
    address: '武汉热干面',
       logo: 'https://vuejs.org/images/logo.svg'
       //  https://www.runoob.com/wp-content/uploads/2016/02/react.png
    
  
)

使用公共数据

格式:

在组件中:通过 this.$store.state. 属性名来访问。
在模板中:则可以省略 this 而直接写成: $store.state.属性名

Vuex 辅助函数 mapState 来使用公共数据

mapState 的使用步骤:

// 1. 导入辅助函数 mapState,它是在 vuex 中定义的一个工具函数。

//  es6 按需导入 import  mapState  from 'vuex' 
import  mapState  from 'vuex'

computed: 
   // 说明1: ...对象 是把对象展开,合并到 computed
   // 说明2: mapState是一个函数 
   //  ['数据项1', '数据项2']
   ...mapState(['xxx'])...mapState('新名字': 'xxx')


 js中使用:this.xxx
模板上使用:xxx

示例

// 步骤
// 1. 导入辅助函数 mapState,它是在vuex中定义的一个工具函数。
//  es6 按需导入 import  mapState  from 'vuex' 
import  mapState  from 'vuex'

// 2. 在computed中使用 ...mapState(['books'])
// const res = mapState(['books'])
// res的结果是一个对象:  books: function() 
// console.log('mapState', res)

export default 
  computed: 
    c1 () 
      return 'c1'
    ,
    // books: function() 
    // ..res: 把res这个对象合并到comput

以上是关于vue-cli 初始化创建 vue2.9.6 项目路由守卫封装axiosvuex的主要内容,如果未能解决你的问题,请参考以下文章

vue-cli 初始化创建 vue2.9.6 项目路由守卫封装axiosvuex

vue3简介——升级Vue的版本 vue2.9.6升级到vue3.0——创建Vue3.0工程-——vue3_devtool开发者工具的下载安装

Vue2.9.6安装element-ui

vue-cli3创建项目初始化

记录VUE-CLI项目创建及初始化相关

利用vue-cli创建新项目