深入Vue3学习vue-router vuex

首页 / 新闻资讯 / 正文

vue-router

meta属性深入Vue3学习vue-router vuex
meta属性,后续可以通过route.meta拿到里面的值。

router hooks

深入Vue3学习vue-router vuex

深入Vue3学习vue-router vuex
这两个就是在setup中拿到的,相当于this.$route this. $router

匹配未找到路由

深入Vue3学习vue-router vuex当输入的路由在配置中没有的时候会匹配到这个component中。

router-link的tag

vue2的router-link可以通过tag属性,决定router-link渲染成什么形式。
而vue3通过插槽:
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex
甚至可以放一个组件。
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex

router-view的作用域插槽深入Vue3学习vue-router vuex

动态添加路由(开发常用)

深入Vue3学习vue-router vuex
可以根据一些权限管控来动态添加路由
这样是添加顶级路由对象。
添加二级路由:深入Vue3学习vue-router vuex
接受两个参数,深入Vue3学习vue-router vuex

删除

1 添加一个相同Name的路由
2 通过removeRoute的方法,传入路由的名称
3 通过addRoue的返回值调用。深入Vue3学习vue-router vuex

路由导航守卫

全局前置守卫boforeEach是在导航触发时调用的。

深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex
next在第四版已经不被推荐了。
现在通过返回值代替next了。
深入Vue3学习vue-router vuex

其他导航守卫

组件内守为,路由独享守卫
深入Vue3学习vue-router vuex

导航解析过程

深入Vue3学习vue-router vuex
可以看到,先调用失活组建的beforeRouteLeact,再调用全局的beforeEach…
注意的一点是,再beforeOruteEnter中时拿不到this的,所以通过最后组件创建完调用next的回调函数,将组件实例传进去。

在setup中的使用
useStrore hooks
深入Vue3学习vue-router vuex
基本使用
深入Vue3学习vue-router vuex

mapState用法

深入Vue3学习vue-router vuex
使用
深入Vue3学习vue-router vuex
mapState返回的是一个函数,所以必须使用调用的方式使用他,然后传入store才能正常使用。
我们可以借助computed
深入Vue3学习vue-router vuex
还是需要绑定store,借助computed,因为compunted就是传入一个函数的。然后将值解构出去即可。
深入Vue3学习vue-router vuex
所以我们封装一下这个函数
深入Vue3学习vue-router vuex
使用的时候
深入Vue3学习vue-router vuex

封装useState
深入Vue3学习vue-router vuex

getter

深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex

mapGetters

用法与mapState差不多

我们也跟着mapState一样封装一下
深入Vue3学习vue-router vuex

同样调用UseMapper即可。

Mutations

基本使用
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex

深入Vue3学习vue-router vuex
这里的setAbout不用绑定this,因为是在模板使用的,模板可以拿到this.$store
深入Vue3学习vue-router vuex
效果相当于
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex
因为setAbout是在about模块下的,所以前面要加模
块。
封装同下面actions一起讲

vuex的actions一般是用来做异步操作的,比如网络操作,所以我们必须通过dispatch acitons再commit mutation去修改state,有点像redux的dispatch redux-thunk actons,然后再去dispatch普通的actions再去触发reducer修改state的值。
深入Vue3学习vue-router vuex
这是模块about中的acitons,里面的context表示当前模块的store。
可以看到acitons里面是直接Commit去触发mutation再去修改state的值。
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex

深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex
效果相当于
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex
mutation是commit,acitons是dispatch

封装mapActions

import{   createNamespacedHelpers,   mapActionsas mapRootActions,   ActionMethod,}from"vuex";import{ useStore}from"@/store";const useActions=(args:string[],type="")=>{const store=useStore();console.log('store', store);let mapFun= mapRootActions;if(type){const{ mapActions}=createNamespacedHelpers(type);     mapFun= mapActions;}const MapFuns=mapFun(args);const DealFuns:{[kintypeof args[number]]: ActionMethod;}={};   Object.keys(MapFuns).map((item)=>{     DealFuns[item]= MapFuns[itemaskeyoftypeof MapFuns].bind({       $store: store,});});return DealFuns;};export{ useActions};

mapState mapGetters mapActions mapMutation

都可以接受一个对象,比如
深入Vue3学习vue-router vuex
用键值对代替数组,效果是一样的,

module的相对使用

当我们项目日益庞大的时候,一个state明显不够用,所以才有了模块的诞生。每个模块对应一个子store,他也有自己的state,actions,getter…
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex

about就是一个模块,获取的时候其实也算是根state的一个属性,比如上面的about
只需要通过store.state.about就可以获取about这个store。
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex

模块注意点

一 如果根store和一个模块store有一样命名的Mutation或者actions,一旦dispatch或者commmit,都会触发根store与模块store的改变。

如何解决呢?在命名空间的namespace属性设为true。
深入Vue3学习vue-router vuex
然后在commitd的时候,
深入Vue3学习vue-router vuex
在前面加上模块,当然也可以
深入Vue3学习vue-router vuex
深入Vue3学习vue-router vuex
通过这样的方式拿到模块的actions或者mutations。
而如果想在模块的acitons中commit根的mutation呢?
commit(‘xx’, null, {root: true})只需要加第三个属性表示commit的mutation为root的。

二 模块的getter不能通过store.state.about.getters来获取。而是直接通过store.getters.xxx来获取,因为getters被合并到一起了。而开启namespace为true的情况下只能通过

深入Vue3学习vue-router vuex
再前面加上具体的模块才能获取。
深入Vue3学习vue-router vuex
也可以通过这种
深入Vue3学习vue-router vuex
只要是使用我们封装的useGetters即可。
深入Vue3学习vue-router vuex
可以看到getters和actions是有rootgetters和rootState这两个属性拿到全局的东西。

moduel的辅助函数

深入Vue3学习vue-router vuex

mapState mapMutation mapGetters mapActions都是辅助函数
而模块的写法除了,

深入Vue3学习vue-router vuex
还有通过对象

深入Vue3学习vue-router vuex
但是没有 MapState([xx/xx])这种写法。
也可以通过createNamespaceHelpers来帮助。

深入Vue3学习vue-router vuex

这些就是模块的辅助函数。帮助你直接获取哪些模块的mapXxxx方法。