search
HomeWeb Front-endJS TutorialDetailed explanation of the routing implementation principle of vuejs

This article brings you a detailed explanation of the routing implementation principle of vuejs. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

In general source code, window.history and location.hash are used

history implementation

The window.history object contains the history of the browser, and the window.history object is used when writing You do not need to use the window prefix. History is a mainstream method for implementing SPA front-end routing. It has several original methods:

history.back()

The same as clicking the back button in the browser

history.forward()

Same as clicking the button forward in the browser

history.go(n)

Accept an integer as a parameter and move to the page specified by the integer. For example, go(1) is equivalent to forward(), go(-1) is equivalent to back(), go(0) is equivalent to refreshing the current page
If The moved position exceeds the boundary of the access history. The above three methods do not report an error, but fail silently

In HTML5, the history object proposes the pushState() method and replaceState() method. These two methods can Used to add data to the history stack, just as if the url has changed (in the past, only the url changed and the history stack would change), so that the browsing history and forward and backward can be well simulated. The current front-end routing is also based on this principle. of.

history.pushState

pushState(stateObj, title, url) method writes data to the history stack. Its first parameter is the data object to be written (not larger than 640kB). The second parameter is the title of the page, and the third parameter is the url (relative path).

stateObj: A state object related to the specified URL. When the popstate event is triggered, the object will be passed into the callback function. If this object is not needed, null can be filled in this *.
title: The title of the new page, but all browsers currently ignore this value, so null can be filled in here.
url: The new URL must be in the same domain as the current page. Your browser's address bar will display this URL.
Regarding pushState, there are several things worth noting:

The pushState method will not trigger a page refresh, but will cause the history object to change, and the address bar will react. Only when events such as forward and backward are triggered (back () and forward(), etc.)
The URL here is restricted by the same-origin policy to prevent malicious scripts from imitating other website URLs to deceive users, so when the same-origin policy is violated, an error will be reported

history.replaceState

The difference between replaceState(stateObj, title, url) and pushState is that it does not write but replaces and modifies the current record in the browsing history. The rest is exactly the same as pushState.

popstate event

Definition: Whenever the browsing history of the same document (that is, the history object) changes, the popstate event will be triggered.
Note: Simply calling the pushState method or replaceState method will not trigger this event. It will only be triggered when the user clicks the browser's back button and forward button, or uses JavaScript to call the back, forward, and go methods. In addition, this event only targets the same document. If the switching of browsing history causes different documents to be loaded, this event will not be triggered.
Usage: When using, you can specify a callback function for the popstate event. The parameter of this callback function is an event object, and its state attribute points to the state object provided by the pushState and replaceState methods for the current URL (that is, the first parameter of these two methods).

HISTORY implements SPA front-end routing code
<a>abc.html</a>
<a>123.html</a>
<a>rdhub</a>
  // 注册路由
  document.querySelectorAll('.spa').forEach(item => {
    item.addEventListener('click', e => {
      e.preventDefault();
      let link = item.textContent;
      if (!!(window.history && history.pushState)) {
        // 支持History API
        window.history.pushState({name: 'history'}, link, link);
      } else {
        // 不支持,可使用一些Polyfill库来实现
      }
    }, false)
  });

  // 监听路由
  window.addEventListener('popstate', e => {
    console.log({
      location: location.href,
      state: e.state
    })
  }, false)
popstate监听函数里打印的e.state便是history.pushState()里传入的第一个参数,在这里即为{name: 'history'}

hash

Basic introduction to hash

The url can contain a hash http://localhost :9000/#/rdhub.html

There is an event in the window object is onhashchange. This event will be triggered in the following situations:

  1. Change the browser address directly, at the end Add or change #hash;

  2. By changing the value of location.href or location.hash;

  3. By triggering a click on an anchored link ;

  4. Moving the browser forward or backward may cause the hash to change, provided that the hash values ​​in the two web page addresses are different.

hash implements SPA front-end routing code

