【问题标题】:Constant import to react component不断导入反应组件
【发布时间】:2021-03-06 12:07:05
【问题描述】:

我正在使用 React 库创建一个应用程序,但我的问题更多与 JavaScript ES6 本身有关。

  1. 我有一个组件(页面),我在其中使用了我自己设计的 FAB(浮动操作按钮):
class Page extends Component {
.
.
.
  render() {

    return (<>
      .
      .
      .
      <FloatingActionButton
        mainActionContent={<Icon.Plus size="48" />}
        onClick={() => {
          this.setState({
          examinationData: null,
          modalExamination: true,
          });
        }}
        dropdown={myFAB}
      />
      .
      .
      .
    </>)
  }
}
  1. 在主组件中,我将 FAB 配置存储在一个常量中
class Page extends Component {
.
.
.
doRefreshList() {...}
doDeleteSelected() {...}
.
.
.
render() {

  const myFAB = {
    trigger: {
      className: "m-0 rounded-circle noCaret badge-overlay",
      style: { paddingLeft: "5em", paddingRight: ".5em", zIndex: 0 },
      content: (
        <React.Fragment>
          <Icon.ThreeDotsVertical size="24" />
          {this.state.selected.length > 0 && (
            <Badge pill variant="danger">
              {this.state.selected.length}
            </Badge>
          )}
        </React.Fragment>
      ),
    },
    header: "Akcje",
    items: [
      {
        text: "Odśwież widok",
        icon: <Icon.ArrowRepeat size="16" />,
        onClick: () => {
          this.doRefreshList();
        },
      },
      {},
      {
        text: "Zaznacz wszystkie",
        icon: <Icon.SquareFill size="16" />,
        onClick: null,  // <-- is `null` because it is not implemented yet
      },
      {
        text: "Odznacz wszystkie",
        icon: <Icon.Square size="16" />,
        onClick: null,  
      },
      {
        text: "Odwróć zaznaczenie",
        icon: <Icon.SquareHalf size="16" />,
        onClick: null,
      },
      {},
      {
        className: "d-flex flex-row justify-content-between align-items-center",
        disabled: this.state.selected.length === 0,
        text: (
          <React.Fragment>
            <span>
              <Icon.Trash size="16" /> Usuń zaznaczone
            </span>
            {this.state.selected.length > 0 && (
              <Badge pill variant="danger">
                {this.state.selected.length}
              </Badge>
            )}
          </React.Fragment>
        ),
        onClick: this.doDeleteSelected,
      },
      {},
      {
        text: "Ustawienia widoku...",
        icon: <Icon.Sliders size="16" />,
        onClick: () => {
          this.setState({ modalViewOption: true });
        },
      },
    ],
  };

  return (
  .
  .
  .
  )
}

}
  1. 但是,如你所见,在这个常量中,我调用了主组件(页面)的方法和状态

这还不错,因为它运行良好,但我不喜欢代码的视觉效果。我想分离 FAB 配置 - 将其放在不同的文件中 - 并将其导入页面组件。 我就是不能这样:

import FABConfig from 'path/to/file';

class Page extends Component {
.
.
.
  render() {
    .
    .
    .
    return (
      .
      .
      .
      <FloatingActionButton
        mainActionContent={<Icon.Plus size="48" />}
        onClick={() => {
          this.setState({
          examinationData: null,
          modalExamination: true,
          });
        }}
        dropdown={FABConfig}
      />
    )
  }
}

当然,它会导入,但会崩溃 - 不知道 this 是什么。

我怎样才能对组件配置进行这样的“导入”,而不会在代码中造成太多混乱:D?

【问题讨论】:

  • 我在元素的正确嵌套方面稍微更正了问题中的代码 - 它是关于查看位于何处的内容。

标签: javascript reactjs node-modules es6-modules


【解决方案1】:

我需要承认,你在这个问题上的方向很好:)

首先,最好不要在渲染中初始化一个巨大的对象。因为在每次重新渲染时,您的配置对象都会从头开始创建。其实,它并不是你想的那么静态的对象。

其次,您的配置对象包含许多动态内容,例如 this.state、一些回调等。如果我是您,我更愿意将此配置对象拆分为一些小组件,例如:

const Trigger = ({length, className, style}) => {
  return (
    <React.Fragment>
      <Icon.ThreeDotsVertical size="24" />
      {length > 0 && (
        <Badge pill variant="danger">
          {length}
        </Badge>
      )}
    </React.Fragment>
  )
}

在主要组件中

<Trigger 
  length={this.state.selected.length}
  className="m-0 rounded-circle noCaret badge-overlay"
  style={{ paddingLeft: "5em", paddingRight: ".5em", zIndex: 0 }}
/>
// item usage with the same thinking,
<Item
  text="Odśwież widok"
  icon={<Icon.ArrowRepeat size="16" />}
  onClick={() => {
    this.doRefreshList();
  }}
/>

这样,react 就可以计算出何时重新渲染这个 Trigger 组件。使用您的解决方案,不会有任何渲染优化。

总之,我更愿意创建一个大的 FAB 组件。在这个大组件中,我也可以拆分triggerheaderitem,因为它们最终会以某种方式加入渲染,但他们还不知道。您可以将它们制作成组件。这是解决这个问题的反应方式:)

【讨论】:

  • 我喜欢您的方法,但仍将 this.state 的值和回调传递给“次要”组件。它仍然不允许我导出 FAB 组件设置。
  • 是的,我想说的是,您不需要将此数据视为配置。你知道,一个正常的配置应该是这样的:typescriptlang.org/docs/handbook/tsconfig-json.html。但是你有整个渲染过程的数据。我得到了你想要做的事情,但是这个导出的数据应该是带有静态内容的简单 JSON,而不是带有状态变量和回调的 JS 对象。很可能,如果你坚持这样做,这种方法稍后会以某种方式让你失败。
  • 好的,我明白了。我不再坚持导出这些数据 :) 我只是想“修饰”代码,这样它就不会那么长了,但正如我所见,有时它必须是这样的:P(噩梦出来了; ) ) 您对将来如何避免这种方法有什么建议吗?这完全可以避免吗? : D
  • 很高兴知道 :) 这里的评论很难编码,所以我为你准备了一个想法:codesandbox.io/s/sharp-satoshi-3muco?file=/src/App.js 你将一些动态数据传递给&lt;FloatingActionButton dropdown={...}/&gt; 以在其中构建 FAB 组件, 正确的?所以,考虑我的回答,让我们假设您准备了一个带有小零件的大型 FAB 组件。将整个组件 &lt;FloatingActionButton /&gt; 作为我的代码框之类的道具,而不是在 FloatingActionButton's render 中处理它。 Wdyt?
  • 您可以问,“我将从这个解决方案中得到什么?”。这样,您的配置计算和整个数据将跳转到您的大 FAB 组件中。因此,您无需将数据导出或携带到其他地方。另一个好处是,现在 react 可以轻松计算出正在更改的内容以及正在为您的 FAB 组件更新的 prop。而且如果你继续扩展这个Page和FAB组件,你会发现你可以很容易地找到你想要更新的线路,并且在未来更容易管理这两个组件。
猜你喜欢
  • 2021-07-31
  • 2018-07-31
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2017-05-12
  • 2023-03-25
相关资源
最近更新 更多