vue2.x知识点

笔记

脚手架环境结构:

|——— node_modules
|—— public
| |—— favicon.ico 页签图标
| |—— index.html 主页面
|—— src
| |—— assets 主页面
| | |——logo.png
| |—— components 存放组件
| | |——HelloWorld.vue
| |—— App.vue 汇总所有组件
| |—— main.js 入口文件
| |—— .gitignore git版本管理忽略的配置
| |—— babel.config.js babel的配置文件
| |—— package.json 应用包配置文件
| |—— README.md 应用描述文件
| |—— package-lock.json 包版本控制文件

关于不同版本的Vue:

  • 1.vue.js 与 vue.runtime.xxx.js的区别
    • (1).vue.js是完整版的Vue,包含:核心功能和模板解析器。
    • (2).vue.runtime.xxx.js是运行版的Vue,只包含:核心功能,没有模板解析器
  • 2.因为vue.runtime.xxx.js没有模板解析器,所有不能用template配置项,需要使用render函数接收createElement函数去指定具体内容

vue.config.js配置文件

  • 1.使用vue inspect > output.js 可以查看到Vue脚手架的默认配置
  • 2.使用vue.config.js 可以对脚手架进行个性化定制, 详情见:https://cli.vuejs.org/zh

ref属性

  • 1.被用来给元素或子组件注册引用信息(id的替代者)
  • 2.应用在html标签上获取的是真实DOM元素,应用在组件标签上的是组件实例对象(vc)
  • 3.使用方式:
    • 打标识:<h1 ref="xxx">.....</h1> <School ref="xxx"/>
    • 获取:this.refs.xxx

配置porps

功能:让组件接收外部传过来的数据

  • (1).传递数据:
