深入Vue3学习(6)vue-router vuex

vue-router

meta属性深入Vue3学习(6)vue-router vuex_第1张图片
meta属性,后续可以通过route.meta拿到里面的值。

router hooks

在这里插入图片描述

在这里插入图片描述
这两个就是在setup中拿到的,相当于this.$route this. $router

匹配未找到路由

深入Vue3学习(6)vue-router vuex_第2张图片当输入的路由在配置中没有的时候会匹配到这个component中。

router-link的tag

vue2的router-link可以通过tag属性,决定router-link渲染成什么形式。
而vue3通过插槽:
深入Vue3学习(6)vue-router vuex_第3张图片
在这里插入图片描述
甚至可以放一个组件。
深入Vue3学习(6)vue-router vuex_第4张图片
深入Vue3学习(6)vue-router vuex_第5张图片
在这里插入图片描述

router-view的作用域插槽在这里插入图片描述

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

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

删除

1 添加一个相同Name的路由
2 通过removeRoute的方法,传入路由的名称
3 通过addRoue的返回值调用。深入Vue3学习(6)vue-router vuex_第8张图片

路由导航守卫

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

深入Vue3学习(6)vue-router vuex_第9张图片
在这里插入图片描述
next在第四版已经不被推荐了。
现在通过返回值代替next了。
深入Vue3学习(6)vue-router vuex_第10张图片

其他导航守卫

组件内守为,路由独享守卫
深入Vue3学习(6)vue-router vuex_第11张图片

导航解析过程

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

Vuex

在setup中的使用
useStrore hooks
深入Vue3学习(6)vue-router vuex_第13张图片
基本使用
在这里插入图片描述

mapState用法

在这里插入图片描述
使用
在这里插入图片描述
mapState返回的是一个函数,所以必须使用调用的方式使用他,然后传入store才能正常使用。
我们可以借助computed
深入Vue3学习(6)vue-router vuex_第14张图片
还是需要绑定store,借助computed,因为compunted就是传入一个函数的。然后将值解构出去即可。
在这里插入图片描述
所以我们封装一下这个函数
深入Vue3学习(6)vue-router vuex_第15张图片
使用的时候
深入Vue3学习(6)vue-router vuex_第16张图片

封装useState
在这里插入图片描述

getter

深入Vue3学习(6)vue-router vuex_第17张图片
在这里插入图片描述

mapGetters

用法与mapState差不多

我们也跟着mapState一样封装一下
深入Vue3学习(6)vue-router vuex_第18张图片

同样调用UseMapper即可。

Mutations

基本使用
在这里插入图片描述
在这里插入图片描述

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

actions

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

在这里插入图片描述
在这里插入图片描述
效果相当于
深入Vue3学习(6)vue-router vuex_第21张图片
在这里插入图片描述
mutation是commit,acitons是dispatch

封装mapActions
import {
  createNamespacedHelpers,
  mapActions as 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: {
    [k in typeof args[number]]: ActionMethod;
  } = {};
  Object.keys(MapFuns).map((item) => {
    DealFuns[item] = MapFuns[item as keyof typeof MapFuns].bind({
      $store: store,
    });
  });

  return DealFuns;
};

export { useActions };

mapState mapGetters mapActions mapMutation

都可以接受一个对象,比如
深入Vue3学习(6)vue-router vuex_第22张图片
用键值对代替数组,效果是一样的,

module的相对使用

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

about就是一个模块,获取的时候其实也算是根state的一个属性,比如上面的about
只需要通过store.state.about就可以获取about这个store。
在这里插入图片描述
在这里插入图片描述

模块注意点

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

如何解决呢?在命名空间的namespace属性设为true。
深入Vue3学习(6)vue-router vuex_第25张图片
然后在commitd的时候,
在这里插入图片描述
在前面加上模块,当然也可以
在这里插入图片描述
深入Vue3学习(6)vue-router vuex_第26张图片
通过这样的方式拿到模块的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学习(6)vue-router vuex_第27张图片
只要是使用我们封装的useGetters即可。
深入Vue3学习(6)vue-router vuex_第28张图片
可以看到getters和actions是有rootgetters和rootState这两个属性拿到全局的东西。

moduel的辅助函数

深入Vue3学习(6)vue-router vuex_第29张图片

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

在这里插入图片描述
还有通过对象

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

深入Vue3学习(6)vue-router vuex_第31张图片

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

你可能感兴趣的:(vue系列)