【问题标题】:Functions are not valid as a React child -- When building a PrivateRoute Component React ver 16函数作为 React 子级无效——在构建 PrivateRoute 组件时 React 版本 16
【发布时间】:2019-02-11 23:16:58
【问题描述】:

您好,我已经构建了一个 ProtectedRoute 组件,我希望将它包含在我的 App 组件中。虽然我看到它适用于许多其他人,但我不确定为什么我是个奇怪的人。代码如下:

const PrivateRoute = ({ component: Component, path, ...rest }) => {
 return (<Route {...rest} render={(props) => (
    firebaseApp.auth().onAuthStateChanged(user => {
        if (user) {
            <Component {...props} />;
        } else {
            <Redirect
                to={{
                    pathname: "/",
                    state: {
                        prevLocation: path,
                        error: "You need to login first!",
                    },
                }}
            />
          }
       })
     )} />
   )
}

class App extends Component {
 displayName = App.name

 constructor(props) {
    super(props);
 }

 render() {

    return (
        <Layout>
            <Route exact path='/' component={Home} />
            <Route path='/signin' component={SignIn} />
            <Route path='/signup' component={SignUp} />
            <PrivateRoute path='/counter' component={Counter} /> 
            <Route path='/fetchdata' component={FetchData} />
        </Layout>
    );
 }
}

export default App;

【问题讨论】:

    标签: reactjs react-router higher-order-components


    【解决方案1】:

    Routes 渲染方法正在返回一个它不应该返回的函数

    firebaseApp.auth().onAuthStateChanged
    

    在您的情况下,您应该使用 React 组件而不是功能组件。

    const withAuth = (Component) => {
        class AuthComp extends React.Component {
           state={
               loading: true,
               user: null
           }
           componentDidMount() {
             firebaseApp.auth().onAuthStateChanged(user => {
                    this.setState({loading: false, user})
             });
           }
           render() {
               if(loading) {
                   return <div>Loading...</div>
               }
               if(!loading && !user) {
                 return <Redirect
                        to={{
                            pathname: "/",
                            state: {
                                prevLocation: path,
                                error: "You need to login first!",
                            },
                        }}
                    />
               }
               return <Component {this.props} />
    
           }
        }
    }
    
    
    const PrivateRoute = ({ component: Component, path, ...rest }) => {
       return (<Route {...rest} component={withAuth(Component)} />)
    }
    

    【讨论】:

    • 我实现了您的响应(使用正确的 state props ref)并且错误消失了,但页面没有重定向。你能解释一下吗?
    • 你是否导入了 Redirect 并像&lt;Route {...rest} component={withAuth(Component)} /&gt;一样使用它
    • 我有
    • 或者应该是
    • 你可以简单地使用&lt;Route path='/counter' component={withAuth(Counter)} /&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2021-11-09
    • 1970-01-01
    • 2018-11-05
    • 2020-07-01
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多