<Dome name='xxx'>
  • (2).接收数据
  • 第一种方式(只接收)
    props: ['name']
  • 第二种方式(限制类型)
    props: {
        name: String
    }
  • 第三种方式(限制类型,限制必要性,指定默认值)
    props: {
        type: String, //类型
        required: true, //必要性
        default: '老王' //默认值

备注: porps是只读的.Vue底层会监测你对porps的修改,如果进行修改了,就会发出警告,
若业务确实要需要修改,那么请复制porps的内容到data中,然后去修改data中的数据。

mixin(混入)

  • 功能:可以把每个组件共用的配置提取成一个混入对象
  • 使用方式:
    • 第一步定义混合:例如
        {
            data(){...},
            methods: {...}
            ...
        }
    
    • 第二步使用混入:例如
      (1)全局混入:Vue.mixin(xxx)
      (2) 局部混入:mixins: ['xxx']

插件

  • 功能:用于增强Vue
  • 本质: 包含install方法的一个对象,install的第一个参数是Vue,第二个参数是插件使用者传递的数据
  • 定义插件:
    // 1.全局过滤器
    Vue.filter('mySlice',function(value) {
    return value.slice(0,4)
    }),
    // 2.定义全局指令
    Vue.directive('fbind',{
    bind(element, binding) {
        console.log(element,binding)
        element.value = binding.value
    },
    // 指令所在的元素插入页面时
    inserted(element, binding) {
        element.focus()
    },
    // 指令所在的模板被重新解析时
    update(element, binding) {
        element.value = binding.value
        element.focus()
        console.log('update')
    },
    }),
    // 3.配置全局混入(合)
    Vue.mixin({
    data() {
        return {
        x: 200,
        y: 300
        }
    },
    showName() {
        alert(this.studentName)
    }
    })
    // 添加实例方法
    Vue.prototype.$myMethod = function() {....}
    Vue.prototype.$myproperty = xxx
  • 使用插件: Vue.use()

scoped样式

  • 作用:让样式局部生效,防止冲突
  • 写法:<style scoped>

总结TodoList案例

  • 1:组件化流程编码:
    • (1)拆分静态组件:组件要按照功能拆分,命名不要与html元素冲突。
    • (2)实现动态组件:考虑数据存放的位置,数据是一个组件在用,还是一些组件在用
      • 1.一个组件在用,放在组件自身即可
      • 2.一些组件在用,放在他们共同的父组件上(状态提升)
    • (3)实现交互:从绑定事件开始
  • 2:props适用于:
    • (1)父组件==>子组件通信
    • (2)子组件==>父组件通信(要求父给子一个函数)
  • 3: 使用v-model要切记:v-model绑定的值不能是props传过来的值,因为props是不可修改的!
  • 4:props传过来的若是对象类型的值,修改对象中属性值Vue不会报错,但不推荐这样做。

webStorage

  • 1.存储内容大小一般支持5MB左右(不同的浏览器可能不一样)
  • 2.浏览器通过window.localStoragewindow.sessionStorage属性实现本地存储机制
  • 3.相关API:
    • 1.xxxxxStorage.setItem('key','value')
      • 该方法会接收一个键和值作为参数,会把键值对添加到存储中,如果键名存在,更新其对应的值。
    • 2.xxxxxStorage.getItem('key')
      • 该方法接收一个键名作为参数,返回键名对应的值
    • 3.xxxxxStorage.getItem('key')
      • 该方法接收一个键名作为参数,并将该键名从存储中删除
    • 4.xxxxxStorage.clear()
      • 该方法会清除存储中的所有数据
  • 4.备注
    • 1.sessionStorage存储的内容会随浏览器窗口关闭而消失。
    • 2.localStorage存储的内容需要手动清除才消失
    • 3.xxxxxStorage.getItem(xxx)如果xxx对应的value获取不到,那个getItem返回值是null
    • 4.JSON.parse(null)的结果依然是null

组件的自定义事件

  • 1.一种组件间的通信方式,适用于:子组件===>父组件
  • 2.使用场景:A是父组件,B是子组件,B想给A传数据,那么就要A中给B绑定自定义事件(事件的回调在A中)
  • 3.绑定自定义事件:
    • 1.第一种方式:在父组件中:<Dome @atguigu="test"/><Dome v-on:atguigu="test"/>
    • 2.第二种方式:在父组件中
         <Dome ref='demo'/> 
         .....
         mounted(){
             this.$refs.xxx.$on('atguigu',this.test)
         }
      
    • 3.若想让自定义事件只触发一次,可以使用once修饰符,或$once方法。
  • 4.触发自定义事件:this.$emit('atguigu',数据)
  • 5.解绑自定义事件:this.$off('atguigu')
  • 6.组件上也可以绑定原生的DOM事件,需要使用native修饰符。
  • 7.注意:通过this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么要用箭头函数,否则this指向会出问题!

全局事件总线

  • 1.一种组件间通信方式,适用于任意组件间的通信。
  • 2.安转全局事件总线:
new Vue({
    ......
    beforeCreate(){
        Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
    },
    ......
}).$mount('#app')
  • 3.使用事件总线:
    • 1.接收数据,A组件想要接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留着A组件自身。
        methods: {
            demo(data){
                ......
            },
        },
        mounted() {
            this.$bus.$on('xxxx',this.demo)
        },
    
    • 2.提供数据:this.$bus.$emit('xxxx',数据)
    • 3.最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。

消息订阅与发布(pubsub)

  • 1.一种组件间通信方式,适用于任意组件间的通信。
  • 2.使用步骤:
    • 1.安装pubsub:npm i pubsub-js
    • 2.引入:import pubsub from 'pubsub-js'
    • 3.接收数据,A组件想要接收数据,则在A组件中订阅消息,事件的回调留着A组件自身。
        methods: {
            demo(data){
              ......
            },
        },
        mounted() {
            this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息
        },
    
    • 4.提供数据:pubsub.publish('xxx',数据)
    • 5.最好在beforeDestroy钩子中,用pubsub.unsubscribe(this.pid)去取消订阅。

nextTick

  • 1.语法:this.$nextTick(回调函数)
  • 2.作用:在下一次DOM更新渲染结束后执行其指定的回调函数
  • 3.什么时候用:当改变数据后,要基于新的DOM进行某些操作,要在nextTick所指定的回调函数中执行

Vue封装的过渡与动画

  • 1.作用:在插入,更新或移除DOM元素时,在合适的时候给元素添加样式类名。
  • 2.图示:(详细vue官网动画)
  • 3.写法:
    • 1.准备好样式:
      • 元素进入的样式:
        • 1.v-enter: 进入的起点
        • 2.v-enter-active: 进入的过程
        • 3.v-enter-to: 进入的终点
      • 元素离开的样式:
        • 1.v-leave: 离开的起点
        • 2.v-leave-active: 离开的过程
        • 3.v-leave-to: 离开的终点
    • 2.使用包裹要过渡的元素,并配置name属性
    <transition name="hello">
        <h1 v-show="isShow">你好啊!</h1>
    </transition>
    
    • 3.备注:若多个元素需要过渡,则需要使用:<transition-grounp>,且每个元素需要指定key值。

vue脚手架配置代理

  • 方法一
    • 在vue.config.js添加如下配置
        devServer: {
            proxy: "http://localhost:5000"
        }
    
    • 说明:
      • 1.优点:配置简单,请求资源时直接发给前端8080即可
      • 2.缺点:不能配置多个代理,不能灵活控制请求是否走代理。
      • 3工作方式:若按照上述配置代理,当请求前端资源不存在时,那么该请求会转发给服务器(优先匹配前端资源)
  • 方法二
    • 编写vue.config.js配置具体代理规则:
        module.exports = {
            devServer: {
                proxy: {
                    '/api1': { //匹配所有以 '/api1'开头的请求路径
                        target: 'http://localhost:8080',代理目标的基础路经
                        changeOrigin: true,
                        pathRewrite: {'^/api1': ''},
                    },
                        '/api2': { //匹配所有以 '/api2'开头的请求路径
                        target: 'http://localhost:8090',代理目标的基础路经
                        changeOrigin: true,
                        pathRewrite: {'^/api1': ''},
                    } 
                }
            }
        }
    <!-- 
        changeOrigin设置为true时,服务器收到请求头中的host为:loaclhost: 8090,
        changeOrigin设置为false时,服务器收到请求头中的host为:loaclhost: 8080,
        changeOrigin默认为true
     -->
    
    • 说明:
      • 1.优点,可以配置多个代理器,且可以灵活控制请求是否走代理。
      • 2.缺点:配置略微繁琐,请求资源时必须加前缀。

插槽

  • 1.作用:让父组件可以向子组件指定位置插入html结构,也是一种组件中的通信方式,适用于父组件===>子组件
  • 2.分类:默认插槽,具名插槽,作用域插槽
  • 3.使用方式:
    • 1.默认插槽
      • 父组件中:
          <Category>
              <div>html结构1</div>         
          </Category>
      
      • 子组件中:
      <template>
          <div>
              <h3>{{title}}分类</h3>
              <!-- 定义插槽-->
              <slot>插槽默认内容...</slot>
          </div>
      </template>
      
    • 2.具名插槽
      • 父组件中:
      <Category>
          <template  slot='center'>
              <div>html结构1</div>
          </template>
          <template  v-slot:center>
              <div>html结构1</div>
          </template>
      </Category>
      
      • 子组件中:
      <template>
          <div>
          <!-- 定义插槽 -->
              <slot name='center'>插槽默认内容...</slot>
          </div>
      </template>
      
    • 3.作用域插槽:
      • 1.理解:数据在组件自身,但根据数据生成的结构需要组件的使用者来决定,(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
      • 2,具体编码
        • 父组件中:
        <template scope="atguigu">
        <ul>
            <li v-for="(item,index) in atguigu.games" :key="index">{{item}}</li>
        </ul>
        </template>
        </Category>
        <Category title="游戏" >
        <template scope="{games}">
            <ul>
                <li v-for="(item,index) in games" :key="index">{{item}}</li>
            </ul>
        </template>
        </Category>
        <Category title="游戏" >
        <template slot-scope="{games}">
            <ul>
                <li v-for="(item,index) in games" :key="index">{{item}}</li>
            </ul>
        </template>
        </Category>
        
        • 子组件中:
        <template>
            <div class="category">
                <h3>{{title}}分类</h3>
                <!-- 定义一个插槽(挖个坑,等着组件使用者进行填充) -->
                <slot :games='games'>我是一些默认值,当前使用者没有传递具体结构时,我会出现1</slot>
                <!-- <ul>
                    <li v-for="(item,index) in listData" :key="index">{{item}}</li>
                </ul> -->
            </div>
        </template>
        <script>
        export default {
            name: 'Category',
            props: ['title'],
            data() {
                return {
                    games: ['红色警戒', '穿越火线', '劲舞团', '超级玛丽'],
                }
            },
        }
        </script>
        

1.概念

在vue中实现集中式状态(数据)管理的一个vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件中的通信方式,且适用于任意组件间通信。

2.如何使用?

多个组件间需要共享数据时

3.搭建vuex环境

  • 1.创建文件 src/store/index.js
    import Vue from 'vue' 
    // 引入vuex
    import Vuex from 'vuex'
    <!-- 应用vuex -->
    Vue.use(Vuex)
    
    // 准备actions -> 用于响应组件中的动作
    const actions = {}
    
    // 准备mutations -> 用于操作数据(state)
    const mutations = {}
    
    // 准备state -> 用于存储数据
    const state = {}
    
    // 创建store并暴露
    export default new Vuex.Store({
        actions,
        mutations,
        state
    })
    

4.基本使用

  • 1.初始化数据,配置actions,配置mutations,操作store.js
    // 引入vue核心库
    import Vue from 'vue' 
    // 引入vuex
    import Vuex from 'vuex'
    Vue.use(Vuex)
    const actions = {
        <!-- 响应组件中加的动作 -->
         JIA(context,value){
         // console.log('actions中的JIA被调用了',context,value)
         context.commit('JIA',value)
         },
    }
    // 准备mutations -> 用于操作数据(state)
    const mutations = {
        <!-- 执行加 -->
        JIA(state, value) {
            state.sum += value
            // console.log('mutations中的JIA被调用了',state,value)
        },
    }
    // 准备state -> 用于存储数据
    const state = {
        sum: 0
    }
    // 创建store并暴露
    export default new Vuex.Store({
        actions,
        mutations,
        state
    })
    
  • 2.组件中读取vuex中的数据:$store.state.sum
  • 3.组件中读取vuex中的数据:$store.dispatch('action中的方法名',数据) $store.commit('mutations中的方法名',数据)
    备注:若没有网络请求或其他业务逻辑,组件中可以越过action,既不写dispatch,直接写commit

5.getters的使用

  • 1.概念:当state中的数据需要加工后再使用,可以使用getters加工。
  • 2.在state.js中追加getters配置
        .....
        const getters = {
            bigSum(state){
                return state.sum*10
            }
        }
    <!-- 创建并暴露store -->
    export default new Vuex.$store({
        .....
        getters
    })
    
  • 3.组件中读取数据: $state.getters.bigSum

6.四个map方法应用

  • 1。mapState方法: 用于帮助我们映射state中的数据为计算属性
        computed: {
            <!-- 借助mapState生成计算属性,sum,school,subject(对象写法) -->
            ...mapState({he: 'sum',xuexiao: 'school', xueke: 'subject'}),
            <!-- 借助mapState生成计算属性,sum,school,subject(数组写法) -->
            ...mapState(['sum','school','subject']),
        }
    
  • 2。mapGetters方法: 用于帮助我们映射getters中的数据为计算属性
        computed: {
            借助mapState生成计算属性,bigSum(对象写法)
            ...mapGetters({bigSum: 'bigSum'}),
            借助mapState生成计算属性,bigSum(数组写法)
            ...mapGetters(['bigSum']),
        }
    
  • 3.mapActions方法:用于帮助我们生成actions对话的方法,既:包含$state.dispatch(xxx)的函数
        methods:{
            // 借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
            ...mapActions({incrementOdd:"jiaOdd", incrementWait:"jiaWait"}),
            // 借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(数组写法)
            ...mapActions(["jiaOdd","jiaWait"]),
        }
    
  • 4.mapMutations方法:用于帮助我们生成mutations对话的方法,既:包含$state.commit(xxx)的函数
         methods:{
            // 借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)
            ...mapMutations({increment:"JIA", decrement:"jian"}),
            // 借助mapMutations生成对应的方法,方法中会调用commit去联系mutations (数组写法)
            ...mapMutations(["JIA", "jian"]),
        }
    
      备注:mapActions与mapMutations使用时若需要传递参数,在模板中绑定事件传递好参数,否则参数是事件对象
    

模块化+命名空间

  • 1.目的: 让数据更好维护,让多种数据分类更加明确。
  • 2.修改store.js
        const countAbout = {
            namespaced: true, //开启命名空间
            state: {
                x:1
            },
            actions: {....},
            mutations: {...},
            getters: {...},
        }
        const personAbout = {
            namespaced: true, //开启命名空间
            state: {
                x:1
            },
            actions: {....},
            mutations: {...},
            getters: {...},
        }
        // 创建store并暴露
        export default new Vuex.Store({
            modules: {
                countAbout,
                personAbout,
            }
        })
    
  • 3.开启命名空间,组件中读取state数据:
        <!-- 方式一,自己直接读取 -->
        this.$store.state.personAbout.personList
        <!-- 方式二,借助mapState读取 -->
        ...mapState('countAbout',['sum','school','subject']),
    
  • 4.开启命名空间,组件中读取getters数据:
        <!-- 方式一,自己直接读取 -->
        this.$store.getters['personAbout/firstPersonName']
        <!-- 方式二,借助mapGetters读取 -->
        ...mapGetters('countAbout',['bigSum']),
    
  • 5.开启命名空间,组件中调用dispatch
        <!-- 方式一,自己直接dispatch -->
        this.$store.dispatch('personAbout/addPersonWang',personObj)
        <!-- 方式二,借助mapActions -->
        ...mapActions('countAbout',{incrementOdd:"jiaOdd", incrementWait:"jiaWait"}),
    
  • 6.开启命名空间,组件中调用commit
        <!-- 方式一,自己直接commit -->
        this.$store.commit('personAbout/ADD_PERSON',personObj)
        <!-- 方式二,借助mapMutations -->
        ...mapMutations('countAbout',{increment:"JIA", decrement:"jian"}),
    

路由

  • 1.理解:一个路由(route)就是一个映射关系(key-value),多个路由需要路由器(router)进行管理
  • 2.前端路由:key是路径,value是组件。

1.基本使用

  • 1.安装vue-router,命令npm i vue-router
  • 2.应用插件Vue.use(VueRouter)
  • 3.编写router配置项
    • 引入VueRouter
    import VueRouter from 'vue-router'
    // 引入luyou组件
    import About from '../components/About'
    import Home from '../components/Home'
    // 创建router实例对象,去管理一组一组路由规则
    export default new VueRouter({
        routes: [
            {
                path: '/about',
                component: About
            },
            {
                path: '/home',
                component: Home
            }
        ]
    })
    
  • 4.实现切换(active-class可配置高亮样式)
    <router-link class="list-group-item active" to="/about">About</router-link>
    
  • 5.指定展示位置
    <router-view></router-view>
    

.几个注意点

  • 1.路由组件通常存放在pages文件中,一般组件通常存放在components文件夹。
  • 2.通过切换,隐藏了路由组件,默认是被销毁了,需要的时候再去加载。
  • 3.每个组件都有自己的$route属性,里面存储着自己的路由信息。
  • 4.整个应用只有一个router,可以通过组件的$router属性获取到。

3.多级路由

  • 1.配置路由规则,使用children配置项:
    routes: [
        {
            path: '/about',
            component: About
        },
        {
            path: '/home',
            component: Home,
            children: [ //通过children配置子级路由
                {
                    path: 'news', //此处一定不要写: /news
                    component: News,
                },
                {
                    path: 'message',//此处一定不要写: /message
                    component: Message,
                }
            ]
        }
    ]
    
  • 2.跳转(要写完整的路径):
    <router-link to="/home/news">News</router-link>
    

4.路由的query参数

  • 1.传递参数
    <!-- 跳转路由并携带参数,to的字符串写法 -->
    <!-- <router-link  to="/home/message/Detail?id=666&title='你好'">跳转</router-link> -->
    <!-- 跳转路由并携带query参数,to的对象写法 -->
    <router-link  :to="{path: '/home/message/Detail',query: {
        id: 666,
        title: '你好'
    }}">跳转</router-link>
    
  • 2.接收参数:
        $route.query.id
        $route.query.title
    

