Vue 框架 路由(Vue Router) Vuex 刷新页面

Vue 官网
Vue API 官网
Vue CLI 官网     npm 安装:npm install -g @vue/cli
Element 官网    npm 安装:npm i element-ui -S
vue-axios api  
axios api  
vue-echarts  github  
ECharts 的 API 文档(英文)   ECharts 的 API 文档(中文)   vue-echarts npm   
Ant Design  
Ant Design of React    
Ant Design of Vue 
DCloud  
DCloud - 文档  
HBuilderX    
uni-app 跨平台  
Vue 单文件组件 (SFC) 规范  
Vue Router
*
*
*
整个项目是一个【主文件index.html】,index.html中会引入src文件夹中的【main.js】,main.js中会导入顶级单文件组件【App.vue】,App.vue中会通过组件嵌套或者路由来引用components文件夹中的其他单文件组件。
Vue 框架 路由(Vue Router) Vuex 刷新页面_第1张图片*

1、vue-element-admin 简介
vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现。它使用了最新的前端技术栈,内置了 i18n 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。

【前序准备】
   # 本地安装 node 和 git
   node 下载地址:https://nodejs.org/zh-cn/
       git 下载地址:https://git-scm.com/download/win

   # 查看 node 版本
   安装完 node 之后,打开【dos 窗口】输入【cmd】回车,输入【node -v】回车

   # 查看 git 版本
   安装完 git 之后,打开【dos 窗口】输入【cmd】回车,输入【git --version】回车

【开发】
   # 进入项目目录
   cd vue-element-admin

   # 安装依赖
   npm install

   # 可以通过如下操作解决 npm 下载速度慢的问题
   npm install --registry=https://registry.npm.taobao.org

   # 本地开发 启动项目
   npm run dev

   # 启动完成后会自动打开浏览器访问 http://localhost:9527

【构建和发布】
   # 打包正式环境
   npm run build:prod

   # 打包预发布环境
   npm run build:stage

TIP
可以把 vue-element-admin 当做工具箱或者集成方案仓库,在 vue-admin-template 的基础上进行二次开发,想要什么功能或者组件就去 vue-element-admin 那里复制过来。*

文件说明【vue element admin】
● src/permission.js(最先进入到此文件,走【router.beforeEach】方法)
   判断token是否存在、是否有效、是否非法用户,白名单(whiteList),进行页面跳转,非法用户跳转登录页面,合法用户跳转内部页面。

● src/utils/permission.js
   checkPermission:判断角色权限

● src/utils/auth.js
   获取【getToken()】、获取用户信息【user/getInfo】

● src/store/modules/user.js
   调用登录API接口在此文件中实现【login({ commit }, userInfo) {】

● 根目录/.env.development【对应 npm run dev 环境】
   开发环境下的配置文件
   属性名必须以VUE_APP_开头,比如VUE_APP_XXX

● 根目录/.env.production【对应 npm run build 环境】
   生产环境下的配置文件
   属性名必须以VUE_APP_开头,比如VUE_APP_XXX

● 根目录/.env.staging

2、vue-element-admin 在线预览
vue-element-admin 在线预览

3、vue-element-admin 使用文档
vue-element-admin 使用文档

4、vue-element-admin 国内访问文档
vue-element-admin 国内访问文档

5、基础模板建议使用: vue-admin-template
github【English】
github【简体中文】
线上地址
国内访问  

TIP
可以把 vue-element-admin当做工具箱或者集成方案仓库,在 vue-admin-template 的基础上进行二次开发,想要什么功能或者组件就去 vue-element-admin 那里复制过来。

6、桌面端: electron-vue-admin
桌面端: electron-vue-admin

7、Typescript 版: vue-typescript-admin-template
github【简体中文】
线上文档
线上地址

8、Mock.js
github
官网 
文档
Mock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:
● 根据数据模板生成模拟数据
● 模拟 Ajax 请求,生成并返回模拟数据
● 基于 HTML 模板生成模拟数据
9、vue 路由
Vue Router 是 Vue 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:
● 嵌套的路由/视图表
● 模块化的、基于组件的路由配置
● 路由参数、查询、通配符
● 基于 Vue.js 过渡系统的视图过渡效果
● 细粒度的导航控制
● 带有自动激活的 CSS class 的链接
● HTML5 历史模式或 hash 模式,在 IE9 中自动降级
● 自定义的滚动条行为

CDN 引用:
NPM 安装:npm install vue-router
Vue 项目安装路由:进入到项目的根目录【cd D:\MyFile\VueProject】输入:install --save vue-router 回车

注意:如果在src的根目录下创建的router.js文件,\src\router.js,import可以使用
注意:如果在src的根目录下创建的router.js文件,\src\router.js,import可以使用
注意:如果在src的根目录下创建的router.js文件,\src\router.js,import可以使用

component: () => import('./views/***.vue') 或 component: () => import('@/views/***.vue')
如何在src的router目录下创建的index.js文件,\src\router\index.js,import只能使用
component: () => import('@/views/***.vue')

在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:/router/index.js 文件

import Vue from 'vue'
import Router from 'vue-router'
// 引用模板
import Home from './views/Home.vue'
import dashboard from '@/views/dashboard/index'

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (about.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
    },
    {
      path: '/dashboard',
      component: dashboard
    },
    {
      path: '/login',
      component: () => import('@/views/login/index'),
      //component: () => import('./views/About.vue')
   },
  ]
})

