获取MenuItem材质ui的值

IT技术 reactjs material-ui
2021-05-21 04:22:19

我正在为菜单和菜单项使用Material UI我正在尝试获取菜单项的值,但它不起作用。

这是我的代码:

<Menu value= { this.state.selectedItem }>
  <MenuItem onClick={this.listClicked} 
    leftIcon={
      <FontIcon 
        className="material-icons"
        style={{ color: 'white', margin: '0' }}>
          format_list_bulleted
      </FontIcon>
    }
  />     
  <MenuItem onClick={this.settingClicked} 
    leftIcon={
      <FontIcon 
        className="material-icons"
        style={{ color: 'white', margin: '0' }}>
          settings
      </FontIcon>
    } 
  />
</Menu>

public listClicked = (value) => {
  this.setState({
    selectedItem :value
  })
  console.log(this.state.selectedItem)
}

我没有得到值,在导航器的控制台中我有一个对象。

你能帮助我吗?

谢谢

4个回答

在菜单项上使用数据属性并从currentTarget单击事件的访问它请注意,data-my-value属性变为myValueon event.currentTarget.dataset

const handleClick = event => {
    const { myValue } = event.currentTarget.dataset;
    console.log(myValue) // --> 123
}

<MenuItem
    data-my-value={123}
    onClick={handleClick}
>
    <div>text</div>
</MenuItem>

为什么currentTarget而不是target ThecurrentTarget指的是事件侦听器直接附加到的元素,而target指的是 MenuItem 中的特定元素,例如 some div,即被单击的元素该分区不具有data-my-value的属性,因此将target不会有myValuedataset所以currentTarget在这种情况下使用

相关:如何从 React 中的事件对象访问自定义属性?

在 Material UIMenu组件中,选择菜单项时的触发函数最好使用onChangeMenu组件的onClick处理程序完成,而不是每个单独项目处理程序。onChange回调的签名function(event: object, value: any) => void,因此您可以为每个MenuItemsa 提供单独的valueprops,这将作为onChange处理程序中的第二个参数提供像这样:

<Menu value= { this.state.selectedItem } onChange={ this.menuClicked }>
  <MenuItem value="list" leftIcon={
    <FontIcon className="material-icons">format_list_bulleted</FontIcon>
  } />     
  <MenuItem value="settings" leftIcon={
    <FontIcon className="material-icons">settings</FontIcon>
  } />
</Menu>

...

public menuClicked = (event, value) => {
  this.setState({
    selectedItem: value
  })
  console.log(this.state.selectedItem)
}

Menu 没有在 API 中定义 onChange 并且它对我不起作用,因为它从未被调用过。对我有用的是一个丑陋的解决方案:

<MenuItem onClick={this.handleClose.bind(this, 'valueHere')}>Text here</MenuItem>

我使用了 NativeEvent,它对我有用。

handleClose = (ev) => {
        this.setState({
            anchorEl: null
        });
        console.log(ev.nativeEvent.target.outerText);
    };

请尝试这样。