


How does vue solve the problem of refresh failure after addRoutes dynamically adds routes?
This article mainly introduces how vue solves the problem of refresh failure after addRoutes dynamically adds routes. It has a certain reference value. Now I share it with you. Friends in need can refer to it
Preface
In some scenarios, we need to use addRoutes to dynamically add routes, but they will become invalid after refreshing. I happened to encounter this application scenario in the project some time ago, so I took the time to study it, share and record it. Please correct me if I am wrong.
Application scenario: User A logs in to the system, and there is a button on the page. After clicking, the route will be dynamically added and jump . After jumping, the user will also refresh Stay on the current page. If you don’t click this button and enter the address in the browser, the user will jump to the 404 page
github:https://github.com/Mrblackant...
View online :http://an888.net/router/keepR...
Idea
1. The user clicks the button and uses addRutes to dynamically add routes and jump Transfer and save the route;
2. When the user refreshes the newly jumped page, use beforeEach to intercept and judge. If it is found that the route has been saved before, and it is judged that the new page is just a refresh event, then add the previously saved route Come in;
Code
1. Click the button, save the route and jump
(1). Declare one in router/index.js Array, which contains some fixed routes, such as your login page, 404, etc.
//router/index.js export const constantRouterMap=[ { path: '/', // name: 'HelloWorld', component: HelloWorld } ] Vue.use(Router) export default new Router({ routes: constantRouterMap })
(2). Click the button to jump and save the route;
Note that saving the route Steps need to be entered into the component to be jumped to. This is to prevent an infinite loop in the beforeEach interception.
Adding routing requires two points, one is the path, and the other is the component. You can encapsulate it into a method. , it will be simpler when you look at it, I won’t do it here
Remember to use the concat method to connect, fixed routes and dynamically added routes, so that the browser can return normally when it rolls back
//点击跳转 <template> <p> 点击新增 动态路由: "secondRouter" <br> <el-button>新增动态路由</el-button> </p> </template> <script> import router from 'vue-router' import {constantRouterMap} from '@/router' export default { name: 'kk', mounted(){ }, data () { return { msg: 'Welcome to Your Vue.js App' } }, methods:{ srouter(){ let newRoutes=constantRouterMap.concat([{path:'/secondRouter', component :resolve => require(["@/components/kk"], resolve ) }]) this.$router.addRoutes(newRoutes) this.$router.push({path:'/secondRouter'}) } } } </script> //跳转过去的component组件,xxx.vue <template> <p> 恭喜你,动态添加路由成功,浏览器的链接已经变化; </p> <h3 id="无论你怎么刷新我都会留在当前页面">无论你怎么刷新我都会留在当前页面</h3> <h3 id="并且点击浏览器回退键-我会跳到之前页面-不会循环">并且点击浏览器回退键,我会跳到之前页面,不会循环</h3> </template> <script> import router2 from '@/router' import router from 'vue-router' export default { name: 'HelloWorld', mounted(){ localStorage.setItem('new',JSON.stringify({'path':'/secondRouter','component':'kk'}))//保存路由 }, data () { return { msg: 'Welcome to Your Vue.js App' } }, methods:{ } } </script>
2. Route interception beforeEach
When intercepting here, it will be judged whether there is a new dynamic route saved in localStorage. If so, it will be judged and logically processed. After the processing is completed, Clear the saved routes to prevent entering an infinite loop.
After entering the first level of judgment, you need to judge again whether it is a page refresh event
import router from './router' import { constantRouterMap } from '@/router' //router里的固定路由 router.beforeEach((to, from, next) => { if (localStorage.getItem('new')) { var c = JSON.parse(localStorage.getItem('new')), lastUrl=getLastUrl(window.location.href,'/'); if (c.path==lastUrl) { //动态路由页面的刷新事件 let newRoutes = constantRouterMap.concat([{ path: c.path, component: resolve => require(["@/components/" + c.component + ""], resolve) }]) localStorage.removeItem('new') router.addRoutes(newRoutes) router.replace(c.path) //replace,保证浏览器回退的时候能直接返回到上个页面,不会叠加 } } next() }) var getLastUrl=(str,yourStr)=>str.slice(str.lastIndexOf(yourStr))//取到浏览器出现网址的最后"/"出现的后边的字符
ps:At first I thought that the route jump 404 cannot be matched and must be intercepted Process it here, but later found that it is not necessary at all. Just add the following two paragraphs when registering the route:
export const constantRouterMap = [{ path: '/', component: HelloWorld }, {//404 path: '/404', component: ErrPage }, { //重定向到404 path: '*', redirect: '/404' } ]
The overall idea is probably like this, mainly using beforeEach to intercept the data storage of localStorage, and it can be completed. , addRoutes dynamically adds the route refresh function without invalidation.
Please correct me for any shortcomings
The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!
Related recommendations:
vue router: dynamic route matching dynamic route matching
Use mixin to write plug-ins for self-made vue component communication plug-ins
The above is the detailed content of How does vue solve the problem of refresh failure after addRoutes dynamically adds routes?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Ace is an embeddable code editor written in JavaScript. It matches the functionality and performance of native editors like Sublime, Vim, and TextMate. It can be easily embedded into any web page and JavaScript application. Ace is maintained as the main editor for the Cloud9 IDE and is the successor to the Mozilla Skywriter (Bespin) project.

The vue-router error "NavigationDuplicated:Avoidedredundantnavigationtocurrentlocation" encountered in the Vue application – how to solve it? Vue.js is becoming more and more popular in front-end application development as a fast and flexible JavaScript framework. VueRouter is a code library of Vue.js used for routing management. However, sometimes

Vue.js has become a very popular framework in front-end development today. As Vue.js continues to evolve, unit testing is becoming more and more important. Today we’ll explore how to write unit tests in Vue.js 3 and provide some best practices and common problems and solutions.

In Vue.js, developers can use two different syntaxes to create user interfaces: JSX syntax and template syntax. Both syntaxes have their own advantages and disadvantages. Let’s discuss their differences, advantages and disadvantages.

In the actual development project process, sometimes it is necessary to upload relatively large files, and then the upload will be relatively slow, so the background may require the front-end to upload file slices. It is very simple. For example, 1 A gigabyte file stream is cut into several small file streams, and then the interface is requested to deliver the small file streams respectively.

When we used Amap, the official recommended many cases and demos to us, but these cases all used native methods to access and did not provide demos of vue or react. Many people have written about vue2 access on the Internet. However, in this article, we will take a look at how vue3 uses the commonly used Amap API. I hope it will be helpful to everyone!

When I was working on the chatgpt mirror site, I found that some mirror sites did not have typewriter cursor effects, but only text output. Did they not want to do it? I want to do it anyway. So I studied it carefully and realized the effect of typewriter plus cursor. Now I will share my solution and renderings~

In short: JavaScript + React + Redux still dominate. Best paired with Next.js and Vercel. AI is advancing rapidly and Web3 is experiencing strong growth. There's been a lot of change over the past year, and it feels like everything is ready to be disrupted, but despite being the most disruptive year I've ever seen, the biggest surprise about this year's framework ecosystem is that very little has changed. While there are a lot of new players entering the market (hurray SolidJS), last year's big winners are still dominating this year and seem to show no signs of giving up in the job market (data to back it up). So what has changed? AI Accelerates Developers When I Made My First Time in 2020
