【问题标题】:React redux - dispatch in App.js outside provider?React redux - 在提供程序之外的 App.js 中分派?
【发布时间】:2020-11-20 04:38:36
【问题描述】:

让我解释一下我的问题。我有一个使用 Redux 对 RBAC 模型做出反应的应用程序。为此,我需要在加载我的应用程序时在 useEffect 中调用我的 dispatch() 以检查用户是否经过身份验证。如果是,我需要发送它包含在 jwt 令牌中的信息。

所以我做了这样的事情(在 App.jsx 中):

const App = () => {
  
  const [isAuthenticated, setIsAuthenticated] = useState(false);

  const dispatch = useDispatch()

  const authentication = () =>
    isAuthenticated ? (
      <Redirect to="/app" />
    ) : (
      <PublicRoutes />
  );
 
  useEffect(() => {
    setIsAuthenticated(Auth.isAuth())
    if(isAuthenticated){
      store.dispatch(setConnectedUser({name:"Jude"}))
    }
  }, [isAuthenticated])

  const store = createStore(rootReducer, composeWithDevTools(
    applyMiddleware(thunk),
  ));

    return (
    <Provider store={store}>
      <HashRouter>
        <Switch>
          <Route path="/app" component={PrivateRoutes} />
          <Route path="" render={authentication} />
        </Switch>
      </HashRouter>
    </Provider>
    );
}

export default App;

ReactDOM.render(<App />, document.getElementById("root"))

Auth.isAuth() 只是获取令牌,检查令牌是否仍然有效,如果是则返回 true。

但事情是这样的,这样做我犯了一个错误: 未捕获的错误:找不到 react-redux 上下文值;请确保组件被包裹在一个

我知道错误来自我想在提供者之外 dispatch() 的事实,但是可以这样做吗?还是我会做错?这是我第一个使用 Redux 的项目,可能我没有完全理解它是如何工作的?

知道 dispatch() 工作得很好,它之前在登录时被调用,但是我的标题上有一个错误,它将从 reducer 中检索信息,它试图在存储信息出现之前显示它,这就是为什么我想在应用程序加载时进行控制,而不仅仅是在登录时。

【问题讨论】:

    标签: javascript reactjs redux


    【解决方案1】:

    使用您的代码,您无法在此组件中使用 redux,只能在他的所有孩子中使用。

    您可以在外部设置提供程序,可能在 index.js 中(或者您执行 ReactDOM.render() 或任何高级调用的任何地方)。

    或者,如果您愿意,您可以创建将在 App.js 中使用的任何新元素,例如“router.js”或类似内容,您可以在其中检查您的逻辑并重定向到您想要的位置。

    【讨论】:

    • 好的,好吧...我以为我可以不这样做,但显然不行,所以我将提供程序放在 index.js 中,它可以工作,谢谢!
    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多