main.js 文件引入路由 /router/index.js 文件

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

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

*
*
*
路由 API 文档
github 示例

1、定义 (路由) 组件。
const Foo = { template: '

foo
' }
const Bar = { template: '
bar
' }
2、定义路由,每个路由应该映射一个组件。 可以是"component" 
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]
3、创建 router 实例,然后传 `routes` 配置
const router = new VueRouter({
  routes // (缩写) 相当于 routes: routes
})
4、创建和挂载根实例
const app = new Vue({
  router
}).$mount('#app')

*、to router-link API 参考

*、replace router-link API 参考
设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),于是导航后不会留下 history 记录。


*、append router-link API 参考
设置 append 属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b

*、routes router-link API 参考
interface RouteConfig = {
  path: string,
  component?: Component,
  name?: string, // 命名路由
  components?: { [name: string]: Component }, // 命名视图组件
  redirect?: string | Location | Function,
  props?: boolean | Object | Function,
  alias?: string | Array,
  children?: Array, // 嵌套路由
  beforeEnter?: (to: Route, from: Route, next: Function) => void,
  meta?: any,

  // 2.6.0+
  caseSensitive?: boolean, // 匹配规则是否大小写敏感?(默认值:false)
  pathToRegexpOptions?: Object // 编译正则的选项
}

配置路由模式
● hash: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器。
● history: 依赖 HTML5 History API 和服务器配置。查看 HTML5 History 模式。
● abstract: 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式。

Hash模式
vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。hash(#)是URL 的锚点,代表的是网页中的一个位置

History模式
只需要在配置路由规则时,加入"mode: 'history'",这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。
*
导航卫士、全局前置守卫、路由拦截  全局前置卫士 

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
  // ...
  /* 必须调用 `next` */
  // next(`/login?redirect=${to.path}`)            // ok
  // next({ path: '/documentation/index' })        // ok
  // router.push({ path: '/documentation/index' }) // ok
})

● to: Route: 即将要进入的目标路由对象
● from: Route: 当前导航正要离开的路由
● next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

导航守卫、全局解析守卫
这和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用

const router = new VueRouter({ ... })
router.afterEach((to, from) => {
  // ...
})

*
导航守卫、全局后置钩子
这些钩子不会接受 next 函数也不会改变导航本身

const router = new VueRouter({ ... })
router.afterEach((to, from) => {
  // ...
})

*
10、Vuex 状态管理模式
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。它能解决你很多全局状态或者组件之间通信的问题。
store
每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:
● Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
● 不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

State:单一状态树         Vuex.Store 实例属性    
Getter:计算属性
Mutation:状态管理
Action:状态管理
Module:状态管理
dispatch:Vuex.Store 实例方法    异步操作,数据提交至 actions ,可用于向后台提交数据
commit:Vuex.Store 实例方法      同步操作,数据提交至 mutations ,可用于登录成功后读取用户信息写到缓存里
mapState:组件绑定的辅助函数  
mapGetters:组件绑定的辅助函数  
mapActions
mapMutations

示例:

this.$store.commit('loginStatus', 1);
this.$store.dispatch('isLogin', true);

以 vue element admin 为例【Vuex
第一步:首先,在 /src/store/modules/user.js 文件定义相关方法【user_name,real_name】
【注意: const state = { token: getToken() } 可解决刷新页面数据丢失问题】

import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router, { resetRouter } from '@/router'

