路由钩子函数 组件方法 (utils)

01.路由钩子函数

路由钩子函数分为三种:

1:全局钩子: beforeEach、 afterEach、beforeResolve

2:单个路由里面的钩子: beforeEnter

3:组件路由:beforeRouteEnter、 beforeRouteUpdate、 beforeRouteLeave

路由所对应组件勾子
     beforeRouteEnter:进入前,在beforeCreate之前执行,不能使用this
        beforeRouteEnter((to,from,next)=>{
    
    
            next((vm)=>{
    
    
                vm:当前组件的实例对象
            })
        })
    beforeRouteUpdate:更新前,路由更新了,路由所对应组件不变时执行
        注意:它是更新前,如果获取当前路由,它是更新前的路由信息,如果要
        获取更新后的使用this.$nextTick(()=>{
    
    获取更新后的})
    beforeRouteLeave:路由离开前路由配制所对应勾子
beforeEnter:读取路由配制时执行

执行先后

   beforeEach===>beforeEnter===>beforeRouteEnter===>beforeResolve===>afterEach

更新时执行先后

   beforeEach===>beforeRouteUpdate===>afterEach

beforeDestroy执行时间节点
A路由跳转到B路由时它们A组件与B组件执行的生命周期勾子

beforeCreate(B)===>created(B)===>beforeMount(B)===>beforeDestroy(A)===>
destroyed(A)===>mounted(B)

父组件与子组件生命周期执行先后

beforeCreate()===>created()===>beforeMount()===>beforeCreate()===>
created()===>beforeMount()===>mounted()===>mounted()

路由钩子函数分为三种类型如下:
  第一种:全局钩子函数。

to:route即将进入的目标路由对象,
from:route当前导航正要离开的路由
next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转

router.beforeEach((to, from, next) => {
    
    
    console.log('beforeEach')
    //next() //如果要跳转的话,一定要写上next()
    //next(false) //取消了导航
    next() //正常跳转,不写的话,不会跳转
  })
  router.afterEach((to, from) => {
    
     // 举例: 通过跳转后改变document.title
    if( to.meta.title ){
    
    
      window.document.title = to.meta.title //每个路由下title
    }else{
    
    
      window.document.title = '默认的title'
    }
  })

第二种:针对单个路由钩子函数

beforeEnter(to, from, next){
    console.log(‘beforeEnter’)
    next() //正常跳转,不写的话,不会跳转
  }

第三种:组件级钩子函数

  beforeRouteEnter(to, from, next){
    
     //
   这个路由钩子函数比生命周期beforeCreate函数先执行,所以this实例还没有创建出来
       console.log("beforeRouteEnter")
       console.log(this) //这时this还是undefinde,因为这个时候this实例还没有创建出来
       next((vm) => {
    
     //vm,可以这个vm这个参数来获取this实例,接着就可以做修改了
         vm.text = '改变了'
       })   },   beforeRouteUpdate(to, from, next){
    
    //可以解决二级导航时,页面只渲染一次的问题,也就是导航是否更新了,是否需要更新
       console.log('beforeRouteUpdate')
       next();   },   beforeRouteLeave(to, from, next){
    
    // 当离开组件时,是否允许离开
       next()   }

02.组件方法 (utils)

1.操作cookie

// 原生js可以直接操作cookie 不方便获取
// 第三方的包 操作cookie

// 设置Cookie.set(key,value) localStorage.setTtem(key,value)
// 获取Cookie.get(key) localStorage.getTtem(key)
// 删除Cookie.remove(key) localStorage.removeTtem(key)



import Cookies from 'js-cookie'
// const TokenKey = 'vue_admin_template_token'
const TokenKey = 'hrsaa-74-token-nb'

export function getToken() {
    
    
  return Cookies.get(TokenKey)
}

export function setToken(token) {
    
    
  return Cookies.set(TokenKey, token)
}

export function removeToken() {
    
    
  return Cookies.remove(TokenKey)
}

2.封装函数将列表型数据转换为树形数据 递归思想

// 封装函数将列表型数据转换为树形数据
// list :要转换的数据
// value 根数据
// 递归思想   一个函数自己调用自己   (死循环  需要条件结束)
export function transLisToTree(list, value) {
    
    
  const arr = []
  list.forEach(item => {
    
    
    if (item.pid === value) {
    
     // 根据父id 往下找
      const children = transLisToTree(list, item.id)
      // console.log(children)
      if (children.length > 0) {
    
    
        // 转换为树形  获取数据
        item.children = children
      }
      arr.push(item)
    }
  })
  return arr
}

3.按需导出 验证手机号

/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * @param {string} path
 * @returns {Boolean}
 */
// 按需导出
export function isExternal(path) {
    
    
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
    
    
  const arr = ['admin', 'editor']
  return arr.indexOf(str.trim()) >= 0
}

// 验证手机号

export function validMobile(str) {
    
    
  return /^1[3-9]\d{
    
    9}$/.test(str) // 正则1  +3->9   +9位
}

4. // 设置请求根路径 // 请求拦截器 // 响应拦截器 // 处理 400 401 500错误

import axios from 'axios'

import {
    
     Message } from 'element-ui'

import store from '@/store'
import router from '@/router'
// create an axios instance
// process.env当前进程的环境变量
const service = axios.create({
    
    
  // 设置请求根路径
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

/* // 创建了axios实例, 使用的是自己的配置项
const instance = axios.create({
  // 开发环境, 找 env.development, 找 VUE_APP_BASE_API 变量
  // 生产环境, 找 env.production,  找 VUE_APP_BASE_API 变量
  baseURL: process.env.VUE_APP_BASE_API, // 环境变量
  timeout: 5000 // request timeout
})
 */

// 请求拦截器
service.interceptors.request.use(function(config) {
    
    
  // 携带token
  const token = store.getters.token

  config.headers.Authorization = 'Bearer ' + token

  return config
}, function(error) {
    
    
  return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use((response) => {
    
    
  // 将axios放回数据解了一层壳
  const res = response.data
  const {
    
     message, success } = res
  if (!success) {
    
    
    Message.error(message)
    return Promise.reject(new Error(message))
  }
  return res
}, (error) => {
    
    
  // 处理 400 401 500错误
  // 当服务器返回的错误信息 400 401 501 都会在响应拦截器的第二个回调函数
  // if (error.response.status === 401 ) {
    
    
  if (error.response.status === 401 && error.response.data.code === 10002) {
    
    
    // 1.弹出错误提示
    // 2.清空用户数据
    // 3.跳转登录页面
    Message.error('登录失效')
    // Message.error(error.response.data.message)

    store.dispatch('user/logout')
    router.push('/login')
  } else {
    
    
    console.dir(error)
    Message.error(error.message)
  }

  return Promise.reject(error)
})

export default service

稍后扩充…

猜你喜欢

转载自blog.csdn.net/qq_43944285/article/details/125364491
今日推荐