栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用react

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用react

一个简单的解决方案是制作一个

HOC
包含所有受保护路线的(高阶组件)。

根据您的应用程序的嵌套方式,您可能需要利用本地

redux
状态。

工作示例:https :
//presandbox.io/s/5m2690nn6n(使用本地状态)

路线/index.js

    import React from "react";    import { BrowserRouter, Switch, Route } from "react-router-dom";    import Home from "../components/Home";    import Players from "../components/Players";    import Schedule from "../components/Schedule";    import RequireAuth from "../components/RequireAuth";    export default () => (      <BrowserRouter>        <RequireAuth>          <Switch> <Route exact path="/" component={Home} /> <Route exact path="/players" component={Players} /> <Route path="/schedule" component={Schedule} />          </Switch>        </RequireAuth>      </BrowserRouter>    );

组件/RequireAuth.js

    import React, { Component, Fragment } from "react";    import { withRouter } from "react-router-dom";    import Login from "./Login";    import Header from "./Header";    class RequireAuth extends Component {      state = { isAuthenticated: false };      componentDidMount = () => {        if (!this.state.isAuthenticated) {          this.props.history.push("/");        }      };      componentDidUpdate = (prevProps, prevState) => {        if (          this.props.location.pathname !== prevProps.location.pathname &&          !this.state.isAuthenticated        ) {          this.props.history.push("/");        }      };      isAuthed = () => this.setState({ isAuthenticated: true });      unAuth = () => this.setState({ isAuthenticated: false });      render = () =>        !this.state.isAuthenticated ? (          <Login isAuthed={this.isAuthed} />        ) : (          <Fragment> <Header unAuth={this.unAuth} /> {this.props.children}          </Fragment>        );    }    export default withRouter(RequireAuth);

或者,您可以创建一个包含受保护路由的受保护组件,而不是包装路由。

工作示例:https :
//presandbox.io/s/yqo75n896x(使用

redux
代替本地状态)。

路线/index.js

    import React from "react";    import { BrowserRouter, Route, Switch } from "react-router-dom";    import { createStore } from "redux";    import { Provider } from "react-redux";    import Home from "../components/Home";    import Header from "../containers/Header";    import Info from "../components/Info";    import Sponsors from "../components/Sponsors";    import Signin from "../containers/Signin";    import RequireAuth from "../containers/RequireAuth";    import rootReducer from "../reducers";    const store = createStore(rootReducer);    export default () => (      <Provider store={store}>        <BrowserRouter>          <div> <Header /> <Switch>   <Route exact path="/" component={Home} />   <Route path="/info" component={Info} />   <Route path="/sponsors" component={Sponsors} />   <Route path="/protected" component={RequireAuth} />   <Route path="/signin" component={Signin} /> </Switch>          </div>        </BrowserRouter>      </Provider>    );

容器/RequireAuth.js

    import React from "react";    import { Route, Redirect } from "react-router-dom";    import { connect } from "react-redux";    import ShowPlayerRoster from "../components/ShowPlayerRoster";    import ShowPlayerStats from "../components/ShowPlayerStats";    import Schedule from "../components/Schedule";    const RequireAuth = ({ match: { path }, isAuthenticated }) =>      !isAuthenticated ? (        <Redirect to="/signin" />      ) : (        <div>          <Route exact path={`${path}/roster`} component={ShowPlayerRoster} />          <Route path={`${path}/roster/:id`} component={ShowPlayerStats} />          <Route path={`${path}/schedule`} component={Schedule} />        </div>      );    export default connect(state => ({      isAuthenticated: state.auth.isAuthenticated    }))(RequireAuth);

您甚至可以通过创建包装函数来获得更多的模块化。您只需包装组件即可选择任何路线。

例如:

<Route path="/blog" component={RequireAuth(Blog)} />



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372001.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号