如何在 material UI 芯片中显示姓名和电子邮件?

How to display name and email inside material UI chip?

我正在使用 Material UI 芯片并排显示姓名和电子邮件。 但是当名字很大时,电子邮件会超出筹码边界

这是我返回筹码的函数

  getGuestList() {
    let {guests} = this.state;
    let guestChips = [];
    let s = {overflow: 'hidden',width: '50%', display: 'inline-flex'}
    guests.map((guest, i) => {
      guestChips.push(
        <div key={i}>
          <Chip
            onRequestDelete={() => {this.removeGuest(i)}}
            style={{marginTop: 10, width: '225%'}}
            labelStyle={{width: '97%'}}
          >

          <div><div style={s}>
            <div style={{textOverflow: 'ellipsis'}}>
            {guest.name}
            </div>
          </div> | <div style={s}>{guest.email ? guest.email : ''}</div></div>
          </Chip>
        </div>
      )
    });

这两个都显示,但它们的宽度固定为 50%,因此如果电子邮件较小,则 space 保留在电子邮件的一侧,如果名称较小,则 space 保留在电子邮件的一侧电子邮件的一侧。

有没有办法克服这个问题?

我完全根据示例 1 material-ui 的站点为您整理了这些内容。特别是 "Example Array" 示例。 http://www.material-ui.com/#/components/chip.

对于您正在寻找的内容,除了可能更改值名称外,您真的不需要做比他们提供的更多的事情。

我会注意到我使用的是最新版本的 Material-UI。他们使用的示例,我为您提供的内容在许多版本中都没有改变。所以它应该适合你。我也是 运行 React/ReactDOM 的最新兼容版本。如果这对您不起作用,那么您应该考虑升级到 16.0 发行版(如果您还没有的话)。

import React from 'react';
import Chip from 'material-ui/Chip';
const outsideDataSource = [
    {
        key: 1,
        email: "Bob.Bobberson@gmail.com",
        name: "Bob Bobberson"
    },
    {
        key: 2,
        email: "Abigail@gmail.com",
        name: "Abigail Person"
    },
    {
        key: 3,
        email: "third.person@gmail.com",
        name: "Third Person"
    }
]

export default class EmailList extends React.Component {
constructor(props) {
    super(props);

    this.state = {
        guestList: outsideDataSource
    }
}
handleRequestDelete = (key) => {
    this.guestList = this.state.guestList;
    const chipToDelete = this.guestList.map((chip) => chip.key).indexOf(key);
    this.guestList.splice(chipToDelete, 1);
    this.setState({guestList: this.guestList});
}
renderGuestList(guest) {
    return (
        <Chip
            key={guest.key}
            onRequestDelete={() => this.handleRequestDelete(guest.key)}
            style={{display: 'inline-block', marginLeft: '10px', marginBottom: '10px'}}
            labelStyle={{verticalAlign: 'top'}}
        >
            {guest.name}: {guest.email}
        </Chip>
    )
}
render() {
    const {guestList} = this.state
    return (
        <div>
            {guestList.map(this.renderGuestList, this)}
        </div>
    );
}
}

Sandeep,如果您打算将段落长度的文本放入纸片中,您应该考虑重新设计 UI,因为这不是 material-ui' s 芯片既不是为了 google 的 material 规格所设计的。谁真的拥有最大字符数 (254) 的电子邮件??

进入芯片组件的功能,它们的尺寸正确,没有你在该图像中向我展示的奇怪间距。但是,它们不是弹性项目,因此没有响应。如果您仍然遇到 css 问题,您必须有一些您已经实现的自定义 css 覆盖了 material-ui 提供的内容并导致它休息。我附上了一张图片,显示我如何在我的代码中遇到您的风格问题。说到自定义 css,您只需在芯片上设置最大宽度然后使用 text-overflow: ellipsis 就可以完全避免这整个问题。

尝试这种方式,但改变你的值

 <Chip     
  label={user['user.firstname'] + ' ' + user['user.lastname']}
 >

如果允许您使用自定义组件,您可以尝试以下方法代替 Chip

import { withStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import React from 'react';

const styles = theme => ({
  root: {
    margin: '4px',
    backgroundColor: '#e0e0e0',
    display: 'inline-flex',
    boxSizing: 'border-box',
    borderRadius: '16px',
  },
  label: {
      padding: 10,
      margin: 0,
  }  
});

class MultiLineChip extends React.Component {
  render() {
    const { classes } = this.props;

    return (
      <div className={classes.root}>
          <Typography variant="body2" gutterBottom className={classes.label}>
            {this.props.label || ''}
        </Typography>
      </div>
    );
  }
}

export default withStyles(styles)(MultiLineChip);