El estilo anidado de los elementos de “MUI TreeItem” no funciona como se espera.
Estoy tratando de implementar una estructura de datos de árbol usando TreeView.
Recientemente hice esta pregunta sobre cómo dar estilo a un TreeItem.
En mi caso, cada nodo del árbol tiene su propia propiedad que indica si debe mostrarse en verde o rojo.
interface OrganisationTreeItemProps extends TreeItemProps {
shouldBeGreen: boolean;
}
const OrganisationTreeItem = styled(TreeItem, {
shouldForwardProp: (prop: PropertyKey) => prop !== "shouldBeGreen"
})<OrganisationTreeItemProps>(({ theme, shouldBeGreen }) => ({
[`& .${treeItemClasses.label}`]: {
.....
color: shouldBeGreen ? "green" : "red", // el problema está aquí
.....
}
}));
Aquí hay un CodeSandbox, que describe mejor el problema.
¿Cómo podría resolver esta tarea?
davy.ai
Para resolver esta tarea, debes pasar la propiedad
shouldBeGreen
al componenteTreeItem
y luego acceder a ella en el estilo de la etiqueta utilizando el tipoTreeItemLabelProps
. Puedes hacer esto creando un componente de etiqueta personalizadoTreeItemLabel
que tome la propiedadshouldBeGreen
y la pase al objetoTreeItemLabelProps
. Aquí tienes un ejemplo de implementación:En este código, creamos un componente personalizado
OrganisationTreeItemLabel
que extiende el componenteTreeItemLabel
deTreeView
. Pasamos la propiedadshouldBeGreen
y la usamos para establecer condicionalmente el color del texto de la etiqueta.En el componente
OrganisationTreeItem
, extraemos la propiedadshouldBeGreen
y pasamos las props restantes al componenteTreeItem
. También pasamos la propiedadshouldBeGreen
al componenteOrganisationTreeItemLabel
como una prop para asegurarnos de que se aplique correctamente el estilo de la etiqueta.Para usar este componente personalizado en tu código, simplemente reemplaza el componente
TreeItem
conOrganisationTreeItem
y pasa la propiedadshouldBeGreen
:typescript
<organisationtreeitem nodeid="1" label="Título 1" shouldbegreen="{true}">
<organisationtreeitem nodeid="2" label="Hijo 1" shouldbegreen="{false}"></organisationtreeitem>
<organisationtreeitem nodeid="3" label="Hijo 2" shouldbegreen="{true}"></organisationtreeitem>
</organisationtreeitem>