5.命名路由

  • 1.作用:可以简化路由跳转。
  • 2.如何使用
    • 1.给路由命名:
            {
                path: '/home',
                component: Home,
                children: [
                    {
                        path: 'news',
                        component: News,
                    },
                    {
                        path: 'message',
                        component: Message,
                        children: [
                            {
                                name: 'hello', //给路由命名
                                path: 'welcome',
                                component: Hello,
                            }
                        ]
                    }
                ]
            }
        ```
    - 2.简化跳转:
    ```javascript
    <!-- 简化前:需要完整的路径 -->
        <router-link to="/home/message/welcome">跳转</router-link>
    <!-- 简化后:直接通过名字跳转 -->
        <router-link :to="{name:'hello'}">跳转</router-link>
    <!-- 简化写法配合传递参数 -->
         <router-link  :to="{name: 'hello',query: {
                    id: 666,
                    title: '你好'
                }}">跳转</router-link>
    

6.路由的params参数

  • 1.配置路由,声明接收params参数
         {
            path: '/home',
            component: Home,
            children: [
                {
                    path: 'news',
                    component: News,
                },
                {
                    path: 'message',
                    component: Message,
                    children: [
                        {
                            name: 'xiangqing',
                            path: 'detail/:id/:title', //使用占位符接收params参数
                            component: Detail,
                        }
                    ]
                }
            ]
        }
    
  • 2.传递参数
        <!-- 跳转路由并携带params参数,to的字符串写法 -->
        <router-link  :to="`/home/message/detail/666/你好`">跳转</router-link>
        <!-- 跳转路由并携带params参数,to的对象写法 -->
        <router-link  :to="{name: 'xiangqing',
        params: {
            id: 666,
            title: '你好'
        }}">跳转</router-link> 
    
    • 特别注意:路由携带params参数时,若使用to的对象写法,不能使用path配置项,必须使用name配置!
  • 3.接收参数
        $route.params.id
        $route.params.title
    