const state = {
  token: getToken(),
  name: '',
  avatar: '',
  user_name: '',
  real_name: '',
  department_code: '',
  room_code: '',
  doctor_code: '',
  introduction: '',
  roles: []
}

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_USER_NAME: (state, user_name) => {
    state.user_name = user_name
  },
  SET_REAL_NAME: (state, real_name) => {
    state.real_name = real_name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles
  }
}

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      console.log(`/src/store/modules/user.js Ln 36`)
      login({ user_name: username.trim(), password: password }).then(response => {
        const { data } = response
        console.log(`/src/store/modules/user.js Ln 39 ${JSON.stringify(response)}`)
        console.log(`/src/store/modules/user.js Ln 40 ${JSON.stringify(data.access_token)}`)
        commit('SET_TOKEN', data.access_token)
        setToken(data.access_token)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // get user info
  getInfo({ commit, state }) {
    console.log(`/src/store/modules/user.js Ln 52 ${state.token}`)
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(response => {
        const { data } = response
        console.log(`/src/store/modules/user.js Ln 56 ${data}`)
        if (!data) {
          reject('Verification failed, please Login again.')
        }

        const { roles, name, user_name, real_name, avatar, introduction } = data

        // roles must be a non-empty array
        if (!roles || roles.length <= 0) {
          reject('getInfo: roles must be a non-null array!')
        }

        commit('SET_ROLES', roles)
        commit('SET_NAME', name)
        commit('SET_USER_NAME', user_name)
        commit('SET_REAL_NAME', real_name)
        commit('SET_AVATAR', avatar)
        commit('SET_INTRODUCTION', introduction)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

第二步:然后,在src/views/login/index.vue就可以使用 this.$store.dispatch 方法。

this.$store.dispatch('user/login', this.loginForm)
  .then(() => {
    console.log(`login/index.vue,Ln 161,path:${this.redirect} query:${JSON.stringify(this.otherQuery)}`)
    this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
    this.loading = false
  })
  .catch(() => {
    this.loading = false
  })

const { roles } = await store.dispatch('user/getInfo')

const accessRoutes = await store.dispatch('permission/generateRoutes', roles)

await store.dispatch('user/resetToken')

第三步:然后,在 src/views/profile/index.vue 文件【user_name,real_name】
关键点1:import { mapGetters } from 'vuex'
关键点2:computed: {...mapGetters(['user_name','real_name'])}
关键点3:methods: { getUser() {} }




第四步:最后,在 src/store/getters.js 文件【user_name,real_name】

const getters = {
  sidebar: state => state.app.sidebar,
  size: state => state.app.size,
  device: state => state.app.device,
  visitedViews: state => state.tagsView.visitedViews,
  cachedViews: state => state.tagsView.cachedViews,
  token: state => state.user.token,
  avatar: state => state.user.avatar,
  name: state => state.user.name,
  user_code: state => state.user.user_code, /*********/
  user_name: state => state.user.user_name, /*********/
  real_name: state => state.user.real_name, /*********/
  introduction: state => state.user.introduction,
  roles: state => state.user.roles,
  permission_routes: state => state.permission.routes,
  errorLogs: state => state.errorLog.logs
}
export default getters

安装 | Vuex     vuex 安装:$ npm install vuex --save
项目结构 | Vuex

/store/index.js 文件

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

Vue.use(Vuex)

export default new Vuex.Store({
  state: {

  },
  mutations: {

  },
  actions: {

  }
})

main.js 文件引入路由 /store/index.js 文件

import Vue from 'vue'
import App from './App.vue'
import store from './store/index'

Vue.config.productionTip = false

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')

*
*
11、VUX
VUX 是基于 WeUI 和 Vue(2.x) 开发的 移动端UI 组件库,主要服务于微信页面。
基于webpack + vue-loader + vux可以快速开发移动端页面,配合vux-loader方便你在WeUI的基础上定制需要的样式。
vux-loader保证了组件按需使用,因此不用担心最终打包了整个vux的组件库代码。
VUX并不完全依赖于WeUI,VUX 在 WeUI 的基础上扩展了多个常用组件,但是尽量保持整体UI样式接近WeUI的设计规范。
*
Vant 轻量、可靠的移动端 Vue 组件库
npm 安装:npm i vant -S
*
*
*
12、Vue Loader
Vue Loader 是为 vue 文件定制的一个 webpack 的 loader,它允许你以一种名为 单文件组件 (SFC) 的格式撰写 Vue 组件。它能在开发过程中使用热重载来保持状态,为每个组件模拟出 scoped CSS 等等功能。不过大部分情况下你不需要对它直接进行配置,脚手架都帮你封装好了。





Vue 单文件组件 (SFC) 规范
.vue 文件 是一个自定义的文件类型,用类 HTML 语法描述一个 Vue 组件。每个 .vue 文件包含三种类型的顶级语言块