javascript - 从 Gatsby 浏览器 API 触发 Redux 操作?
问题描述
如何从onRouteUpdate
gatsby-browser.js API 中触发 redux 操作。
当用户成功导航到新页面时,我有一个TOGGLE_MENU
需要设置为 false 的操作,以关闭手机/平板电脑上的菜单。
我正在使用gatsby-plugin-react-redux插件。
当前实现在这里:https ://dev.poshwash.london
我尝试添加store.dispatch(toggleMenu(false))
,但没有奏效。
src/state/app.js
const initialState = {
isMenuOpen: false,
scrollY: 0,
}
const TOGGLE_MENU = "TOGGLE_MENU"
export const toggleMenu = isOpen => ({ type: TOGGLE_MENU, payload: isOpen })
export default (state = initialState, action) => {
const { type, payload } = action
switch (type) {
case TOGGLE_MENU: {
const scrollY = payload ? window.scrollY : state.scrollY
return { ...state, isMenuOpen: payload, scrollY }
}
default: {
return state
}
}
}
src/state/createStore.js
import { createStore } from "redux"
import { composeWithDevTools } from "redux-devtools-extension"
import rootReducer from "."
// preloadedState will be passed in by the plugin
export default preloadedState => {
return createStore(rootReducer, preloadedState, composeWithDevTools())
}
gatsby-browser.js
/**
* Implement Gatsby's Browser APIs in this file.
*
* See: https://www.gatsbyjs.org/docs/browser-apis/
*/
import { toggleMenu } from "./src/state/app"
import store from "./src/state/createStore"
export const onRouteUpdate = ({ location, prevLocation }) => {
store.dispatch(toggleMenu(false))
console.log("new pathname", location)
console.log("old pathname", prevLocation)
}
解决方案
我刚刚遇到了类似的问题并设法找到了解决方案。只是对未来有类似问题的人的建议。您需要像这样更改 src/state/createStore.js 文件。
import { createStore } from "redux"
import { composeWithDevTools } from "redux-devtools-extension"
import rootReducer from "."
// After that you will need
// to import and use dispatch
// on this variable
// and import it like this:
// import { store } from "./src/state/createStore"
export let store;
// preloadedState will be passed in by the plugin
export default preloadedState => {
store = createStore(rootReducer, preloadedState, composeWithDevTools());
return store;
}
推荐阅读
- android - 创建自定义按钮并将其设为默认样式
- haskell - 为什么绑定运算符与不完整的 lambda 函数一起使用?
- python - 使用指定数量的训练数据进行交叉验证?
- python - 沿 z 轴的中位数堆叠两个 3D numpy 数组并保持较小数组的大小
- sql - 是否可以使用 excel 单元格值 - 作为 T-SQL 语句中的参考?
- flutter - 颤振搜索带有空格的希伯来语(从左到右)联系人不起作用
- python - python Firebase Cloud Storage - 上传文件而不将其保存在本地
- python - gspread 中每个用户每 100 秒的读取请求限制超出配额,但 Console Cloud Google 仅显示 24 个请求
- python - 在dict中添加每个项目的价值
- flutter - Flutter:Filterchip未更新表单中检查的初始值