7.路由的porps配置

  • 作用:让路由组件更方便收到参数
        {
            name: 'xiangqing',
            path: 'detail/:id/:title',
            component: Detail,
            // props的第一种写法,值为对象,该对象中所有key-value都会以props的形式传给Detail组件
            props: {a: 1, b: 'hello'},
            // props的第二种写法,值为布尔值,若布尔值为true,就会把该路由收到的所有params参数,以props的形式传给Detail组件
            props: true,
            // props的第三种写法,值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
            props($route){
                 console.log($route)
                 return {id: $route.params.id, title: $route.params.title}
            }
        }
    

8.的replace属性

  • 1.作用:控制路由跳转时操作浏览器历史记录的模式
  • 2.浏览器的历史记录分为两种写入方式:分别是push和place,push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push
  • 3.如何开启replace模式:<router-link replace .....>News</router-link>

9.编程式路由导航

  • 1.作用:不借助<router-link>实现路由跳转,让路由跳转更加灵活
  • 2.具体编码
        <!-- $router两个API -->
        this.$router.push({
            name: 'details',
            query: {
                id: xxx,
                title: xxx
            }
        })
        this.$router.replace({
            name: 'details',
            query: {
                id:xxx,
                title:xxx
            }
        })
    
        this.$router.back() //后退
        this.$router.forward() //前进
        this.$router.go(-2) //可以指定(前进后退几个页面)
    

