$router.replace和$store.commit的使用
时间: 2023-12-30 14:04:42 浏览: 74
`$router.replace` 和 `$store.commit` 是两个不同的 Vue API,分别用于路由导航和 Vuex 状态管理。
`$router.replace` 用于在 Vue 应用中进行路由导航,它会替换当前的路由,而不是添加一个新的历史记录。例如:
```
this.$router.replace('/home');
```
这个例子中,我们使用 `$router.replace` 方法将当前路由替换为 `/home` 路由。
`$store.commit` 用于在 Vuex 中提交一个 mutation 来改变状态。例如:
```
this.$store.commit('increment', 10);
```
这个例子中,我们调用了名为 `increment` 的 mutation,并传递了一个值为 10 的参数。这将会更新 Vuex 的状态。
在实际开发中,我们可能会同时使用 `$router.replace` 和 `$store.commit` 来实现页面跳转和状态管理。例如,在某个页面中提交一个表单后,可以调用 `$store.commit` 方法来更新状态,并且调用 `$router.replace` 方法来跳转到另一个页面。
相关问题
router.beforeEach((to, from, next) => { if (store.getters.getRouters == null) { // 获取菜单和路由 getMenusApi(params).then((res) => { if (res.data.length === 0) { window.location.href = process.env.VUE_APP_API_BASE_CONSOLE || '' } const { data } = res const menuNav = [] const childrenNav = [] // 后端数据, 根级树数组, 根级 PID listToTree(data, childrenNav, 0) menuNav.push(...childrenNav) const routers = generator(menuNav, null) routers.forEach((r) => { router.addRoute(r) }) router.addRoute(page404) store.commit('SET_ROUTERS', routers[0].children) // 请求带有 redirect 重定向时,登录自动重定向到该地址 const redirect = decodeURIComponent(from.query.redirect || to.path) if (to.path === redirect) { // set the replace: true so the navigation will not leave a history record next({ ...to, replace: true }) } else { // 跳转到目的路由 next({ path: redirect }) } }).catch((error) => { console.log(error,'error') if (error.data.code !== 200 || error.data.data.length === 0) { setTimeout(function () { window.location.href = process.env.VUE_APP_API_BASE_CONSOLE || '' }, 5) } }) // // 获取按钮权限 // getPermissionApi(params).then((res: any) => { // if (res.data.code !== 200) return ElMessage.error(res.data.message) // store.commit('SET_PERMISSION', res.data.data) // }) // // 获取数据权限 // getRolesApi(params).then((res: any) => { // if (res.data.code !== 200) return ElMessage.error(res.data.message) // store.commit('SET_ROLES', res.data.data) // }) // // 获取用户信息 // getUserInfoApi().then((res: any) => { // if (res.data.code !== 200) return ElMessage.error(res.data.message) // store.commit('SET_USERS', res.data.data) // }) } else { next() } })
这是一个 Vue 路由守卫的代码片段,用于在路由切换前进行一些操作。其中包含了以下主要逻辑:
1. 判断 store 中的路由信息是否为空,如果为空则向后端发起请求获取菜单和路由信息。
2. 通过 getMenusApi 函数向后端发起请求,获取菜单和路由信息。如果请求成功,则将获取到的菜单和路由信息转换为前端路由,并添加到 Vue Router 中。
3. 如果请求带有 redirect 重定向参数,则自动跳转到该地址。
4. 如果 store 中已经有路由信息,则直接跳转到目的路由。
5. 如果获取菜单和路由信息失败,则跳转到 404 页面或者登录页面。
注释中的代码是一些额外的逻辑,用于获取用户信息、按钮权限、数据权限等。
import Vue from 'vue' import VueRouter from 'vue-router' import store from "@/store" Vue.use(VueRouter) const routes = [ { path: '/login', name: 'Login', component:()=>import('../views/Login.vue') }, { path: '/register', name: 'Register', component:()=>import('../views/Register.vue') } ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) const setRoutes=()=>{ const storeCaidans=localStorage.getItem("caidans"); if (storeCaidans){ //拼装动态路由 const mangeRoute={path: '/', component: () => import(/* webpackChunkName: "about" */ '../views/Manage.vue'), redirect:"/home", children:[]} const caidans=JSON.parse(storeCaidans) caidans.forEach(item=>{ if(item.path){ //当且仅当path不为空的时候猜去设置路由 let itemCaidan={path: item.path.replace("/",""),name:item.name, component: () => import('../views/'+item.ppath+".vue")} mangeRoute.children.push(itemCaidan) }else if (item.children.length){ caidans.children.forEach(item =>{ if(item.path){ let itemCaidan={path: item.path.replace("/",""),name:item.name, component: () => import('../views/'+item.ppath+".vue")} mangeRoute.children.push(itemCaidan) } }) } }) //动态添加到现在的路由对象中去 router.addRoute(mangeRoute) } } router.beforeEach((to,from,next)=>{ localStorage.setItem("currentPathName",to.name) //设置当前路由名称 store.commit("setPath") next() }) export default router
这段代码是一个 Vue.js 的路由配置文件,其中定义了两个路由:/login 和 /register。另外,这段代码中还定义了一个 setRoutes 函数,用于动态添加路由,它会从 localStorage 中读取菜单数据,然后通过循环将菜单数据转化为动态路由,并添加到路由对象中去。在路由跳转之前,还会将当前路由的名称保存到 localStorage 中,并触发 store 中的 setPath 方法。最后,将路由对象导出,供其他组件使用。
阅读全文