【问题标题】:Using multiple instances of a component inside parent component在父组件内使用组件的多个实例
【发布时间】:2019-11-15 16:51:29
【问题描述】:

我有一个页面需要显示多个微调器。每当数据到达时,都应该隐藏微调器。

。在示例中,我有子组件,其中我使用 settimeout 模拟了数据,就好像它来自后端一样。

我已将加载器提取为一个单独的组件,以便它作为所有项目的通用加载器。

通常,如果存在,API 会给我一个项目数组,如果不是一个空数组。

尝试了一些方法,但是 对于所有卡片,它都显示为未找到,然后被替换为内容

沙盒:https://codesandbox.io/embed/react-table-row-table-vdnfh?codemirror=1

import * as React from "react";
import { render } from "react-dom";
import "./styles.css";
import Card from "./Card";

class App extends React.Component<IProps, IState> {
  constructor(props: any) {
    super(props);
    this.state = {
      cardData1: undefined,
      cardData2: undefined,
      cardData3: undefined,
      cardData4: undefined
    };
  }

  componentDidMount() {
    this.getGraphData();
  }

  getGraphData = () => {
    this.setGraphData("graph1");
    this.setGraphData("graph2");
    this.setGraphData("graph3");
    this.setGraphData("graph4");
  };

  setGraphData = (cardNumber: string) => {
    //based on the attribute I set the corresponding card data
    if (cardNumber === "graph1") {
      setTimeout(() => {
        this.setState({ cardData1: [1, 2, 3] });
      }, 1000);
    }
    if (cardNumber === "graph2") {
      setTimeout(() => {
        this.setState({ cardData2: [3, 4, 5] });
      }, 2000);
    }

    if (cardNumber === "graph3") {
      setTimeout(() => {
        this.setState({ cardData3: [6, 7, 8] });
      }, 3000);
    }
    if (cardNumber === "graph4") {
      setTimeout(() => {
        this.setState({ cardData4: [] });
      }, 4000);
    }
  };

  render() {
    let { cardData1, cardData2, cardData3, cardData4 } = this.state;
    return (
      <>
        <Card
          name="Card1"
          data={this.state.cardData1}
          spinnerFlag={cardData1 === undefined}
        />
        <Card
          name="Card3"
          data={this.state.cardData2}
          spinnerFlag={cardData2 === undefined}
        />
        <Card
          name="Card3"
          data={this.state.cardData3}
          spinnerFlag={cardData3 === undefined}
        />
        <Card
          name="Card4"
          data={this.state.cardData4}
          spinnerFlag={cardData4 === undefined}
        />
      </>
    );
  }
}

【问题讨论】:

  • 那么到底是什么不起作用?从您的描述和示例...看起来一切都按照您的描述进行。
  • 您好,您能详细解释一下这个问题吗?你是说当数据到达时有一个框架显示没有数据的状态然后渲染数据?如果是这样,那很可能是实际卡片组件中的一个问题,我们需要看到这一点。也只是一个小的建议代码,也许尝试!cardData而不是=== undefined
  • 同样不要挑剔,只是对您的代码明智的建议。尽量不要将变量设置为未定义。最好的做法是只为开发人员从未给出值的变量保留未定义。如果要设置空变量,请改用 null。让调试变得更容易。
  • @Viktor Garba 我要解决的问题是,我需要一个可以显示和隐藏加载器的微调器组件。我试图在沙箱中解决这个问题(请参阅问题中的链接)。使用我的代码,首先显示“找不到数据”,然后数据到达。相反,我需要的是在数据到达之前显示微调器,并且基于它我需要显示数据,或者如果没有数据存在,则应该显示“未找到数据”。我得到的数据要么是项目数组,要么是一个空数组,以防万一
  • @ageoff。我要解决的问题是,我需要一个可以显示和隐藏加载器的微调器组件。我试图在沙箱中解决这个问题(请参阅问题中的链接)。使用我的代码,首先显示“找不到数据”,然后数据到达。相反,我需要的是在数据到达之前显示微调器,并且基于它我需要显示数据,或者如果没有数据存在,则应该显示“未找到数据”。我得到的数据要么是项目数组,要么是一个空数组,以防没有数据

标签: javascript reactjs ecmascript-6 ecmascript-5 setstate


【解决方案1】:

嗯,好吧,我明白了。所以您的问题是,在您的卡片组件中,您同时呈现数据部分(显示数据或未找到)和微调器。您需要检查是否仍在获取数据 (spinnerFlag) 并根据该标志有条件地渲染微调器或数据。

        <div className="box">
          {
            this.props.spinnerFlag ? (
              <Spinner spinnerFlag={this.props.spinnerFlag} />
            ) : (
              <div>
                {data && data.length ? (
                  data.map((val: any, index: any) => (
                    <span key={index}>Value : {val} </span>
                  ))
                ) : (
                  <div>Not found</div>
                )}
              </div>
            )
          }
        </div>

编辑:我的意思是当你初始化变量时只使用null,因为你实际上是在设置“值”

this.state = {
  cardData1: null,
  cardData2: null,
  cardData3: null,
  cardData4: null
};

然后当你这样做时

<Card
  name="Card1"
  data={this.state.cardData1}
  spinnerFlag={!cardData1}
/>

! 是一个运算符,基本上表示“不”,并将计算为与实际变量相反的布尔值。所以如果cardData1null(错误),!cardData1 将是true。那么设置数据的时候就为假了。

P.S 有趣的技巧,!! 如果您出于任何原因需要布尔值,则将其强制为布尔值

【讨论】:

  • 谢谢:) 既然你必须告诉我不要使用 undefined,你会建议我怎么做?我如何以你的方式实现同​​样的目标
  • 我把我的答案扩大了一点!乐于助人
  • 那么 spinnerFlag={!!cardData1} 需要做这个改变吗?
  • 我的错,只是!cardData1。因为如果你初始化 cardData1 = null 那将是一个错误的值。但是,由于您希望微调器显示出来,因此您希望将其转换为 true(如果它为空)。因此,您添加 ! 以得到与其当前值 null 相反的值。那么当cardData = [...somedata]的时候,会是true的值,因为有一个数组,!会把它变成false的值,这样会隐藏spinner
猜你喜欢
  • 2020-11-19
  • 2017-04-06
  • 2021-01-24
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多