如何在 React 中的组件外部访问 Redux 存储

J. *_*iaz 9 reactjs react-native redux react-redux

我从 Redux 开始,我总是在带有 connect() 和 mapStateToProps() 的组件中使用它,但现在我想每隔 x 次使用 setInterval() 调用我的 API,以检查服务器是否有未存储在 Redux 存储中的新数据,并替换它。

我的方法是创建一个读取存储并更新它的函数,如下所示:

import { store } from './dir/dir/store.js'

const refresher = async () => {

    const state = store.getState();

    // Call API, compare 'state.calendar' with calendar from server
    // Call store.dispatch() if they are different, then update Redux store

}

export default refresher
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 这是使用 Redux 的好习惯吗?
  • 有没有更好的方法来解决这个问题?

谢谢

Kyl*_*Mit 25

导出商店并在普通 js/ts 文件中使用是完全可以的。

Redux 存储示例

确保您创建exportstore

import { configureStore } from "@reduxjs/toolkit";
import { slice } from "../features/counterSlice";

export const store = configureStore({
  reducer: {
    counter: slice.reducer
  }
});
Run Code Online (Sandbox Code Playgroud)

在非组件代码中的用法:

然后您可以在任何其他代码中import创建store

import { store } from "../App/store";
import { slice as counterSlice } from "../features/counterSlice";

export function getCount(): number {
  const state = store.getState();
  return state.counter.value;
}

export function incrementCount() {
  store.dispatch(counterSlice.actions.increment());
}
Run Code Online (Sandbox Code Playgroud)

功能组件中的传统用法

import { useDispatch, useSelector } from "react-redux";
import { RootState } from "../App/store";
import { slice as counterSlice } from "../features/counterSlice";

export function Clicker() {
  const dispatch = useDispatch();
  const count = useSelector((state: RootState) => state.counter.value);
  const dispatchIncrement = () => dispatch(counterSlice.actions.increment())
  // ...
Run Code Online (Sandbox Code Playgroud)

示例切片

import { createSlice } from "@reduxjs/toolkit";

export const slice = createSlice({
  name: "counter",
  initialState: { value: 0 },
  reducers: {
    increment: (state) => {
      state.value += 1;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

Codesandbox 中的演示

注意:您不能将此选项与服务器端渲染一起使用。如果需要支持SSR,可以使用中间件来监听分派的action并在其他地方处理。

进一步阅读

  • 但是,如果您通过 redux 提供程序在应用程序中使用 store 作为上下文,则会导致循环依赖。怎么处理呢? (2认同)