редукция рендеринга слишком много раз
линия после двух красных точек (🔴🔴) показывает проблему, с которой я столкнулся, а именно слишком много визуализаций, когда я использую 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);