【问题标题】:React-Redux: Access dispatch type in JSXReact-Redux:JSX 中的访问调度类型
【发布时间】:2021-02-13 00:49:16
【问题描述】:

我有一个带有 React-Redux 的登录系统,我想在发送特定调度类型时显示 JSX。
例如,当登录系统失败时,调度类型为LOGIN_FAIL,我想显示一条错误消息,但当身份验证成功时,调度类型为LOGIN_SUCCESS,我想显示一条成功消息。我已经通过 mapStateToProps 访问了用户名,但我很好奇是否有另一种通过调度类型进行条件渲染的方法?
感谢您对该主题的建议或提示。

这是我的actions.js:

export const login = (email, password) => async dispatch => {
    const config = {
        headers: {
            'Content-Type': 'application/json'
        }
    };

    const body = JSON.stringify({ email, password });

    try {
        const res = await axios.post(`${process.env.REACT_APP_API_URL}/auth/jwt/create/`, body, config);

        dispatch({
            type: LOGIN_SUCCESS,
            payload: res.data
        });

        dispatch(load_user());
    } catch (err) {
        dispatch({
            type: LOGIN_FAIL
        });
    }
};

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    当我进行用户身份验证时,我想有条件地渲染一个组件。我使用 React 路由 dom。这样我可以创建一个 PrivateRoute,如果用户 !isAuthenticated,它将呈现单个组件并重定向。看看这个/

    https://blog.bitsrc.io/build-a-login-auth-app-with-mern-stack-part-1-c405048e3669

    这是你可以clonegit 的教程

    私人路线:

    import React from "react";
    import { Route, Redirect } from "react-router-dom";
    import { connect } from "react-redux";
    import PropTypes from "prop-types";
    
    const PrivateRoute = ({ component: Component, auth, ...rest }) => (
      <Route
        {...rest}
        render={props =>
          auth.isAuthenticated === true ? (
            <Component {...props} />
          ) : (
            <Redirect to="/login" />
          )
        }
      />
    );
    
    PrivateRoute.propTypes = {
      auth: PropTypes.object.isRequired
    };
    
    const mapStateToProps = state => ({
      auth: state.auth
    });
    
    export default connect(mapStateToProps)(PrivateRoute);

    主应用:

    import React, { Component } from "react";
    import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
    import jwt_decode from "jwt-decode";
    import setAuthToken from "./utils/setAuthToken";
    
    import { setCurrentUser, logoutUser } from "./actions/authActions";
    import { Provider } from "react-redux";
    import store from "./store";
    
    import Navbar from "./components/layout/Navbar";
    import Landing from "./components/layout/Landing";
    import Register from "./components/auth/Register";
    import Login from "./components/auth/Login";
    import PrivateRoute from "./components/private-route/PrivateRoute";
    import Dashboard from "./components/dashboard/Dashboard";
    
    import "./App.css";
    
    // Check for token to keep user logged in
    if (localStorage.jwtToken) {
      // Set auth token header auth
      const token = localStorage.jwtToken;
      setAuthToken(token);
      // Decode token and get user info and exp
      const decoded = jwt_decode(token);
      // Set user and isAuthenticated
      store.dispatch(setCurrentUser(decoded));
      // Check for expired token
      const currentTime = Date.now() / 1000; // to get in milliseconds
      if (decoded.exp < currentTime) {
        // Logout user
        store.dispatch(logoutUser());
    
        // Redirect to login
        window.location.href = "./login";
      }
    }
    class App extends Component {
      render() {
        return (
          <Provider store={store}>
            <Router>
              <div className="App">
                <Navbar />
                <Route exact path="/" component={Landing} />
                <Route exact path="/register" component={Register} />
                <Route exact path="/login" component={Login} />
                <Switch>
                  <PrivateRoute exact path="/dashboard" component={Dashboard} />
                </Switch>
              </div>
            </Router>
          </Provider>
        );
      }
    }
    export default App;

    【讨论】:

    • 谢谢,我已经在进行基于身份验证的重定向,但我正在考虑在登录成功时为用户呈现例如成功消息。因此,当调度 LOGIN_SUCCESS 被发送时,应该显示消息组件。
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2020-10-16
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多