material-ui Drawer - findDOMNode устарел в StrictMode

У меня есть простое приложение ReactJS на основе хуков (без классов) с использованием StrictMode.

Я использую React версии 16.13.1 и Material-UI версии 4.9.10.

На панели приложений я использую Drawer.

    <div className={classes.root}>
        <AppBar position="static">
            <Toolbar>
                <IconButton
                    edge="start"
                    className={classes.menuButton}
                    color="inherit"
                    aria-label="menu"
                    onClick={handleDrawerOpen}>
                    <MenuIcon />
                </IconButton>
                <Typography variant="h6" className={classes.title}>
                    Online Information
                </Typography>
            </Toolbar>
        </AppBar>
        <Drawer
            variant="persistent"
            anchor="left"
            open={open}
        ></Drawer>
    </div>

Я замечаю, что когда открываю ящик, я получаю следующее предупреждение.

Warning: findDOMNode is deprecated in StrictMode. findDOMNode was passed an instance 
of 
Transition which is inside StrictMode. Instead, add a ref directly to the element you 
want to reference. Learn more about using refs safely ....
in div (created by Transition)
in Transition (created by ForwardRef(Fade))
in ForwardRef(Fade) (created by ForwardRef(Backdrop))
in ForwardRef(Backdrop) (created by WithStyles(ForwardRef(Backdrop)))
in WithStyles(ForwardRef(Backdrop)) (created by ForwardRef(Modal))
in div (created by ForwardRef(Modal))
in ForwardRef(Portal) (created by ForwardRef(Modal))
in ForwardRef(Modal) (created by ForwardRef(Drawer))
in ForwardRef(Drawer) (created by WithStyles(ForwardRef(Drawer)))

Я нашел в Интернете ссылку на эту проблему, но до сих пор не могу понять, как ее решить.

Может кто-нибудь добавить обходной путь для этой проблемы?

Спасибо


comment
Сообщите о проблеме с Material-UI. Или создайте вилку репо, исправьте ее, создайте PR, используйте вилку, пока PR не будет объединен или проблема не станет устаревшей. Пока это просто предупреждение в стороннем коде.   -  person Drew Reese    schedule 15.04.2020
comment
Вот проблема, в которой это обсуждается: github.com/mui-org/material-ui / issues / 13394   -  person Ryan Cogswell    schedule 15.04.2020
comment
Спасибо за ссылку   -  person angus    schedule 16.04.2020
comment
Также обратите внимание, что StrictMode включен по умолчанию при использовании ReactDOM.createRoot и / или React.ConcurrentMode .. здесь есть несколько хороших обсуждений: github.com/styled-components/styled-components/issues/2154   -  person Mahdi Abdi    schedule 18.05.2020
comment
Я также получаю эту ошибку, когда использую компонент Tooltip и передаю пользовательский компонент в title props вместо передачи простой строки !!!   -  person Alireza Kavian    schedule 31.01.2021


Ответы (6)


Ага, это раздражает. Команда Material UI не успевает за разработчиками React. А пока просто удалите тег строгого режима. К сожалению, именно это происходит с передовыми технологиями.

person Manny Alvarado    schedule 10.05.2020
comment
Я думаю, это не должно быть решением. StrictMode очень полезен по-разному - person landorid; 18.09.2020
comment
Вы можете использовать экспериментальный создатель темы, если не хотите отключать строгий режим. см. мой ответ ниже - person yuval.bl; 30.09.2020

Согласно журналу изменений Material-ui, это должно быть решено в V5, который все еще находится в альфа-версии.

Похоже, что по крайней мере в некоторых случаях эта проблема вызвана createMuiTheme. Решить эту проблему можно с помощью экспериментального (нестабильного) создателя тем.

Если вы хотите получить экспериментальный создатель темы вместо удаления React.StrictMode, вы можете изменить его импорт из:

import { createMuiTheme } from '@material-ui/core';

To

import { unstable_createMuiStrictModeTheme as createMuiTheme } from '@material-ui/core';

person yuval.bl    schedule 30.09.2020
comment
Это должен быть принятый ответ. Я не хочу удалять StrictMode и отказываться от всех его преимуществ только потому, что material-ui медленно обновляется. - person NearHuscarl; 22.10.2020
comment
Я понимаю, почему это не будет принятый ответ, потому что он ссылается на нестабильную функцию. Для моего варианта использования эта нестабильная функция выглядит достаточно стабильной и выполняет свою работу, поэтому я могу сосредоточиться на реальных предупреждениях без шума. - person TheDiveO; 12.11.2020
comment
Спасибо, что поделились правильным решением. - person Martin Najjar; 09.02.2021
comment
Мы не помогаем сообществу, не принимая это как ответ, потому что Google придает приоритет индексации принятым ответам. Это был не первый результат поиска, и он действительно должен быть таким. - person Reactgular; 22.02.2021
comment
это должен быть правильный ответ. Благодарность - person Chrisk8er; 28.02.2021
comment
Не могли бы вы помочь мне понять, как использовать unstable_createMuiStrictModeTheme для решения проблемы? В моем коде я просто использую стандартный интерфейс материалов Dialog и нигде не упоминаю и не использую createMUITheme, поэтому я не знаю, как применить это решение. - person Picci; 08.03.2021
comment
@Picci проверьте раздел curstomization: material-ui.com/customization/theming - person Jeffrey Nicholson Carré; 15.03.2021
comment
@ Джеффри Николсон Карре Спасибо, это было подходящее место. const theme = unstable_createMuiStrictModeTheme(); создает тему, а <ThemeProvider theme={theme}> - способ ее использования. Я добавил его в верхний компонент приложения. - person Picci; 16.03.2021
comment
@Picci и @Jeffrey Nicholson Carré, импорт (import { ThemeProvider } from '@material-ui/core/styles';) необходим для использования ThemeProvider таким образом. Этот подход пока работает для меня, и я согласен, что это должен быть принятый ответ. - person Tom Stambaugh; 29.03.2021
comment
Предупреждение. При использовании этого решения с material-ui / core 4.11.3 и компонентом Snackbar вы получите следующее исключение: Error: Uncaught Error: TypeError: Cannot read property 'scrollTop' of null - person Ogglas; 01.04.2021
comment
Это должен быть принятый ответ - person Pavan Jadda; 09.06.2021

