我今天遇到了同样的问题,@vijay-menon 的回答非常有帮助。这是一个简单的独立组件,用于同一件事:
import React, { Component } from 'react';
import Tooltip from '@material-ui/core/Tooltip';
class OverflowTip extends Component {
constructor(props) {
super(props);
this.state = {
overflowed: false
};
this.textElement = React.createRef();
}
componentDidMount () {
this.setState({
isOverflowed: this.textElement.current.scrollWidth > this.textElement.current.clientWidth
});
}
render () {
const { isOverflowed } = this.state;
return (
<Tooltip
title={this.props.children}
disableHoverListener={!isOverflowed}>
<div
ref={this.textElement}
style={{
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis'
}}>
{this.props.children}
</div>
</Tooltip>
);
}
}
用法示例:
<OverflowTip>
some long text here that may get truncated based on space
</OverflowTip>
一个麻烦是如果元素的空间在页面中动态变化(例如页面调整大小或动态 DOM 变化),它不会确认新空间并重新计算它是否溢出。
其他工具提示库(如 Tippy)有一个方法,当尝试打开工具提示时会触发该方法。这是进行溢出检查的理想场所,因为它始终有效,无论文本元素的 DOM 宽度是否已更改。不幸的是,使用 Material UI 提供的 API 来做到这一点比较麻烦。