我有一个可以渲染一个字符串或另一个字符串的 React 组件。
const MyComponent = (props: {
readonly textA: string;
readonly textB: string;
readonly renderB: boolean;
}) => {
return <>{props.renderB ? props.textB : props.textA}</>;
};
问题是当我使用这个并且打开renderB
和关闭时,组件的宽度会根据渲染的字符串而改变。我希望组件宽度适合两个字符串中较长的一个。
我如何获取最大长度textA
并textB
使用它来确定组件的宽度?
例如,它可能看起来像这样:
const MyComponent = (props: {
readonly textA: string;
readonly textB: string;
readonly renderB: boolean;
}) => {
const widthA = /* compute the width of props.textA */;
const widthB = /* compute the width of props.textB */;
return (
<div style={{ width: `${Math.max(widthA, widthB)}px` }}>
{props.renderB ? props.textB : props.textA}
</div>
);
};
您可以使用画布来测量文本的宽度。问题中的组件可以按如下方式填写:
缺点是您必须设置字体,这意味着您需要知道组件的字体。
一种解决方案是使用网格布局,渲染两个子跨度,并隐藏不应渲染的跨度(使用
visibility:hidden
)。优点是这可以用纯 CSS 完成,而无需计算文本大小,这通常非常麻烦且有缺陷。但缺点当然是用户可以看到 DOM 树中的另一个子项,这可能并不理想,具体取决于您的用例。代码示例