редукция рендеринга слишком много раз

линия после двух красных точек (🔴🔴) показывает проблему, с которой я столкнулся, а именно слишком много визуализаций, когда я использую redux, иногда я получал одно и то же два или три раза, что может сбить с толку мой код. Также обратите внимание, когда я использую ту же функцию с setState, компонент не перерисовывается много раз, проблема возникает только тогда, когда я вызываю props.dispatch в index.tsx вы найдете шаблон redux, во втором файле я подключаю redux и использую props.open (который мне нужен) и найдете два props.dispatch()s

      // index.tsx
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { Provider } from "react-redux";
import { createStore } from "redux";
const initialState: any = {
  open: false,
  new: false,
};
function reducer(state = initialState, action: any) {
  switch (action.type) {
    case "OPEN":
      return {
        open: true,
      };
    case "CLOSE":
      return {
        open: false,
      };
    default:
      return state;
  }
}
const store = createStore(reducer);

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);

      import React from "react";
import Button from "@material-ui/core/Button";
import Dialog from "@material-ui/core/Dialog";
import DialogActions from "@material-ui/core/DialogActions";
import DialogContent from "@material-ui/core/DialogContent";
import DialogContentText from "@material-ui/core/DialogContentText";
import DialogTitle from "@material-ui/core/DialogTitle";
import Paper, { PaperProps } from "@material-ui/core/Paper";
import Draggable from "react-draggable";
import Alert from "@material-ui/lab/Alert";
import lookup from "../api/api";
import DeleteIcon from "@material-ui/icons/Delete";
import { connect } from "react-redux";

function PaperComponent(props: PaperProps) {
  return (
    <Draggable
      handle="#draggable-dialog-title"
      cancel={'[class*="MuiDialogContent-root"]'}
    >
      <Paper {...props} />
    </Draggable>
  );
}

function Delete(props: any, { PostId, setData }: any) {
  // const open = props.open;
// don't care about this, I entend to delete it after redux work proberlly
  const [open, setOpen] = React.useState(false);
  console.log(open);

  const handleClickOpen = () => {
    // TODO handle click frmo ButtonsGroup with redux
    setOpen(true);
    // console.log("______ handleClickOpen");
    // 🔴🔴 when uncomment the following  line the opove console.log(open); will be rendered 2 or 3 times
    // props.dispatch({ type: "OPEN" });
  };

  const handleClose = () => {
    setOpen(false);
    // props.dispatch({ type: "CLOSE" });
  };
  const callback = (response: any, status: number) => {
    console.log(response);
  };
  return (
    <div>
      <DeleteIcon onClick={handleClickOpen} style={{ color: "red" }} />
      <Dialog
        open={open}
        onClose={handleClose}
        PaperComponent={PaperComponent}
        aria-labelledby="draggable-dialog-title"
      >
        <DialogTitle style={{ cursor: "move" }} id="draggable-dialog-title">
          <Alert severity="warning">
            Are you sure wnat want to delte this post?
            <Button autoFocus onClick={handleClose} color="primary">
              No
            </Button>
            <Button
              onClick={() => {
                handleClose();
                console.log(PostId);
                lookup("DELETE", `api/post/${PostId}/`, callback);
                setData((pre: any) => {

                  pre.filter((item: any) => item.id !== PostId);
                });
              }}
              color="primary"
            >
              Yes
            </Button>
          </Alert>
        </DialogTitle>
      </Dialog>
    </div>
  );
}

function mapStateToProps(state: any) {
  return {
    open: state.open,
  };
}

export default connect(mapStateToProps)(Delete);

0 ответов

Другие вопросы по тегам