vuex和nprogress进度条的基本使用

本文介绍了如何在Vue.js项目中使用Vuex进行状态管理,包括安装、配置、state、mutations、actions和getters的使用。同时展示了如何进行模块化开发,并在main.js中引入和使用Vuex。此外,还讲解了如何通过nprogress库实现在axios请求时显示进度条,包括安装、配置和在拦截器中应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vuex

安装:

npm i vuex@3

配置:src下创建 store/index.js

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

// 使用插件
Vue.use(Vuex)

// state:仓库存储数据的地方
const state = {
    count: 1
};
// mutations:修改 state 的唯一手段
const mutations = {
    ADD(state,data){
        state.count +=data
    }
};
// actions:处理 action,可以书写自己的业务逻辑,也可以处理异步
const actions = {
    // 这里可以书写业务逻辑,但不能修改 state
    add({commit},data){
        commit("ADD",data);
    }
};
// getters:理解为计算属性,用于简化仓库数据,让组件获取仓库的数据更加方便
const getters = {};

// 对外暴露 Store类的一个实例
export default new Vuex.Store({
    state,
    mutations,
    actions,
    getters
}) 

分模块开发

store下创建 home/index.js

const state={};
const mutations = {};
const actions = {};
const getters = {};
export default{
    state,
    mutations,
    actions,
    getters
}

store/index.js 导入,并使用 modules

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

// 使用插件
Vue.use(Vuex)

import home from '@/store/home'  // @ 相当于 src目录

// 对外暴露 Store类的一个实例
export default new Vuex.Store({
    modules:{
        home
    }
}) 

使用:

main.js 中引入

import Vue from 'vue'
import App from './App.vue'
// 导入仓库 
import store from '@/store'
Vue.config.productionTip = false // 关闭生产提示
new Vue({
  render: h => h(App),
  store // 引用仓库 
}).$mount('#app')

App.vue

<template>
  <div>
      <button @click="add">点我+1</button>
      <span>{{count}}</span>
  </div>
</template>
<script>

// 引入 vuex
import {mapState} from 'vuex';
export default {
  computed:{
    ...mapState(['count']) // 也可以这样 count(){return this.$store.state.count}
  },
  methods: {
    add(){
      this.$store.commit("ADD",1)     // 直接调用 mutations中的ADD
      // this.$store.dispatch('add',1); // 派遣到 actions中的add ,然后actions中的add调用 mutations 中的 ADD
    }
  },
}
</script>

进度条

安装

npm i nprogress

使用

请求/响应拦截器中:

import axios from 'axios';
/**
 * nprogress:
 *      start:进度条开始
 *      done:进度条结束
 */
import nprogress from 'nprogress'  // 引入进度条
import "nprogress/nprogress.css";// 引入进度条样式

// 1. 创建 axios 实例
const requests = axios.create({
    baseURL:'/api',
    timeout: 5000, 

});
//请求拦截器
requests.interceptors.request.use((config)=>{
    nprogress.start(); // 启动进度条
    return config;
})

// 响应拦截器
requests.interceptors.response.use((resp)=>{
    nprogress.done();// 结束进度条
    return resp.data;
},(eror)=>{
    // 服务器响应失败
    return Promise.reject(new Error('服务器调用失败'));
})

export default requests;
### Vue3 动态路由加载数据库配置示例 在 Vue3 项目中实现动态路由加载并结合数据库中的路由配置,可以通过以下步骤完成。以下是详细的实现方法代码示例: #### 1. 项目结构 首先,确保项目结构清晰,便于管理动态路由逻辑。典型的项目结构如下: ``` src/ ├── router/ │ └── index.js # 路由配置文件 ├── store/ │ └── index.js # Vuex 状态管理 ├── views/ │ ├── Login.vue # 登录页面 │ └── Home.vue # 主页 └── api/ └── routeApi.js # 与后端交互获取路由数据的 API ``` #### 2. 后端接口设计 假设后端提供了一个接口 `/api/getRoutes`,用于返回基于用户权限的路由配置。返回的数据格式可以如下: ```json [ { "path": "/home", "name": "Home", "component": "HomeView", "meta": { "title": "首页", "requiresAuth": true } }, { "path": "/user/:id", "name": "User", "component": "UserView", "meta": { "title": "用户详情", "requiresAuth": true } } ] ``` #### 3. 动态路由加载逻辑 在 `src/router/index.js` 中实现动态路由加载逻辑。以下是具体代码示例: ```javascript import { createRouter, createWebHistory } from 'vue-router'; import NProgress from 'nprogress'; // 可选:用于显示加载进度条 import 'nprogress/nprogress.css'; // 静态路由(默认路由) const staticRoutes = [ { path: '/login', name: 'Login', component: () => import('@/views/Login.vue') } ]; // 创建路由实例 const router = createRouter({ history: createWebHistory(), routes: staticRoutes }); // 动态添加路由函数 function addDynamicRoutes(routes) { routes.forEach(route => { const componentPath = `@/views/${route.component}.vue`; route.component = () => import(componentPath); router.addRoute(route); // 动态添加路由 }); } // 从后端获取路由配置 import { fetchRoutesFromDatabase } from '@/api/routeApi'; router.beforeEach(async (to, from, next) => { if (to.meta.requiresAuth && !localStorage.getItem('token')) { next('/login'); // 如果需要授权且未登录,则跳转到登录页 } else { if (!router.getRoutes().some(r => r.path === '/home')) { try { NProgress.start(); const dynamicRoutes = await fetchRoutesFromDatabase(); // 获取动态路由 addDynamicRoutes(dynamicRoutes); // 添加动态路由 } catch (error) { console.error('Failed to load dynamic routes:', error); } finally { NProgress.done(); } } next(); } }); export default router; ``` #### 4. 数据库路由 API 实现 在 `src/api/routeApi.js` 中实现与后端交互的逻辑: ```javascript import axios from 'axios'; export async function fetchRoutesFromDatabase() { try { const response = await axios.get('/api/getRoutes'); return response.data; // 返回路由配置 } catch (error) { console.error('Error fetching routes from database:', error); throw error; } } ``` #### 5. 登录状态保持与缓存 为了在页面刷新时保持登录状态,可以使用 `localStorage` 或 `Vuex` 存储用户信息,并结合 `keep-alive` 组件缓存页面内容[^1]。 ```javascript // src/store/index.js import { createStore } from 'vuex'; export default createStore({ state: { token: localStorage.getItem('token') || null, user: JSON.parse(localStorage.getItem('user')) || null }, mutations: { SET_TOKEN(state, token) { state.token = token; localStorage.setItem('token', token); }, SET_USER(state, user) { state.user = user; localStorage.setItem('user', JSON.stringify(user)); } }, actions: { login({ commit }, { token, user }) { commit('SET_TOKEN', token); commit('SET_USER', user); }, logout({ commit }) { commit('SET_TOKEN', null); commit('SET_USER', null); localStorage.removeItem('token'); localStorage.removeItem('user'); } } }); ``` #### 6. 使用 `keep-alive` 缓存页面 在 `App.vue` 中使用 `keep-alive` 组件来缓存页面内容: ```vue <template> <div id="app"> <keep-alive include="Home,User"> <router-view /> </keep-alive> </div> </template> ``` --- ### 注意事项 - 确保后端返回的路由配置与前端组件路径一致。 - 使用懒加载(`import()`)优化性能[^5]。 - 在路由守卫中处理权限校验逻辑,避免未授权用户访问敏感页面[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值