Createrisk.jsx
Tablepage.jsx
问题是tablepage仅呈现createrisk的属性,这些属性不取决于用户输入,即ID和测试属性。我相信这是有道理的,首先渲染与输入相关的属性是空的。我如何将表页组件重新渲染?理想情况下,与createrisk上的这一事件相关:
<button onClick={handleSubmission}>Store my data</button>
Createrisk.jsx
:
function Createrisk() {
function handleSubmission() {
var risks = JSON.parse(localStorage.getItem("allrisks"));
if (risks == null) {
risks = [];
}
let riskitem = {
riskname: document.getElementById("rname").value,
riskdesc: document.getElementById("rdesc").value,
riskimpact: document.getElementById("rimpact").value,
test: "test",
};
risks.push(riskitem);
let i = 1;
risks.map((n) => {
n["id"] = i;
i++;
});
localStorage.setItem("allrisks", JSON.stringify(risks));
}
return (
<div>
<input type="text" id="rname" placeholder="Risk Name" />
<input type="text" id="rdesc" placeholder="Risk Description" />
<input type="text" id="rimpact" placeholder="Risk Impact" />
<button onClick={handleSubmission}>Store my data</button>
</div>
);
}
export default Createrisk;
Tablepage.jsx
:
function Tablepage() {
const risksfromstorage = JSON.parse(localStorage.getItem("allrisks"));
const columns = [
{ field: "id", headerName: "ID", width: 350 },
{ field: "rname", headerName: "Risk Name", width: 350 },
{ field: "rdesc", headerName: "Risk Desc", width: 350 },
{ field: "rimpact", headerName: "Risk Impact", width: 350 },
{ field: "test", headerName: "test", width: 350 },
];
const rows = risksfromstorage.map((row) => ({
id: row.id,
rname: row.rname,
rdesc: row.rdesc,
rimpact: row.rimpact,
test: row.test,
}));
return (
<div>
<DataGrid getRowId={(row) => row.id} columns={columns} rows={rows} />
</div>
);
}
export default Tablepage;
可以看到,阵列/对象会添加到localstorage。仅在表(ID&TEST)中填充了非输入属性
IMG展示表和localstorage
看来,存储在localstorage中的数据值是您的真实源。与其尝试直接与localstorage合作,不如在共同祖先组件中创建一个状态,该状态是从localstorage初始化的,并将状态传递给了这两个组件。
示例:createrisk.jsxconst CommonAncestor = () => {
// Lazy initialize state from localStorage
const [allRisks, setAllRisks] = React.useState(() => {
return JSON.parse(localStorage.getItem("allrisks")) || [];
});
// Side-effect to persist state to localStorage
React.useEffect(() => {
localStorage.setItem("allrisks", JSON.stringify(allRisks));
}, [allRisks]);
// Handler to update state
const addRisk = (risk) => {
setAllRisks(allRisks => allRisks.concat(risk));
};
return (
<>
...
<CreateRisk addRisk={addRisk} />
...
<TablePage rows={allRisks} />
...
</>
);
};
tablepage.jsx
import { nanoid } from 'nanoid';
function CreateRisk({ addRisk }) {
function handleSubmission() {
addRisk({
id: nanoid(),
riskname: document.getElementById("rname").value,
riskdesc: document.getElementById("rdesc").value,
riskimpact: document.getElementById("rimpact").value,
test: "test",
});
}
return (
<div>
<input type="text" id="rname" placeholder="Risk Name" />
<input type="text" id="rdesc" placeholder="Risk Description" />
<input type="text" id="rimpact" placeholder="Risk Impact" />
<button onClick={handleSubmission}>Store my data</button>
</div>
);
}