preface

Key points:

  • Routing principle
  • The Hash and History
  • To implement the routing

The working principle of a VUE route

The differences between front-end routes and back-end routes:

Back-end route: Enter URL > request sent to the server > path of the server to resolve the request > take the corresponding page > Return to the front-end route: enter URL > JS resolve address > find the corresponding page > Execute the generated JS page > See the page

Vue-router workflow

Use of Hash and history

hash:

  • The hash is the content of the hash
  • You can get it from location.hash
  • You can listen for hash changes through onHashchange
  • You can add the path after the # sign without asking the server

history:

  • History is the normal path
  • location.pathname
  • You can use onPopState to listen for history changes

3. Basic knowledge of Vue plug-in

Vue-router, vuex, and Element-UI are plug-ins

Basic points of plug-in:

  • Vue.use to use a plug-in and execute the install method
  • Vue.mixin blends custom operations into the global Vue
  • You can call this.$options to get the new Vue parameters

Example:

The following is executed in main.js

1, initial vue.use ()

Vue.use({
console.log('use') // Prints use
})
Copy the code

2. Install properties

let a = function() {
  console.log(a)
}
// let a ={}
a.install=function(){
  console.log('install')
}
Vue.use(a) // Install will be printed instead of a.
// If you give him a method, he executes the method,
// But whatever you give him, just give him an install attribute and he will execute install.
Copy the code

3, Vue. Mixin ()

let a = function() {
  console.log(a)
}
// let a ={}
a.install=function(vue){
   // vue. mixin global mixin custom operations. The above vue is passed in as a parameter, not the vue in import vue from 'vue'
   vue.mixin({
    data () {
      return {
        c:123456 // In other pages this.c}},methods:{
      globalMethods(){
        console.log('I'm a global method') // In other pages this.globalmethods ()
      }
    },
    created() {
      console.log(this)
    }
  })
}
Vue.use(a) 
Copy the code

Vue utility classes: defineReactive, extend, mergeOptions, WARN

let obj = {
  key:'KEY'
}
setTimeout(function () {
  obj.key='KEY2' {{this.obj1.key}}
},3000)

let a = function() {
  console.log(a)
}
// let a ={}
a.install=function(vue){
  console.log(vue.util) // VUE utility classes: defineReactive, extend, mergeOptions, WARN
  vue.util.defineReactive(obj,'key')  / / to monitor. The source code uses Object.defineProperty()
  vue.mixin({
    beforeCreate(){
      this.obj1=obj // On other pages {{this.obj1.key}}, the value is key.}})}Copy the code

Vue.extend () differs from vue.util.extend() :

vue.extend() // Unit tests
const home = Vue.extend(home)
// Create a new constructor for this component, that is, this for the component
const vm = new home().$mount()
vue.util.extend() // Shallow copy object
Copy the code

Iv. Vue – Router

The following is a basic vue-Router that can only be switched between pages. This article is for familiarizing yourself with the source code, not for practical purposes. Create a folder named myRouter under SRC and create an index.js file. In index.js of the original router folder, change the path imported to the router to import VueRouter from ‘.. /myrouter’

Edit index.js in myRouter folder

// Record the history object
class HistoryRoute{
    constructor() {// The path to listen on
        this.current=null; }}/ / vuerouter itself
class vueRouter{
    constructor(options){
        this.mode=options.mode||'hash'; // Configure mode
        this.routes=options.routes||[]; // routes Routing table
        this.routesMap=this.createMap(this.routes); // Call createMap with routes
        this.history=new HistoryRoute;// instantiate history
        this.init(); / / initialization
    }
    init(){
        if(this.mode=='hash') {// Check whether it is hash mode
            location.hash?' ':location.hash='/'; // automatically add #. Returns an empty string if there is a hash. Otherwise return /
            window.addEventListener('load', () = > {// The listening page is loaded
                this.history.current=location.hash.slice(1); // Get the hash value, remove the #. The current path assigned to the instantiated history.
            })
            window.addEventListener('hashchange', () = > {// Listen for hash changes
                this.history.current=location.hash.slice(1); }}})// The path corresponds to the component. Compose a new object. For example, {'/':Home} is a mapping.
    createMap(routes){
        return routes.reduce((memo,current) = >{ // current indicates the routes table
            memo[current.path]=current.component;
            return memo
        },{})
    }
}

vueRouter.install=function(Vue){
    // Write a plug-in to check whether the plug-in is registered
    if(vueRouter.install.installed)return
    vueRouter.install.installed=true;
    // Add operations to vue
    Vue.mixin({
        beforeCreate(){
            if(this.$options&&this.$options.router){ // The router option is available in the app. vue file
                this._root=this; // This refers to the current Vue instance, caching itself.
                this._router=this.$options.router; // Mount the router passed in from the options.
                Vue.util.defineReactive(this.'current'.this._router.history); // Listen for this.current and pass a third argument. Equivalent to children.
            }else{
                this._root=this.$parent._root; // If not, go up one level until app. vue new vue ({router}) is found.
            }

            // This.$router is read-only
            Object.defineProperty(this."$router", {//this refers to the current component instance
                get(){ 
                    return this._root._router; // Return to the mounted router}})}})// Define the component
    Vue.component('router-view',{
        render(h){
           let current=this._self._root._router.history.current;// Get the current stored in the router instance
           let routerMap=this._self._root._router.routesMap;// Get the routesMap currently stored in the Router instance
           return h(routerMap[current]); // Get the routerMap and call h. Render the routerMap mapping. Put it in the router-View component.}})}/ / vuerouter exposure
export default vueRouter;
Copy the code

conclusion

On the road ahead we walk together.