在JSX属性中处理' lambda'案件

时间:2018-06-13 06:04:57

标签: javascript reactjs typescript jsx tslint

现有代码:

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

这里有一个错误:

enter image description here

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

关于smth的想法:

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'

1 个答案:

答案 0 :(得分:3)

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

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

并修改此'&#39;渲染&#39;功能也是。

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

注意:您收到的组件为component,其中cComponent,并且C的资本为EventEnqueuedUtcTime