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

vue-router

meta属性在这里插入图片描述
meta属性,后续可以通过route.meta拿到里面的值。

router hooks

在这里插入图片描述

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

匹配未找到路由

在这里插入图片描述当输入的路由在配置中没有的时候会匹配到这个component中。

router-link的tag

vue2的router-link可以通过tag属性,决定router-link渲染成什么形式。
而vue3通过插槽:
在这里插入图片描述
在这里插入图片描述
甚至可以放一个组件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
可以根据一些权限管控来动态添加路由
这样是添加顶级路由对象。
添加二级路由:在这里插入图片描述
接受两个参数,

删除

1 添加一个相同Name的路由
2 通过removeRoute的方法,传入路由的名称
3 通过addRoue的返回值调用。在这里插入图片描述

路由导航守卫

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

在这里插入图片描述
在这里插入图片描述
next在第四版已经不被推荐了。
现在通过返回值代替next了。
在这里插入图片描述

其他导航守卫

组件内守为,路由独享守卫
在这里插入图片描述

导航解析过程

在这里插入图片描述
可以看到,先调用失活组建的beforeRouteLeact,再调用全局的beforeEach…
注意的一点是,再beforeOruteEnter中时拿不到this的,所以通过最后组件创建完调用next的回调函数,将组件实例传进去。

Vuex

在setup中的使用
useStrore hooks
在这里插入图片描述
基本使用
在这里插入图片描述

mapState用法

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

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

getter

在这里插入图片描述
在这里插入图片描述

mapGetters

用法与mapState差不多

我们也跟着mapState一样封装一下
在这里插入图片描述

同样调用UseMapper即可。

Mutations

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

在这里插入图片描述
这里的setAbout不用绑定this,因为是在模板使用的,模板可以拿到this.$store
在这里插入图片描述
效果相当于
在这里插入图片描述
在这里插入图片描述
因为setAbout是在about模块下的,所以前面要加模
块。
封装同下面actions一起讲

actions

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

在这里插入图片描述
在这里插入图片描述
效果相当于
在这里插入图片描述
在这里插入图片描述
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

都可以接受一个对象,比如
在这里插入图片描述
用键值对代替数组,效果是一样的,

module的相对使用

当我们项目日益庞大的时候,一个state明显不够用,所以才有了模块的诞生。每个模块对应一个子store,他也有自己的state,actions,getter…
在这里插入图片描述
在这里插入图片描述

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

模块注意点

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

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

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

在这里插入图片描述
再前面加上具体的模块才能获取。
在这里插入图片描述
也可以通过这种
在这里插入图片描述
只要是使用我们封装的useGetters即可。
在这里插入图片描述
可以看到getters和actions是有rootgetters和rootState这两个属性拿到全局的东西。

moduel的辅助函数

在这里插入图片描述

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

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

在这里插入图片描述
但是没有 MapState([xx/xx])这种写法。
也可以通过createNamespaceHelpers来帮助。

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderlin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值