【问题标题】:In React, how do I render a stateless component that is passed in as a prop?在 React 中,如何渲染作为 prop 传入的无状态组件?
【发布时间】:2022-01-01 19:31:49
【问题描述】:

我想根据用户是否登录来渲染组件

              <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;

但是,当认证为真时,这一行

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;

【问题讨论】:

  • 你没有对你传递给PrivateRoutecomponent做任何事情。这就是您要渲染的实际组件。

标签: reactjs components render prop


【解决方案1】:

&lt;Component {...props} /&gt; 行是指从 React 导入的 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}}} />}
    />
  )
}

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2018-03-10
    • 2023-02-03
    • 1970-01-01
    • 2019-03-24
    • 2021-12-12
    相关资源
    最近更新 更多