使用react-router-navigation-prompt时有关不建议使用的findDOMNode的警告

时间:2020-06-07 19:06:33

标签: javascript reactjs typescript react-router

当用户离开页面时,我正在使用react-router-navigation-prompt来显示模式窗口。它工作正常,但是更新我的依赖关系后,我不断收到此错误: findDOMNode

我尝试将ref转发给child组件,但是似乎没有用。这是我的代码:

import React from 'react';
import NavigationPrompt from 'react-router-navigation-prompt';
import { CancelChangesDialog } from './CancelChangesDialog';
import _ from 'lodash';

interface Props<T> {
  currentForm: T;
  initialForm: T;
}

export function LeavingPrompt<T>(props: Props<T>) {
  const { currentForm, initialForm } = props;

  return (
    <NavigationPrompt when={!_.isEqual(currentForm, initialForm)}>
      {({ onConfirm, onCancel }) => (
        <CancelChangesDialog
          open
          handleCancel={onCancel}
          handleConfirm={onConfirm}
        />
      )}
    </NavigationPrompt>
  );
}

CancelChangesDialog是模式视图组件:

import React from 'react';
import {
  Dialog,
  DialogTitle,
  DialogContent,
  DialogContentText,
  DialogActions,
  Button,
} from '@material-ui/core';

interface Props {
  open: boolean;
  handleCancel(): void;
  handleConfirm(): void;
}

export function CancelChangesDialog(props: Props) {
  const { open, handleCancel, handleConfirm } = props;

  return (
    <Dialog open={open}>
      <DialogTitle id="alert-dialog-title">{'Confirm changes'}</DialogTitle>
      <DialogContent>
        <DialogContentText id="alert-dialog-description">
          Changes are not saved! Leave anyway?
        </DialogContentText>
      </DialogContent>
      <DialogActions>
        <Button onClick={handleCancel} color="primary">
          Cancel
        </Button>
        <Button
          onClick={handleConfirm}
          color="primary"
          style={{ textTransform: 'initial' }}
          autoFocus
        >
          Confirm
        </Button>
      </DialogActions>
    </Dialog>
  );
}

任何想法如何解决此问题?

1 个答案:

答案 0 :(得分:1)

问题跟踪工具参考:https://github.com/mui-org/material-ui/issues/13394
有一些选项:

  1. 部分禁用严格模式:<Dialog disableStrictModeCompat>
  2. 已将其转换为在@ material-ui / core @ ^ 4.10的unstable theme中使用引用:
import { ThemeProvider } from "@material-ui/core/styles";
import { unstable_createMuiStrictModeTheme } from "@material-ui/core/styles";
const theme = unstable_createMuiStrictModeTheme();
<ThemeProvider theme={theme}>
<Dialog>...</Dialog>
</ThemeProvider>

注意:请阅读有关不稳定主题的文档。有局限性。

修复的Codesandbox演示: https://codesandbox.io/s/practical-gould-j7pqu

Reason:

在许多情况下,API允许用户传递自定义的根组件。如果这些组件不能正确转发其引用,我们仍然需要findDOMNode。