【问题标题】:pass array of objects to react component将对象数组传递给反应组件
【发布时间】:2017-07-12 18:18:13
【问题描述】:

我创建了一个进度条组件,它采用颜色、高度、值和最大值等道具。现在它显示一个单一的进度条,我正在尝试对进度条进行分组并按颜色分组。这是我的组件

const ProgressBar = ({
  heightSize,
  value,
  max,
  ...customProps
}) => {
  const classes = classNames([
    'my-ProgressBar',
    { [`my-ProgressBar--${heightSize}`]: heightSize },
    customProps.className,
  ]);

  const normalizedValue = (value / max) * 100;

  return (
    <progress
      {...customProps}
      style={{ color: customProps.color }}
      className={classes}
      max={100}
      value={normalizedValue}
      aria-valuemax={100}
      aria-valuemin={0}
      aria-valuenow={normalizedValue}
      tabIndex="-1"
    />);
};

我正在尝试更新此组件,以便如果我将数组传递给此组件,它将返回分组的进度条。这是我失败的尝试之一。

const ProgressBar = (groups) => {
        const GroupProgressBar= groups.map((group) => (
        <div key={group.color}>
          color: {group.color},
          heightSize: {group.height},
          value: {group.value},
          color: {group.color}          
        </div>
      ));
            return (
              <progress
                {...customProps}
                style={{ color: group.color }}
                className={classes}
                max={100}
                value={normalizedValue}
                aria-valuemax={100}
                aria-valuemin={0}
                aria-valuenow={normalizedValue}
                tabIndex="-1"
              />);
        });

我如何更新我的组件以使其适用于组?

【问题讨论】:

  • 分组进度条的意思是,数组元素的每个进度条正确吗?
  • @Mayank Shukla。是的正确

标签: javascript reactjs jsx


【解决方案1】:

先用map为数组的每一项创建进度条,然后从组件中返回。

这样写:

const ProgressBar = ({groups, heightSize}) => {

    let heightSize = 10;   /*calculate here*/

    const GroupProgressBar = groups.map((group, i) => (
          <progress
              key = {i}
              {...customProps}
              heightSize = {heightSize}
              style={{ color: group.color }}
              className={classes}
              max={100}
              value={group.value}
              aria-valuemax={100}
              aria-valuemin={0}
              aria-valuenow={normalizedValue}
              tabIndex="-1"
          />
        )
    )

    return <div> {GroupProgressBar} </div>
}

查看DOCs了解更多详情。

更新:

看到我们可以从父组件传递任何道具,props 是一个包含所有数据的对象。在函数式组件中,我们需要这样写:

const ProgressBar = (props) => {
    console.log(props);
}

这里的props将包含所有传递的数据和方法,您可以通过props.keyName访问任何传递的值,从父级传递高度和组,并通过props.groupsprops.height访问它们。

另一种方式是:

const ProgressBar = ({groups, heightSize}) => {
    console.log(groups, heightSize);
}

这不过是object destructuring,现在我们可以直接按组和高度大小使用这些值。

注意:为地图内的每个进度条分配唯一键,我使用了项目索引但这不是一个好方法,所以从组对象中分配一些唯一值。

【讨论】:

  • 感谢您的帮助。我根据传递的值派生 heightSize 。我在 css 中有一个 .my-ProgressBar 类。所以基于高度小,中,高我得到了酒吧的大小。我该怎么做?
  • 抱歉没听明白,您想计算每个条目的高度,否则它将为所有数组条目固定?
  • np。它将为所有数组条目修复。感谢您提出这个问题,解决了一个问题:)
  • 谢谢。我们可以将 heightSize 设置为单独的属性,以便现有的 css 类将根据用户传递的内容返回大小吗?
  • 别忘了在progress 组件上设置key 属性。
猜你喜欢
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多