<a>rdhub</a>
<a>abc</a>
<a>123</a>
<a>hash</a>
  document.querySelectorAll('.spa').forEach(item => {
    item.addEventListener('click', e => {
      e.preventDefault();
      let link = item.textContent;
      location.hash = link;
    }, false)
  });
  // 监听路由
  window.addEventListener('hashchange', e => {
    console.log({
      location: location.href,
      hash: location.hash
    })
  }, false)

hash mode and history mode, these two modes are implemented through the browser interface, except In addition, vue-router also prepares an abstract mode for non-browser environments. The principle is to use an array stack to simulate the function of the browser history stack. Of course, the above are just some core logic. To ensure the robustness of the system, there is a lot of auxiliary logic in the source code, which is also worth learning.

Comparison of the two modes

The new URL set by pushState can be any URL that has the same origin as the current URL; while hash can only modify the part after #, so it can only be set with The current URL of the same document

The new URL set by pushState can be exactly the same as the current URL, which will also add the record to the stack; and the new value set by the hash must be different from the original to trigger the addition of the record to the stack Medium

pushState can add any type of data to the record through stateObject; while hash can only add short strings

pushState can additionally set the title attribute for subsequent use

A problem with history mode

We know that for single-page applications, the ideal usage scenario is to only load index.html when entering the application, and subsequent network operations are completed through Ajax, and will not be based on The URL re-requests the page, but it is inevitable to encounter special circumstances, such as the user directly typing in the address bar and pressing Enter, the browser restarts and reloads the application, etc.

Hash mode only changes the content of the hash part, and the hash part will not be included in the HTTP request:

http://rdhub.cn/#/user/id // Such as The re-request will only send http://rdhub.cn/
, so there will be no problem when requesting a page based on the URL in hash mode.

The history mode will modify the URL to be the same as the normal request backend URL
http://rdhub.cn/user/id
In this case, resend the request to the backend , if the backend is not configured with routing processing corresponding to /user/id, a 404 error will be returned.

The officially recommended solution is to add a candidate resource on the server that covers all situations: if the URL does not match any static resources, it should return the same index.html page, which is what your app depends on. page. At the same time, after doing this, the server will no longer return a 404 error page, because the index.html file will be returned for all paths. To avoid this, cover all routing situations in the Vue application and then give a 404 page. Or, if you use Node.js as the backend, you can use server-side routing to match the URL, and return 404 when no route is matched, thereby implementing fallback.

The above is the detailed content of Detailed explanation of the routing implementation principle of vuejs. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:segmentfault思否. If there is any infringement, please contact admin@php.cn delete
JavaScript and the Web: Core Functionality and Use CasesJavaScript and the Web: Core Functionality and Use CasesApr 18, 2025 am 12:19 AM

The main uses of JavaScript in web development include client interaction, form verification and asynchronous communication. 1) Dynamic content update and user interaction through DOM operations; 2) Client verification is carried out before the user submits data to improve the user experience; 3) Refreshless communication with the server is achieved through AJAX technology.

Understanding the JavaScript Engine: Implementation DetailsUnderstanding the JavaScript Engine: Implementation DetailsApr 17, 2025 am 12:05 AM

Understanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.

Python vs. JavaScript: The Learning Curve and Ease of UsePython vs. JavaScript: The Learning Curve and Ease of UseApr 16, 2025 am 12:12 AM

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Python vs. JavaScript: Community, Libraries, and ResourcesPython vs. JavaScript: Community, Libraries, and ResourcesApr 15, 2025 am 12:16 AM

Python and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.

From C/C   to JavaScript: How It All WorksFrom C/C to JavaScript: How It All WorksApr 14, 2025 am 12:05 AM

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

JavaScript Engines: Comparing ImplementationsJavaScript Engines: Comparing ImplementationsApr 13, 2025 am 12:05 AM

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

Beyond the Browser: JavaScript in the Real WorldBeyond the Browser: JavaScript in the Real WorldApr 12, 2025 am 12:06 AM

JavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.

Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

I built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Have Crossplay?
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.