vuex-router-sync如何使用
简单来讲vuex-router-sync
插件就是将vue-router
的状态同步到vuex
中
一、安装
- npm下载地址:https://www.npmjs.com/package...
> npm i vuex-router-sync --save
二、使用
import { sync } from 'vuex-router-sync'
import store from './vuex/store'
import router from './router'sync(store, router, {moduleName: 'RouteModule'})const app = new Vue({
router,
store,
}).$mount('#app');
打印
store.state
即可看到当前路由状态文章图片
三、使用场景 假如您想在一个组件中显示一条消息,希望在几乎每一个页面上都显示“Have a nice day, Jack”,除了首页,因为首页要显示"Welcome back, Jack".
借助vuex-router-sync,您可以轻松实现
const Top = {
template: '{{message}}',
computed: {
message() {
return this.$store.getters.getMessage;
}
},
};
const Bar = {
template: '{{message}}',
computed: {
message() {
return this.$store.getters.getMessage;
}
}
};
const routes = [{
path: '/top',
component: Top,
name: 'top'
},
{
path: '/bar',
component: Bar,
name: 'bar'
},
];
const router = new VueRouter({
routes
});
const store = new Vuex.Store({
state: {
username: 'Jack',
phrases: ['Welcome back', 'Have a nice day'],
},
getters: {
getMessage(state) {
return state.route.name === 'top' ?
`${state.phrases[0]}, ${state.username}` :
`${state.phrases[1]}, ${state.username}`;
},
},
});
// sync store and router by using `vuex-router-sync`
sync(store, router);
const app = new Vue({
router,
store,
}).$mount('#app');
不然的话,你可能需要在
vue-router
的钩子函数里监听,或在watch
里$route
,然后修改store
值来实现。四、原理 在70多行的
vuex-router-sync
源代码里有以下几段代码store.registerModule(moduleName, {
namespaced: true,
state: cloneRoute(router.currentRoute),
mutations: {
'ROUTE_CHANGED': function ROUTE_CHANGED (state, transition) {
store.state[moduleName] = cloneRoute(transition.to, transition.from)
}
}
})
首先是在我们的
store
中注册了一个module
,名字默认为route
:【vuex-router-sync如何使用】
module
中提供了一个叫ROUTE_CHANGED
的mutation
处理方法,然后还把router
对象中的currentRoute
保存在了state
中,这也是我们为什么能够通过this.$store.state.route
拿到currentRoute
的原因。然后就是监听
store
中的route
对象的变化了,当route
发生变化并且当前路由名字不等于需要跳转到路由的时候,直接通过router
的push
方法进行跳转页面:var storeUnwatch = store.watch(
function (state) { return state[moduleName];
},
function (route) {
var fullPath = route.fullPath;
if (fullPath === currentPath) {
return
}
if (currentPath != null) {
isTimeTraveling = true
router.push(route)
}
currentPath = fullPath
},
{ sync: true }
)
store
的watch
方法跟vue
中的watch
是一个概念,也就是检测某个属性的变化,然后回调。最后通过
router
的全局后置钩子函数监听当前路由对象,修改store
中的当前state
(当前路由对象):// sync store on router navigation
var afterEachUnHook = router.afterEach(function (to, from) {
if (isTimeTraveling) {
isTimeTraveling = false
return
}
currentPath = to.fullPath
store.commit(moduleName + '/ROUTE_CHANGED', { to: to, from: from })
})
欢迎关注:https://www.fenxianglu.cn/
文章图片
参考链接:
- https://segmentfault.com/a/11...
- https://blog.csdn.net/vv_bug/...
推荐阅读
- 使用P6Spy监控你的SQL输出
- selenium之nodejs入门使用
- 关于vuex-router-sync的作用,或者可以解决什么问题
- java|阿里面试官(如何测试接口幂等性())
- 单元测试|【每日分享】如何从0搭建自己的自动化测试体系(9.29)
- h5中使用javascript在客户端对图片进行压缩和尺寸处理,附ts代码
- 生成对抗网络的损失函数如何设计_一文读懂生成对抗网络GANs(附学习资源)
- 人脸识别|yolo-face 使用yolo v2 在CelebA上训练的人脸检测器
- ArcGIS操作|ArcGIS基础(如何只显示整体数据的局部部分)
- 奇妙之旅-GIS|如何在QGIS中将纬度和经度添加为CSV文件