10.缓存路由组件

  • 1.作用:让不展示的路由组件保持挂载,不被销毁。
  • 2.具体编码
        <keep-alive include="News">
                <router-view></router-view>
        </keep-alive>
    

11.两个新的生命周期钩子

  • 1.作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
  • 2.具体名字:
    • 1.activated 路由组件被激活时触发
    • 2.deactivated 路由组件失活时触发

12.路由守卫

  • 1.作用:对路由进行权限控制
  • 2.分类:全局守卫,独立守卫,组件内守卫
  • 3.全局守卫
    • // 全局前置路由守卫————初始化的时候被调用,每次路由切换之前被调用
    router.beforeEach((to,from,next)=>{
        console.log('前置路由守卫',to,from)
        if(to.meta.isAuth) { //判断是否需要鉴权
            if(localStorage.getItem('school') === 'atguigu') {
                next() //放行
            }else {
                alert('学校名不对,无权限查看!')
            }
        }else {
            next()
        }
    
    })
    
    • // 全局后置路由守卫————初始化的时候被调用,每次路由切换之前被调用
    router.afterEach((to,from)=> {
        console.log('后置路由守卫',to,from)
        document.title = to.meta.title || '音乐' //修改网页的title
    
    })
    
  • 4.独享守卫:
    beforeEnter: (to,from,next)=> {
        console.log('前置路由守卫', to, from)
        if(to.meta.isAuth){
            if(localStorage.getItem('school') === 'atguigu') {
                next()
            }else {
                alert('学校名不对,无权限查看!')
            }
        }else {
            next() 
        }
    }
    
  • 5.组件内守卫:
    //进入守卫: 通过路由规则,进入该组件时被调用
    beforeRouteEnter (to, from, next) {
    }
    //离开守卫: 通过路由规则,离开该组件时被调用
    beforeRouteLeave (to, from, next) {
    }
    

13.路由器的两种工作模式

  • 1.对于一个url来说,什么事hash值?—#后面的内容就是hash值。
  • 2.hash值不会包含在http请求中,既:hash不会带给服务器
  • 3.hash模式:
    • 1.地址永远带着#号,不美观
    • 2.若以后地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法
    • 3.兼容性好
  • 4.history模式:
    • 1,地址干净,美观
    • 2.兼容性和hash模式相比略差
    • 3.应用部署上线时需要后端人员支持,解决刷新页面404的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值