代码之家  ›  专栏  ›  技术社区  ›  Dave

在React中,如何呈现作为道具传入的无状态组件?

  •  0
  • Dave  · 技术社区  · 4 年前

    我想根据用户登录的时间呈现组件

                  <PrivateRoute
                        authed={isAuthenticated} path="/unapproved-list/"
                        component={UnapprovedList}
                  />
    

    PrivateRoute组件的设置如下

    import React, { Component }  from 'react';
    import { Redirect } from 'react-router';
    import { Route } from 'react-router-dom';
    
    const PrivateRoute = ({component, authed, ...rest}) => {
      console.log("in private route, authed: " + authed);
      return (
        <Route
          {...rest}
          render={(props) => authed === true
            ? <Component {...props} />
            : <Redirect to={{pathname: '/login', state: {from: props.location}}} />}
        />
      )
    }
    
    export default PrivateRoute;
    

    但是,当身份验证为true时,此行

    Component {...props} />
    

    TypeError: instance.render is not a function
    finishClassComponent
    node_modules/react-dom/cjs/react-dom.development.js:17160
      17157 | } else {
      17158 |   {
      17159 |     setIsRendering(true);
    > 17160 |     nextChildren = instance.render();
            | ^
      17161 | 
      17162 |     if ( workInProgress.mode & StrictMode) {
      17163 |       instance.render();
    

    不确定如何构造私有路由以正确呈现组件。我不希望更改组件结构,目前的组件结构如下所示

    const UnapprovedList = () => {
        const [unapprovedCoops, setUnapprovedCoops] = React.useState([]);   ...
        return (
            <>
                {loadErrors && (
                  <strong className="form__error-message">
                    {JSON.stringify(loadErrors)}
                  </strong>
                )}
    
                {loadingCoopData && <strong>Loading unapproved coops...</strong>}
    
                <RenderCoopList link={"/approve-coop/"} searchResults={unapprovedCoops}  columnOneText={"Unapproved Entities"} columnTwoText={"Review"} />
            </>
        )
    }
    
    export default UnapprovedList;
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   eugenezinovyev    4 年前

    这个 <Component {...props} /> Component component

    请尝试以下操作:

    const PrivateRoute = ({ component: WrappedComponent, authed, ...rest }) => {
      console.log("in private route, authed: " + authed);
      return (
        <Route
          {...rest}
          render={(props) => authed === true
            ? <WrappedComponent {...props} />
            : <Redirect to={{pathname: '/login', state: {from: props.location}}} />}
        />
      )
    }
    
    推荐文章