reactjs - Varför orsakar det en varning i DOM-elementet när man skickar egna props till ett MUI-stilat element?
Jag arbetar med MUI v5 i React med Typescript. Jag försöker styla en div, men får följande fel i konsolen:
"Varning: React känner inte igen openFilterDrawer-egenskapen på ett DOM-element. Om du avsiktligt vill att den ska visas i DOM som en anpassad attribut, skriv den med små bokstäver som openfilterdrawer istället. Om du av misstag skickade den från en föräldrakomponent, ta bort den från DOM-elementet."
Vad gör jag för fel?
Här är min kod:
type ChipsContainerProps = {
openFilterDrawer: boolean
}
const ChipStyled = {
Container: styled('div')<ChipsContainerProps>(
({ theme, openFilterDrawer }) => ({
//leaving out irrelevant theme code
...(openFilterDrawer && {
transition: theme.transitions.create('margin', {
easing: theme.transitions.easing.easeOut,
duration: theme.transitions.duration.enteringScreen,
}),
marginLeft: 0,
paddingLeft: '0rem',
}),
},
}),
),
}
Svar #1
Problemet är att MUI vidarebefordrar openFilterDrawer-egenskapen som du skickar till den underliggande div, och eftersom openFilterDrawer inte är en giltig egenskap för div-element, visar React den varningen.
För att rensa varningen bör du skicka ett objekt som innehåller en shouldForwardProps-funktion för att filtrera egenskapen från den resulterande div. Till exempel:
const ChipStyled = {
Container: styled("div", {
shouldForwardProp: (prop) => prop !== "openFilterDrawer" // <-- Here
})<ChipsContainerProps>(({ theme, openFilterDrawer }) => ({
//leaving out irrelevant theme code
...(openFilterDrawer && {
transition: theme.transitions.create("margin", {
easing: theme.transitions.easing.easeOut,
duration: theme.transitions.duration.enteringScreen
}),
marginLeft: 0,
paddingLeft: "0rem"
})
}))
};
Svar #2
Ett exempel som använder MUI version 5+
export const PaperContainer = styled(Paper, {
shouldForwardProp: prop => prop !== 'gridArea',
name: 'PaperContainer',
})<{ gridArea: GridArea }>(({ theme, gridArea }) => ({
gridArea,
padding: theme.spacing(6),
overflow: 'hidden',
}));
