首页 > 编程语言 >vuex-router-sync 源码解析

vuex-router-sync 源码解析

时间:2023-03-08 19:32:07浏览次数:32  
标签:moduleName watch sync state 源码 router vuex store


vuex-router-sync:路由状态管理,保持 vue-router 和 vuex 存储同步。

import { sync } from 'vuex-router-sync'
import router from '@/router'
import store from '@/store'

sync(store,router)

new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})

vuex-router-sync 源码解析_vue-router

第1步:vuex模块动态注册

const moduleName = (options || {}).moduleName || 'route' 
store.registerModule(moduleName, {
namespaced: true,
state: cloneRoute(router.currentRoute), // route 全部属性
mutations: {
// 改变 state 值
'ROUTE_CHANGED'(state, transition) {
store.state[moduleName] = cloneRoute(transition.to, transition.from)
}
}
})

第2步:​​store.watch => vueVm.$watch​

​watch(fn: Function, callback: Function, options?: Object): Function​

响应式地侦听 ​​fn​​ 的返回值,当值改变时调用回调函数。

  • ​fn​​ 接收 store 的 state 作为第一个参数,其 getter 作为第二个参数。
  • ​callback(newVal, oldVal)​​,回调函数
  • 最后接收一个可选的对象参数表示 Vue 的 vm.$watch 方法的参数
const storeUnwatch = store.watch(
// 监听 state[moduleName]
state => state[moduleName],
route => {
const {
fullPath
} = route
if (fullPath === currentPath) {
return
}
if (currentPath != null) {
isTimeTraveling = true
// 路由跳转
router.push(route)
}
currentPath = fullPath
}, {
sync: true
}
)

第3步:vue-router 全局后置导航钩子,钩子不会接受 ​​next​​ 函数也不会改变导航本身

// 监听路由变化
router.afterEach((to, from) => {
if (isTimeTraveling) {
isTimeTraveling = false
return
}
currentPath = to.fullPath
// 触发 mutation
store.commit(moduleName + '/ROUTE_CHANGED', {
to,
from
})
})

为了避免循环调用,isTimeTraveling 为true时,代表是当前组件触发的路由跳转,​​router.afterEach​​​ 监听到不做任何处理。
这里需要注意的点是,我们通过 @/router​@store​ 来获取相关实例!当然 ​vueVM.$options​ 也可以获取!


标签:moduleName,watch,sync,state,源码,router,vuex,store
From: https://blog.51cto.com/u_15998238/6108717

相关文章

  • Tomcat 中的 NIO 源码分析
    转自:https://javadoop.com/post/tomcat-nio之前写了两篇关于NIO的文章,第一篇介绍了NIO的Channel、Buffer、Selector使用,第二篇介绍了非阻塞IO和异步IO,并展示了简......
  • 直播网站源码,vue工具类,时间格式化
    直播网站源码,vue工具类,时间格式化最近做uniapp经常用到时间格式化,需要转为刚刚、几分钟前等字符串格式,自己根据需求整理了一个工具类 效果说明:时间转字符串格式,时间戳......
  • 智慧校园源码,智慧学校源码+小程序+人脸电子班牌
    这是一套JAVA语言开发的智慧校园源码,有演示,有文档,源码完整开源,商用级别,可以私信博主。技术开发环境:Java+springboot+vue+element-ui+mysql用的是最新的技术栈,完全满足开发......
  • Netty源码分析
    netty源码分析netty模型selector模式对普通NIO的性能提升NIO可以同时使用多个selector(使用多线程)一个selector可以同时注册多个ServerSocketServer(可以绑定多个端口)单个线......
  • vue-router的笔记
    路由:hash地址与组件之间的对应关系SPA:单页面应用程序前端路由的工作方式1、用户点击了页面上的路由链接2、导致了url地址栏的hash值变化3、前端路由监听到了hash地址......
  • vuex笔记
    Vuex在开发中,我们会的应用程序需要处理各种各样的数据,这些数据需要保存在我们应用程序中的某一个位置,对于这些数据的管理我们就称之为是状态管理src/store/index.js......
  • mybatis 源码简单探究
    一、初始化环境中文网:https://mybatis.net.cn前提maven环境jdk1.8mysql8.0pom.xml<dependencies><dependency><groupId>mysql</grou......
  • Java医院电子病历系统源码
    电子病历系统功能总览模板制作、样式控制、数据存储、控件管理、表格管理、图片管理、页面布局、打印设置、病历书写、样式控制、控件输入、病历质控、数据同步、个人模板......
  • spring源码02-xml配置文件解析过程
    本文主要讲解spring通过xml进行配置时对xml的加载和解析过程、自定义标签的处理,重点是流程,不说明详细细节;一、创建ClassPathXmlApplicationContext对象//创建容器,并启动......
  • percona-server-mongodb-6.0源码安装
    ###################################请注意,预构建的二进制文件可在 mongodb.org上获得,这可能是最简单的入门方式,而不是从源代码构建。要构建MongoDB,您需要:能够编译......