【问题标题】:Handle 'lambda in JSX attribute' case处理“JSX 属性中的 lambda”案例
【发布时间】:2018-11-22 14:41:59
【问题描述】:

已有代码:

const FooRoute: React.SFC<RouteProps> =
  ({ component: Component, ...rest }) => {
    if (!auth.isFoo()) {
      return <Redirect to={{ pathname: '/404' }} />;
    }
    if ('render' in rest) {
      return (
        <Route {...rest} render={rest.render} />
      );
    } else {
      return (
        Component
          ?
          <Route
            {...rest}
            render={
              (props: RouteComponentProps<{}>) => <Component {...props} />}
          />
          : null
      );
    }
  };

这里有错误:

现在getComponent 函数在这种情况下会是什么样子?

想一想:

const getComponent = (props: RouteComponentProps<{}>) => () => (
  <Component {...props} />
)

那么你可以简单地:

<Route
  {...rest}
  render={getComponent}
/>

但在这种情况下,Component 是未定义的。有什么线索吗?


编辑: 重要提示 - 使用 TypeScript。所以必须以某种方式将组件传递到getComponent


EDIT2:我使用双 lambda 的原因是因为它允许处理这样的情况:

const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => (foo: string) => {
  ...
}

<button onClick={handleClick('bar')} ... // foo === 'bar'

【问题讨论】:

    标签: javascript reactjs typescript jsx tslint


    【解决方案1】:

    在您的情况下,getComponent 是一个 lambda 函数,它返回另一个 lambda 函数,但由于 (props) =&gt; () =&gt; ... 而不是组件。修改您的 getComponent 函数以从 render 函数接收组件,如下所示。

    const getComponent = (Component: Component) => (props: RouteComponentProps<{}>) => (
      <Component {...props} />
    )
    

    并修改此“渲染”功能。

    <Route
      {...rest}
      render={getComponent(Component)}
    />
    

    注意:您收到的组件为component,小号c,并将其用作Component,大写C

    【讨论】:

    • 我忘了提到我正在使用 TypeScript,得到:找不到名称 'Comonent' - 这是以某种方式将其传递给 getComponent 的主要斗争。
    • 非常好,它解决了这个问题。现在只需要弄清楚如何传递一个类型的组件(泛型)来避免使用any
    • 您可以使用Component 作为组件类型。
    猜你喜欢
    • 2017-10-13
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多