Migrando da v4 para v5
Sim, v5 foi lançada!
Procurando pelos documentos da v4? Encontre-os aqui.
Este documento está em constante evolução. Você atualizou seu site e encontrou algo que não é abordado aqui? Adicione suas alterações no GitHub.
Introdução
Esta é uma referência para atualizar seu site de Material-UI v4 para v5. Embora haja muita coisa coberta por aqui, você provavelmente não precisará fazer tudo no seu site. Faremos o nosso melhor para manter as coisas fáceis de seguir e tão sequenciais quanto possível, para que você possa rapidamente agitar na v5!
Por que você deve migrar
Esta página de documentação cobre o como migrar da v4 para a v5. O por que é abordado na postagem no blog do Medium.
Atualizando suas dependências
A primeira coisa que você precisa fazer é atualizar suas dependências.
Atualize a versão do Material-UI
Você precisa atualizar seu package.json
para usar a versão mais recente do Material-UI e suas dependências de pares.
"dependencies": {
"@emotion/react": "^11.0.0",
"@emotion/styled": "^11.0.0",
"@material-ui/core": "^5.0.0"
}
Ou execute
npm install @material-ui/core@next @emotion/react @emotion/styled
ou
yarn add @material-ui/core@next @emotion/react @emotion/styled
Tratamento de alterações recentes
Suporte de navegadores e versões de node
Os indicativos de suporte do pacote padrão foram alterados. As versões exatas do suporte serão fixadas na consulta browserslist "> 0.5%, last 2 versions, Firefox ESR, not dead, not IE 11, maintained node versions"
.
O pacote padrão agora suporta:
- Node 10 (antes era 8)
- Chrome 84 (antes era 49)
- Edge 85 (antes 14)
- Firefox 78 (antes era 52)
- Safari 13 (macOS) e 12.2 (iOS) (antes era 10)
- para maiores detalhes (veja .browserslistrc (seção
stable
))
Não há mais o suporte para o IE 11. Se você precisar do suporte para o IE 11, confira nosso pacote legado.
Componentes de classe sem o encaminhamento de refs
O suporte para componentes de classe, sem o encaminhamento de refs, na propriedade component
ou como um elemento children
imediato foi removido. Se você estava usando unstable_createStrictModeTheme
ou não recebeu quaisquer avisos relacionados a findDOMNode
no React. StrictMode
, então você não precisa fazer nada. Caso contrário, confira a seção "Advertência com refs" em nosso guia de composição para descobrir como migrar. Esta alteração afeta quase todos os componentes no qual você está usando a propriedade component
ou passando diretamente um children
para componentes que requerem children
como elemento (ou seja, <MenuList><CustomMenuItem /></MenuList>
)
Styled engine
The styled engine used in v5 by default is emotion
. While migration from JSS to emotion, if you are using JSS style overrides for your components (for example overrides created by makeStyles
), you need to take care of the CSS injection order. In order to do this, you need to have on the top of your application the StylesProvider
with the injectFirst
option. Here is an example of it:
Agora você pode sobrescrever os estilos do Material-UI. import * as React from 'react';
import { StylesProvider } from '@material-ui/core';
export default function GlobalCssPriority() {
return (
<StylesProvider injectFirst>
{/* Your component tree. */}
</StylesProvider>
);
}
Note: If you are using emotion and have a custom cache in your app, that one will override the one coming from Material-UI. In order for the injection order to still be correct, you need to add the prepend option. Aqui está um exemplo:
import * as React from 'react';
import { CacheProvider } from '@emotion/react';
import createCache from '@emotion/cache';
const cache = createCache({
key: 'css',
prepend: true,
});
export default function PlainCssPriority() {
return (
<CacheProvider value={cache}>
{/* Sua árvore de componentes. import * as React from 'react';
import { StylesProvider } from '@material-ui/core';
export default function GlobalCssPriority() {
return (
<StylesProvider injectFirst>
{/* Your component tree. */}
</CacheProvider>
);
}
Note: If you are using styled-components and have StyleSheetManager
with a custom target
, make sure that the target is the first element in the HTML <head>
. If you are curious to see how it can be done, you can take a look on the StylesProvider
implementation in the @material-ui/styled-engine-sc
package.
Tema
Pontos de quebra agora são tratados como valores, em vez de intervalos. O comportamento de
down(key)
foi modificado para definir uma consulta de mídia menor do que o valor definido como ponto de quebra correspondente (de forma exclusiva). Obetween(start, end)
também foi atualizado para definir uma consulta de mídia para os valores reais entre o início (de forma inclusiva) e fim (de forma exclusiva). Ao usar o utilitário de pontos de quebradown()
, você precisa atualizar a chave de ponto de quebra em um passo. Ao usar obetween(start, end)
, o ponto de quebra de fim também deve ser atualizado em um passo. O mesmo deve ser feito ao usar o componenteHidden
. Observe exemplos das definições de mudanças necessárias abaixo:-theme.breakpoints.down('sm') // '@media (max-width:959.95px)' - [0, sm + 1) => [0, md) +theme.breakpoints.down('md') // '@media (max-width:959.95px)' - [0, md)
-theme.breakpoints.between('sm', 'md') // '@media (min-width:600px) and (max-width:1279.95px)' - [sm, md + 1) => [0, lg) +theme.breakpoints.between('sm', 'lg') // '@media (min-width:600px) and (max-width:1279.95px)' - [0, lg)
-theme.breakpoints.between('sm', 'xl') // '@media (min-width:600px)' +theme.breakpoints.up('sm') // '@media (min-width:600px)'
-<Hidden smDown>{...}</Hidden> // '@media (min-width:600px)' +<Hidden mdDown>{...}</Hidden> // '@media (min-width:600px)'
A assinatura do utilitário
theme.palette.augmentColor
foi alterada:-theme.palette.augmentColor(red); +theme.palette.augmentColor({ color: red, name: 'brand' });
Utilitário para atualização
For a smoother transition, the adaptV4Theme
helper allows you to iteratively upgrade to the new theme structure.
-import { createMuiTheme } from '@material-ui/core/styles';
+import { createMuiTheme, adaptV4Theme } from '@material-ui/core/styles';
-const theme = createMuiTheme({
+const theme = createMuiTheme(adaptV4Theme({
// v4 theme
-});
+}));
As seguintes alterações são aplicadas por este utilitário adaptador.
Alterações
A abstração com a função "gutters" não provou ser utilizada com frequência suficiente para ser valiosa.
-theme.mixins.gutters(), +paddingLeft: theme.spacing(2), +paddingRight: theme.spacing(2), +[theme.breakpoints.up('sm')]: { + paddingLeft: theme.spacing(3), + paddingRight: theme.spacing(3), +},
theme.spacing
agora retorna valores únicos com a unidade px por padrão. Esta alteração melhora a integração com styled-components & emotion.Antes:
theme.spacing(2) => 16
Depois:
theme.spacing(2) => '16px'
O
theme.palette.type
foi renomeado paratheme.palette.mode
, para melhor seguir o termo "modo escuro", que é geralmente usado para descrever este recurso.import { createMuiTheme } from '@material-ui/core/styles'; -const theme = createMuiTheme({palette: { type: 'dark' }}), +const theme = createMuiTheme({palette: { mode: 'dark' }}),
A chave
theme.palette.text.hint
não era usada em componentes do Material-UI e foi removida. Se você depende dela, você pode adicioná-la de volta:import { createMuiTheme } from '@material-ui/core/styles'; -const theme = createMuiTheme(), +const theme = createMuiTheme({ + palette: { text: { hint: 'rgba(0, 0, 0, 0.38)' } }, +});
As definições dos componentes dentro do tema foi reestruturada sob a chave
components
, para permitir que as pessoas possam descobrir de uma maneira facilitada as definições sobre um componente.
props
import { createMuiTheme } from '@material-ui/core/styles';
const theme = createMuiTheme({
- props: {
- MuiButton: {
- disableRipple: true,
- },
- },
+ components: {
+ MuiButton: {
+ defaultProps: {
+ disableRipple: true,
+ },
+ },
+ },
});
sobrescrevendo
import { createMuiTheme } from '@material-ui/core/styles';
const theme = createMuiTheme({
- overrides: {
- MuiButton: {
- root: { padding: 0 },
- },
- },
+ components: {
+ MuiButton: {
+ styleOverrides: {
+ root: { padding: 0 },
+ },
+ },
+ },
});
Estilos
- Renomeado
fade
paraalpha
para descrever melhor a sua funcionalidade. O nome anterior estava gerando confusão quando a cor de entrada já tinha um valor alfa. O utilitário sobrescreve o valor alfa da cor.
- import { fade } from '@material-ui/core/styles';
+ import { alpha } from '@material-ui/core/styles';
const classes = makeStyles(theme => ({
- backgroundColor: fade(theme.palette.primary.main, theme.palette.action.selectedOpacity),
+ backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity),
}));
Sistema
- The following system functions (and properties) were renamed, because they are considered deprecated CSS:
gridGap
togap
gridColumnGap
tocolumnGap
gridRowGap
torowGap
Componentes do core
As the core components use emotion as a styled engine, the props used by emotion are not intercepted. The prop as
in the following codesnippet will not be propagated to the SomeOtherComponent
.
<MuiComponent component={SomeOtherComponent} as="button" />
Uma barra de aplicativos proeminente.
- [AppBar] Remova z-index quando a posição for estática e relativa
Alerta
Mova o componente do lab para o core. O componente agora é estável.
-import Alert from '@material-ui/lab/Alert'; -import AlertTitle from '@material-ui/lab/AlertTitle'; +import Alert from '@material-ui/core/Alert'; +import AlertTitle from '@material-ui/core/AlertTitle';
Você pode usar o codemod
moved-lab-modules
para realizar uma migração automática.
Autocompletar
Mova o componente do lab para o core. O componente agora é estável.
-import Autocomplete from '@material-ui/lab/Autocomplete'; -import useAutocomplete from '@material-ui/lab/useAutocomplete'; +import Autocomplete from '@material-ui/core/Autocomplete'; +import useAutoComplete from '@material-ui/core/useAutocomplete';
Você pode usar o codemod
moved-lab-modules
para realizar uma migração automática.Remova a propriedade
debug
. Existem algumas alternativas mais simples:open={true}
, Chrome devtools "Emulate focused", ou React devtools prop setter.renderOption
deve agora retornar uma estrutura completa do DOM da opção. Isso torna as customizações mais fáceis. Você pode aplicar a alteração com:<Autocomplete - renderOption={(option, { selected }) => ( - <React. Fragment> + renderOption={(props, option, { selected }) => ( + <li {...props}> <Checkbox icon={icon} checkedIcon={checkedIcon} style={{ marginRight: 8 }} checked={selected} /> {option.title} - </React.
Renomeie a propriedade
closeIcon
comclearIcon
para evitar confusão.-<Autocomplete closeIcon={defaultClearIcon} /> +<Autocomplete clearIcon={defaultClearIcon} />
Avatar
Renomeie
circle
paracircular
por uma questão de consistência. Os valores possíveis devem ser adjetivos e não substantivos:-<Avatar variant="circle"> -<Avatar classes={{ circle: 'className' }}> +<Avatar variant="circular"> +<Avatar classes={{ circular: 'className' }}>
Mova o componente AvatarGroup do lab para o core.
-import AvatarGroup from '@material-ui/lab/AvatarGroup'; +import AvatarGroup from '@material-ui/core/AvatarGroup';
Badge
Renomeie
circle
paracircular
erectangle
pararectangular
por uma questão de consistência. Os valores possíveis devem ser adjetivos e não substantivos:-<Badge overlap="circle"> -<Badge overlap="rectangle"> +<Badge overlap="circular"> +<Badge overlap="rectangular"> <Badge classes={{ - anchorOriginTopRightRectangle: 'className' - anchorOriginBottomRightRectangle: 'className' - anchorOriginTopLeftRectangle: 'className' - anchorOriginBottomLeftRectangle: 'className' - anchorOriginTopRightCircle: 'className' - anchorOriginBottomRightCircle: 'className' - anchorOriginTopLeftCircle: 'className' + anchorOriginTopRightRectangular: 'className' + anchorOriginBottomRightRectangular: 'className' + anchorOriginTopLeftRectangular: 'className' + anchorOriginBottomLeftRectangular: 'className' + anchorOriginTopRightCircular: 'className' + anchorOriginBottomRightCircular: 'className' + anchorOriginTopLeftCircular: 'className' }}>
BottomNavigation
TypeScript: The
event
inonChange
is no longer typed as aReact. ChangeEvent
butReact. SyntheticEvent
.-<BottomNavigation onChange={(event: React. ChangeEvent<{}>) => {}} /> +<BottomNavigation onChange={(event: React. SyntheticEvent) => {}} />
Box
As propriedades de sistema foram descontinuadas na v5, e substituídas pela propriedade
sx
.-<Box border="1px dashed grey" p={[2, 3, 4]} m={2}> +<Box sx={{ border: "1px dashed grey", p: [2, 3, 4], m: 2 }}>
Este codemod atualizará automaticamente seu código para a nova sintaxe. You can read this section for the why behind the change of API.
O valor de transformação da propriedade de sistema
borderRadius
foi alterado. Se ele receber um número, ele multiplica esse valor pelo valor detheme.shape.borderRadius
. Use uma string para fornecer um valor explícito, empx
.-<Box sx={{ borderRadius: 'borderRadius' }}> +<Box sx={{ borderRadius: 1 }}>
-<Box sx={{ borderRadius: 16 }}> +<Box sx={{ borderRadius: '16px' }}>
The following properties were renamed, because they are considered deprecated CSS proeprties:
gridGap
togap
gridColumnGap
tocolumnGap
gridRowGap
torowGap
-<Box gridGap="10px">
+<Box sx={{ gap: '10px' }}>
-<Box gridColumnGap="10px" gridRowGap="20px">
+<Box sx={{ columnGap: '10px', rowGap: '20px' }}>
Button
A propriedade
color
do botão agora é "primary" por padrão, e "default" foi removido. Isto torna o botão mais próximo da especificação do Material Design e simplifica a API.-<Button color="primary" /> -<Button color="default" /> +<Button /> +<Button />
Chip
- Renomeie a variante
default
parafilled
por uma questão de consistência.-<Chip variant="default"> +<Chip variant="filled">
Conjunto de progressos
A variante
static
foi mesclada na variantedeterminate
, assumindo a última a aparência da primeira. A variante removida raramente foi útil. Era uma exceção para Material Design, e foi removida da especificação.-<CircularProgress variant="determinate" />
-<CircularProgress variant="static" classes={{ static: 'className' }} /> +<CircularProgress variant="determinate" classes={{ determinate: 'className' }} />
NB: Se você já tinha customizado como "determinate", suas customizações provavelmente não são mais válidas. Por favor, remova-as.
Collapse
A propriedade
collapsedHeight
foi renomeada paracollapsedSize
para dar suporte para a direção horizontal.-<Collapse collapsedHeight={40}> +<Collapse collapsedSize={40}>
A chave
classes.container
foi alterada para corresponder à convenção dos outros componentes.-<Collapse classes={{ container: 'collapse' }}> +<Collapse classes={{ root: 'collapse' }}>
CssBaseline
The component was migrated to use the
@material-ui/styled-engine
(emotion
orstyled-components
) instead ofjss
. You should remove the@global
key when defining the style overrides for it.const theme = createMuiTheme({ components: { MuiCssBaseline: { styleOverrides: { - '@global': { html: { WebkitFontSmoothing: 'auto', }, - }, }, }, }, });
The
body
font size has changed fromtheme.typography.body2
(0.875rem
) totheme.typography.body1
(1rem
). To return to the previous size, you can override it in the theme:const theme = createMuiTheme({ typography: { body1: { fontSize: '0.875rem', }, }, });
(Note that this will also affect use of the Typography component with the default
body1
variant).
Dialog
As propriedades de transição onE* foram removidas. Em vez disso, use TransitionProps.
<Dialog - onEnter={onEnter} - onEntered={onEntered}, - onEntering={onEntered}, - onExit={onEntered}, - onExited={onEntered}, - onExiting={onEntered} + TransitionProps={{ + onEnter, + onEntered, + onEntering, + onExit, + onExited, + onExiting, + }} />
Remova a propriedade
disableBackdropClick
devido a redundância. Em vez disso, ignore eventos de close emonClose
quandoreason === 'backdropClick'
.<Dialog - disableBackdropClick - onClose={handleClose} + onClose={(event, reason) => { + if (reason !== 'backdropClick') { + onClose(event, reason); + } + }} />
[withMobileDialog] Remova este componente de ordem superior. A hook API permite uma solução mais simples e flexível:
-import withMobileDialog from '@material-ui/core/withMobileDialog'; +import { useTheme, useMediaQuery } from '@material-ui/core'; function ResponsiveDialog(props) { - const { fullScreen } = props; + const theme = useTheme(); + const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); const [open, setOpen] = React.useState(false); // ... -export default withMobileDialog()(ResponsiveDialog); +export default ResponsiveDialog;
Divider
Use cor de borda em vez de cor de fundo. Ela impede a altura inconsistente em telas redimensionadas. Para pessoas personalizando a cor da borda, a alteração requer alterar a propriedade CSS com sobrescrita:
. MuiDivider-root { - background-color: #f00; + border-color: #f00; }
Painel de expansão
Renomeie os componentes
ExpansionPanel
paraAccordion
para usar uma convenção de nome mais comum:-import ExpansionPanel from '@material-ui/core/ExpansionPanel'; -import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; -import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; -import ExpansionPanelActions from '@material-ui/core/ExpansionPanelActions'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import AccordionActions from '@material-ui/core/AccordionActions'; -<ExpansionPanel> +<Accordion> - <ExpansionPanelSummary> + <AccordionSummary> <Typography>Location</Typography> <Typography>Select trip destination</Typography> - </ExpansionPanelSummary> + </AccordionSummary> - <ExpansionPanelDetails> + <AccordionDetails> <Chip label="Barbados" onDelete={() => {}} /> <Typography variant="caption">Select your destination of choice</Typography> - </ExpansionPanelDetails> + </AccordionDetails> <Divider /> - <ExpansionPanelActions> + <AccordionActions> <Button size="small">Cancel</Button> <Button size="small">Save</Button> - </ExpansionPanelActions> + </AccordionActions> -</ExpansionPanel> +</Accordion>
TypeScript: The
event
inonChange
is no longer typed as aReact. ChangeEvent
butReact. SyntheticEvent
.-<Accordion onChange={(event: React. ChangeEvent<{}>, expanded: boolean) => {}} /> +<Accordion onChange={(event: React. SyntheticEvent, expanded: boolean) => {}} />
Renomeie
focused
parafocusVisible
por uma questão de consistência:<Accordion classes={{ - focused: 'custom-focus-visible-classname', + focusVisible: 'custom-focus-visible-classname', }} />
Remova
display: flex
de AccordionDetails, é muito opinativo. A maioria dos desenvolvedores espera uma exibição em bloco.Remova a propriedade
IconButtonProps
de AccordionSummary. O componente renderiza um elemento<div>
em vez de um IconButton. A propriedade não é mais necessária.
Fab
Renomeie
round
paracircular
por uma questão de consistência. Os valores possíveis devem ser adjetivos e não substantivos:-<Fab variant="round"> +<Fab variant="circular">
Grid
Renomeie a propriedade
justify
parajustifyContent
para ter conformidade com o nome da propriedade CSS.-<Grid justify="center"> +<Grid justifyContent="center">
GridList
Renomeie os componentes
GridList
paraImageList
para entrar em conformidade com o nome atual do componente no Material Design.Renomeie no GridList a propriedade
spacing
paragap
para ter conformidade com o atributo CSS.Renomeie no GridList a propriedade
cellHeight
pararowHieght
.Adicione a propriedade
variant
para o GridList.Renomeie no GridListItemBar a propriedade
actionPosition
paraposition
. (Observe também as alterações de nome de classe relacionadas.)Use CSS object-fit. For IE11 support either use a polyfill such as https://www.npmjs.com/package/object-fit-images, or continue to use the v4 component.
-import GridList from '@material-ui/core/GridList'; -import GridListTile from '@material-ui/core/GridListTile'; -import GridListTileBar from '@material-ui/core/GridListTileBar'; +import ImageList from '@material-ui/core/ImageList'; +import ImageListItem from '@material-ui/core/ImageListItem'; +import ImageListItemBar from '@material-ui/core/ImageListItemBar'; -<GridList spacing={8} cellHeight={200}> - <GridListTile> +<ImageList gap={8} rowHeight={200}> + <ImageListItem> <img src="file.jpg" alt="Image title" /> - <GridListTileBar + <ImageListItemBar title="Title" subtitle="Subtitle" /> - </GridListTile> -</GridList> + </ImageListItem> +</ImageList>
Icon
The default value of
fontSize
was changed fromdefault
tomedium
for consistency. In the unlikey event that you were using the valuedefault
, the prop can be removed:-<Icon fontSize="default">icon-name</Icon> +<Icon>icon-name</Icon>
Menu
As propriedades de transição onE* foram removidas. Em vez disso, use TransitionProps.
<Menu - onEnter={onEnter} - onEntered={onEntered}, - onEntering={onEntered}, - onExit={onEntered}, - onExited={onEntered}, - onExiting={onEntered} + TransitionProps={{ + onEnter, + onEntered, + onEntering, + onExit, + onExited, + onExiting, + }} >
Modal
Remova a propriedade
disableBackdropClick
devido a redundância. Em vez disso, ignore eventos de close emonClose
quandoreason === 'backdropClick'
.<Modal - disableBackdropClick - onClose={handleClose} + onClose={(event, reason) => { + if (reason !== 'backdropClick') { + onClose(event, reason); + } + }} />
Remova a propriedade
onEscapeKeyDown
devido a redundância. Em vez disso, useonClose
comreason === "escapeKeyDown"
.<Modal - onEscapeKeyDown={handleEscapeKeyDown} + onClose={(event, reason) => { + if (reason === 'escapeKeyDown') { + handleEscapeKeyDown(event); + } + }} />
Remova a propriedade
onRendered
. Dependendo da sua situação de uso, use um ref com callback no elemento filho ou um hook de efeito no componente filho.
Paginação
Mova o componente do lab para o core. O componente agora é estável.
-import Pagination from '@material-ui/lab/Pagination'; -import PaginationItem from '@material-ui/lab/PaginationItem'; -import { usePagination } from '@material-ui/lab/Pagination'; +import Pagination from '@material-ui/core/Pagination'; +import PaginationItem from '@material-ui/core/PaginationItem'; +import usePagination from '@material-ui/core/usePagination';
Você pode usar o codemod
moved-lab-modules
para realizar uma migração automática.Renomeie
round
paracircular
por uma questão de consistência. Os valores possíveis devem ser adjetivos e não substantivos:-<Pagination shape="round"> -<PaginationItem shape="round"> +<Pagination shape="circular"> +<PaginationItem shape="circular">
Popover
As propriedades de transição onE* foram removidas. Em vez disso, use TransitionProps.
<Popover - onEnter={onEnter} - onEntered={onEntered}, - onEntering={onEntered}, - onExit={onEntered}, - onExited={onEntered}, - onExiting={onEntered} + TransitionProps={{ + onEnter, + onEntered, + onEntering, + onExit, + onExited, + onExiting, + }} />
Popper
Atualize Popper.js da v1 para v2. Esta biblioteca de terceiros introduziu muitas mudanças.
Você pode ler seu guia de migração ou o seguinte resumo:Os prefixos CSS mudaram:
popper: { zIndex: 1, - '&[x-placement*="bottom"] $arrow': { + '&[data-popper-placement*="bottom"] $arrow': {
Nomes de métodos alterados.
-popperRef.current.scheduleUpdate() +popperRef.current.update()
-popperRef.current.update() +popperRef.current.forceUpdate()
A API dos modificadores mudou muito. Há demasiadas alterações para serem cobertas neste guia.
Portal
- Remova a propriedade
onRendered
. Dependendo da sua situação de uso, use um ref com callback no elemento filho ou um hook de efeito no componente filho.
Rating
Mova o componente do lab para o core. O componente agora é estável.
-import Rating from '@material-ui/lab/Rating'; +import Rating from '@material-ui/core/Rating';
Você pode usar o codemod
moved-lab-modules
para realizar uma migração automática.Altere o ícone padrão de vazio para melhorar a acessibilidade. Se você tiver uma propriedade
icon
customizada e não a propriedadeemptyIcon
, você pode reproduzir o comportamento anterior com:<Rating icon={customIcon} + emptyIcon={null} />
Renomeie
visuallyhidden
paravisuallyHidden
por uma questão de consistência:<Rating classes={{ - visuallyhidden: 'custom-visually-hidden-classname', + visuallyHidden: 'custom-visually-hidden-classname', }} />
RootRef
Este componente foi removido. Você pode obter uma referência para o nó DOM subjacente dos nossos componentes através da propriedade
ref
. The component relied onReactDOM.findDOMNode
which isdeprecated in `React.-<RootRef rootRef={ref}> - <Button /> -</RootRef> +<Button ref={ref} />
Skeleton
Mova o componente do lab para o core. O componente agora é estável.
-import Skeleton from '@material-ui/lab/Skeleton'; +import Skeleton from '@material-ui/core/Skeleton';
Você pode usar o codemod
moved-lab-modules
para realizar uma migração automática.Renomeie
circle
paracircular
erect
pararectangular
por uma questão de consistência. Os valores possíveis devem ser adjetivos e não substantivos:-<Skeleton variant="circle" /> -<Skeleton variant="rect" /> -<Skeleton classes={{ circle: 'custom-circle-classname', rect: 'custom-rect-classname', }} /> +<Skeleton variant="circular" /> +<Skeleton variant="rectangular" /> +<Skeleton classes={{ circular: 'custom-circle-classname', rectangular: 'custom-rect-classname', }} />
Slider
TypeScript: The
event
inonChange
is no longer typed as aReact. ChangeEvent
butReact. SyntheticEvent
.-<Slider onChange={(event: React. ChangeEvent<{}>, value: unknown) => {}} /> +<Slider onChange={(event: React. SyntheticEvent, value: unknown) => {}} />
A propriedade
ValueLabelComponent
agora faz parte da propriedadecomponents
.-<Slider ValueLabelComponent={CustomValueLabel} /> +<Slider components={{ ValueLabel: CustomValueLabel }} />
A propriedade
ThumbComponent
agora faz parte da propriedadecomponents
.-<Slider ThumbComponent={CustomThumb} /> +<Slider components={{ Thumb: CustomThumb }} />
Snackbar
A notificação agora é exibida na parte inferior esquerda em telas grandes. This better matches the behavior of Gmail, Google Keep, material.io, etc. You can restore the previous behavior with: Você pode reproduzir o comportamento anterior com: Você pode reproduzir o comportamento anterior com:
-<Snackbar /> +<Snackbar anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} />
As propriedades de transição onE* foram removidas. Em vez disso, use TransitionProps.
<Snackbar - onEnter={onEnter} - onEntered={onEntered}, - onEntering={onEntered}, - onExit={onEntered}, - onExited={onEntered}, - onExiting={onEntered} + TransitionProps={{ + onEnter, + onEntered, + onEntering, + onExit, + onExited, + onExiting, + }} />
SpeedDial
Mova o componente do lab para o core. O componente agora é estável.
-import SpeedDial from '@material-ui/lab/SpeedDial'; -import SpeedDialAction from '@material-ui/lab/SpeedDialAction'; -import SpeedDialIcon from '@material-ui/lab/SpeedDialIcon'; +import SpeedDial from '@material-ui/core/SpeedDial'; +import SpeedDialAction from '@material-ui/core/SpeedDialAction'; +import SpeedDialIcon from '@material-ui/core/SpeedDialIcon';
Você pode usar o codemod
moved-lab-modules
para realizar uma migração automática.
Assistente
O componente raiz (Paper) foi substituído por um div. Stepper não tem mais elevação, nem herda as propriedades de Paper. Esta alteração destina-se a incentivar a composição.
-<Stepper elevation={2}> - <Step> - <StepLabel>Hello world</StepLabel> - </Step> -</Stepper> +<Paper square elevation={2}> + <Stepper> + <Step> + <StepLabel>Hello world</StepLabel> + </Step> + </Stepper> +<Paper>
Remova o padding automático de 24px.
-<Stepper> - <Step> - <StepLabel>Hello world</StepLabel> - </Step> -</Stepper> +<Stepper style={{ padding: 24 }}> + <Step> + <StepLabel>Hello world</StepLabel> + </Step> +</Stepper>
SvgIcon
The default value of
fontSize
was changed fromdefault
tomedium
for consistency. In the unlikey event that you were using the valuedefault
, the prop can be removed:-<SvgIcon fontSize="default"> +<SvgIcon> <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" /> </SvgIcon>
Table
A customização dos rótulos das ações da paginação da tabela deve ser feita com a propriedade
getItemAriaLabel
. Isso aumenta a consistência com o componentePaginação
.<TablePagination - backIconButtonText="Avant" - nextIconButtonText="Après + getItemAriaLabel={…}
Renomeie
onChangeRowsPerPage
paraonRowsPerPageChange
eonChangePage
paraonPageChange
por questões de consistência da API.<TablePagination - onChangeRowsPerPage={()=>{}} - onChangePage={()=>{}} + onRowsPerPageChange={()=>{}} + onPageChange={()=>{}}
Abas
TypeScript: The
event
inonChange
is no longer typed as aReact. ChangeEvent
butReact. SyntheticEvent
.-<Tabs onChange={(event: React. ChangeEvent<{}>, value: unknown) => {}} /> +<Tabs onChange={(event: React. SyntheticEvent, value: unknown) => {}} />
A API que controla os botões de rolagem foi dividida em duas propriedades.
- A propriedade
scrollButtons
controla quando os botões de rolagem são exibidos dependendo do espaço disponível. - A propriedade
allowScrollButtonsMobile
remove a consulta de mídia CSS que oculta sistematicamente os botões de rolagem no celular.
-<Tabs scrollButtons="on" /> -<Tabs scrollButtons="desktop" /> -<Tabs scrollButtons="off" /> +<Tabs scrollButtons allowScrollButtonsMobile /> +<Tabs scrollButtons /> +<Tabs scrollButtons={false} />
- A propriedade
TextField
Altere a variante padrão de
standard
paraoutlined
. O padrão foi removido da Diretrizes do Material Design.-<TextField value="Standard" /> -<TextField value="Outlined" variant="outlined" /> +<TextField value="Standard" variant="standard" /> +<TextField value="Outlined" />
Você pode usar o codemod moved-lab-modules
para realizar uma migração automática.
Renomeie a propriedade
rowsMax
paramaxRows
por questão de consistência com atributos HTML.-<TextField rowsMax={6}> +<TextField maxRows={6}>
Melhor isolar o comportamento fixo de altura do textarea para o dinâmico. Você precisa usar a propriedade
minRows
da seguinte forma:-<TextField rows={2} maxRows={5} /> +<TextField minRows={2} maxRows={5} />
Altere o que é esperado no encaminhamento de ref no componente customizado
inputComponent
. O componente deve encaminhar a propriedaderef
em vez da propriedadeinputRef
.-function NumberFormatCustom(props) { - const { inputRef, onChange, ...other } = props; +const NumberFormatCustom = React.forwardRef(function NumberFormatCustom( + props, + ref, +) { const { onChange, ...other } = props; return ( <NumberFormat {...other} - getInputRef={inputRef} + getInputRef={ref}
Renomeie as classes
marginDense
einputMarginDense
parasizeSmall
einputSizeSmall
para corresponder com a propriedade.-<Input margin="dense" /> +<Input size="small" />
TextareaAutosize
Remova a propriedade
rows
, useminRows
em vez disso. Esta alteração visa esclarecer o comportamento da propriedade.-<TextareaAutosize rows={2} /> +<TextareaAutosize minRows={2} />
Renomeie a propriedade
rowsMax
paramaxRows
por questão de consistência com atributos HTML.-<TextareAutosize rowsMax={6}> +<TextareAutosize maxRows={6}>
Renomeie a propriedade
rowsMin
paraminRows
por questão de consistência com atributos HTML.-<TextareAutosize rowsMin={1}> +<TextareAutosize minRows={1}>
ToggleButton
Mova o componente do lab para o core. O componente agora é estável.
-import ToggleButton from '@material-ui/lab/ToggleButton'; -import ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup'; +import ToggleButton from '@material-ui/core/ToggleButton'; +import ToggleButtonGroup from '@material-ui/core/ToggleButtonGroup';
Você pode usar o codemod
moved-lab-modules
para realizar uma migração automática.
Tooltip
Dicas agora estão interativas por padrão.
O comportamento padrão anterior era falho, como mostra neste artigo, success criterion 1.4.3 ("hoverable") in WCAG 2.1. Para refletir o novo valor padrão, a propriedade foi renomeada para
disableInteractive
. Se você quiser reproduzir o comportamento antigo (portanto não chegando ao nível AA), você pode aplicar a seguinte alteração:-<Tooltip> +<Tooltip disableInteractive> #Dicas interativas não precisam mais da propriedade `interactive`. -<Tooltip interactive> +<Tooltip>
Tipografia
Substitua a propriedade
srOnly
para não duplicar as capacidades do Sistema:-import Typography from '@material-ui/core/Typography'; +import { visuallyHidden } from '@material-ui/system'; +import styled from 'styled-component'; +const Span = styled('span')(visuallyHidden); -<Typography variant="srOnly">Create a user</Typography> +<Span>Create a user</Span>
Sistema
- Substitua a propriedade
css
parasx
para evitar a colisão com as propriedades CSS de styled-components & emotion.
-<Box css={{ color: 'primary.main' }} />
+<Box sx={{ color: 'primary.main' }} />