【问题标题】:ReactJS: How to dynamically render Material-UI's <MenuItem/> inside <DropDownMenu/>?ReactJS:如何在 <DropDownMenu/> 内动态渲染 Material-UI 的 <MenuItem/>?
【发布时间】:2017-02-14 11:49:21
【问题描述】:

使用 ReactJS + Material-UI,我有一个名为 colors 的数组,其中包含不同颜色的字符串。例如,数组colors 有 3 个颜色字符串:“白色”、“蓝色”、“绿色”。然后我想渲染每个颜色字符串在 &lt;DropDownMenu/&gt; (http://www.material-ui.com/#/components/dropdown-menu)内有一个 &lt;MenuItem/&gt;。和一旦选择了&lt;MenuItem/&gt;,我想控制台记录那种特定的颜色,比如选择“白色”:console.log(“白色”)。

所以我使用了 .forEach 但它没有显示任何字符串并且它是空的。我可能做错了什么?

代码如下:

  constructor() {
    super()

    this.state = {
      value: 1,
    }
  }

  dropDownColorChange(event, index, value) {
    this.setState({value: value})
    //Not sure how to implement here dynamically based on array size. Would like to console.log the color string of the selected
  }

  render() {
    var colors = ["white", "blue", "green"] //would be able to handle any array size


    return (
             <div>
               <DropDownMenu
                value={this.state.valueTwo}
                onChange={this.dropDownColorChange}
              >
                {
                    <MenuItem value={1} primaryText="Select" />
                  colors.forEach(color => {
                    <MenuItem primaryText={color}/>
                  })
                }
              </DropDownMenu>
             </div>
    )
  }

谢谢

【问题讨论】:

    标签: javascript css reactjs react-jsx material-ui


    【解决方案1】:

    你几乎做对了。您必须在可用颜色上map 并为每种颜色返回一个MenuItem:

    const colors = ['white', 'blue', 'green'];
    
    class ColorChanger extends Component {
      constructor() {
        super();
    
        this.state = {
          selectedColorValue: 1,
        };
      }
    
      handleColorChange(event, index, value) {
        console.log(`You have selected ${colors[value]} color`);
    
        this.setState({
          selectedColorValue: value
        });
      }
    
      render() {
        return (
          <div>
            <DropDownMenu value={this.state.selectedColorValue} onChange={this.handleColorChange}>
              {colors.map((color, index) =>
                <MenuItem key={index} value={index} primaryText={color} />
              )}
            </DropDownMenu>
          </div>
        );
      }
    }
    

    map(与forEach相反)返回一个数组,其中每个元素都是谓词函数的返回值。在您的情况下,它返回 &lt;MenuItem /&gt;。

    【讨论】:

    • 您需要将key 属性添加到 MenuItem 以便 React 可以跟踪每个 MenuItem
    • 没错,错过了这个。答案已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2016-12-25
    • 2017-09-22
    • 2020-10-09
    • 2019-07-24
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多