Это предупреждение StrictMode.

Проверки в строгом режиме выполняются только в режиме разработки; они не влияют на производственную сборку.

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

to

ReactDOM.render(
    <App />,
  document.getElementById('root')
);
person Lashan Fernando    schedule 02.05.2020
comment
Это не связано с производством. Это произошло во время разработки. - person angus; 04.05.2020
comment
вы можете пропустить ‹React.Fragment› и просто отобразить ‹App /› - person ynotu.; 07.05.2020

измените конфигурацию вашей темы

import { createMuiTheme } from '@material-ui/core';

to

import { unstable_createMuiStrictModeTheme as createMuiTheme } from '@material-ui/core';

Создает тему, которая уменьшает количество предупреждений внутри React.StrictMode, например Предупреждение: findDOMNode устарел в StrictMode.

ВНИМАНИЕ! Не используйте этот метод в производственной среде.

для производства используйте import { createMuiTheme } from '@material-ui/core'; и замените StrictMode на Fragment.

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

to

ReactDOM.render(
  <React.Fragment>
    <App />
  </React.Fragment>,
  document.getElementById('root')
);
person SaimumIslam27    schedule 15.06.2021

Это предупреждение связано с компонентом Transition, который используется во многих компонентах пользовательского интерфейса материалов, таких как Drawer, Tooltip, Snackbar и т. Д.

Лично я встречал это предупреждение во всех из них, но исправил это только для компонента Snackbar.

Решение состоит в том, чтобы создать ссылку и передать ее в корневой компонент. Затем вручную перенаправьте ссылку на дочерние компоненты, использующие переход.

Вот код для компонента Snackbar, который устранил проблему для меня. Поскольку это всего лишь предупреждение, возможно, проигнорируйте его. Вам не нужно удалять StrictMode. Это будет исправлено в будущих выпусках material-ui.

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';

//MUI Stuff
import { makeStyles } from '@material-ui/core/styles';
import Snackbar from '@material-ui/core/Snackbar';
import MuiAlert from '@material-ui/lab/Alert';

// Redux
import { hideAlert } from '../../redux/actions/uiActions';
import Slide from '@material-ui/core/Slide';

const Alert = React.forwardRef((props, ref) => {
    return <MuiAlert ref={ref} elevation={6} variant="filled" {...props} />;
});

const SlideTransition = React.forwardRef((props, ref) => {
    return <Slide ref={ref} {...props} direction="left" />;
});

const useStyles = makeStyles((theme) => ({
    root: {
        flexGrow: 1,
    },
    snackbar: {
        [theme.breakpoints.down('sm')]: {
            bottom: 65,
        },
    },
}));

const SnackAlert = () => {
    const snackbarRef = React.createRef(null);
    const classes = useStyles();
    const { alert, alertType, alertMessage } = useSelector((state) => ({
        alert: state.ui.alert,
        alertType: state.ui.alertType,
        alertMessage: state.ui.alertMessage,
    }));
    const dispatch = useDispatch();
    const [open, setOpen] = React.useState(false);

    useEffect(() => {
        setOpen(alert);
    }, [alert]);

    const handleClose = () => {
        setOpen(false);
        dispatch(hideAlert());
    };

    return (
        <div className={classes.root}>
            <Snackbar
                ref={snackbarRef}
                className={classes.snackbar}
                open={open}
                anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
                autoHideDuration={5000}
                onClose={handleClose}
                message={alertMessage}
                TransitionComponent={SlideTransition}
            >
                <Alert onClose={handleClose} severity={alertType}>
                    {alertMessage}
                </Alert>
            </Snackbar>
        </div>
    );
};
export default SnackAlert;
person Animesh Jain    schedule 13.06.2021

Я столкнулся с той же ошибкой при попытке сделать выбор с помощью компонента React Material Select. Я нашел эту страницу в документации React, которая говорит о строгом режиме и ссылается на эту конкретную ошибку.

React StrictMode Эта ошибка упоминается в раздел:

Предупреждение об устаревшем использовании findDOMNode

Вот пример фрагмента, который показывает, как решить проблему. Похоже, нам нужно создать React Ref, а затем прикрепить эту ссылку к узлу DOM, который выдает ошибку.

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.wrapper = React.createRef();
  }
  render() {
    return <div ref={this.wrapper}>{this.props.children}</div>;
  }
}
person Paul    schedule 03.04.2021
comment
Как это будет работать для кода в вопросе? - person Juan David; 04.04.2021
comment
Пожалуйста, проверьте код перед тем, как публиковать ответы - person Awol; 23.04.2021