Tenho um componente React que pode renderizar uma string ou outra.
const MyComponent = (props: {
readonly textA: string;
readonly textB: string;
readonly renderB: boolean;
}) => {
return <>{props.renderB ? props.textB : props.textA}</>;
};
O problema é que quando eu uso isso e alterno entre renderB
ligado e desligado, a largura do componente pode mudar com base em qual string é renderizada. Quero que a largura do componente se ajuste à maior das duas strings.
Como posso pegar o comprimento máximo de textA
e textB
e usá-lo para determinar a largura do meu componente?
Por exemplo, poderia ser algo como isto:
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>
);
};
Você pode usar uma tela para medir a largura do texto. O componente da pergunta pode ser preenchido da seguinte forma:
A desvantagem é que você precisa definir a fonte, o que significa que você precisa saber a fonte do componente.
Uma solução é usar o layout de grade, renderizar ambos os spans filhos e ocultar o que não deve ser renderizado (usando
visibility:hidden
). A vantagem é que isso pode ser feito com CSS puro sem precisar calcular o tamanho do texto, o que geralmente é bem problemático e cheio de bugs. Mas a desvantagem é que, claro, o usuário pode ver o outro filho na árvore DOM, o que pode não ser o ideal dependendo do seu caso de uso.Exemplo de código