vuex-router-sync如何使用
簡單來講vuex-router-sync
外掛就是將vue-router
的狀態同步到vuex
中
一、安裝
- npm下載地址:https://www.npmjs.com/package/vuex-router-sync
> 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: '<div>{{message}}</div>',
computed: {
message() {
return this.$store.getters.getMessage;
}
},
};
const Bar = {
template: '<div>{{message}}</div>',
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
:
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/1190000019925019
- https://blog.csdn.net/vv_bug/article/details/84064708
相關文章
- 如何使用GitHub?Github
- 如何使用 DockerHubDocker
- 如何使用MyBatisMyBatis
- 如何使用 ulimitMIT
- MQTT如何使用MQQT
- 如何使用反射反射
- 如何使用 Service 模式模式
- PostMan該如何使用Postman
- 如何使用go文件Go
- WebBits庫如何使用Web
- 如何使用htmltab庫HTML
- 如何使用grequests庫
- 如何使用Guzzle庫
- 如何使用RCurl庫
- 如何使用 id 命令?
- MySql escape如何使用MySql
- 事件代理如何使用?事件
- 如何使用 date 命令
- 如何使用nodejsNodeJS
- [譯] 如何使用 Rails HelperAI
- 如何使用 Repository 模式模式
- 在django如何使用中文Django
- 如何高效的使用 GitGit
- MySql如何使用索引(二)MySql索引
- MySql如何使用索引(一)MySql索引
- 如何使用 Redis 快取Redis快取
- python 類如何使用Python
- mac如何使用pythonMacPython
- localforage indexedDB如何使用索引Index索引
- Html 中如何使用javaScriptHTMLJavaScript
- 如何使用Google服務Go
- PDF Search mac如何使用?Mac
- 如何優雅使用 vuexVue
- 如何使用 RestSharp 庫REST
- 海外代理ip如何使用?
- Spy工具到底如何使用
- 如何使用macOS小部件?Mac
- GO 的 range 如何使用?Go