【发布时间】:2021-02-10 05:09:17
【问题描述】:
当我单击按钮触发删除时,我正在尝试删除 React 状态(ListItem 组件)。但是,在我将 React 从状态中删除后,它无法重新呈现。我该如何正确地做到这一点?
import {Button, List} from "@material-ui/core";
import React, {useLayoutEffect, useState} from "react";
import useRules from "../sharedStates/Rules";
import useLanguange from "../sharedStates/Languages";
import axios from "axios";
import ListItem from "@material-ui/core/ListItem";
const REFRESH_JWT_URL = "/auth/api/refresh_jwt/"
const BLOCKCHAIN_DELETE_URL = "blockchain/api/rule/?id="
const DATALAKE_REMOVE_URL = "datalake/api/remove_rule"
//TODO: Implement Translation.
//TODO: Implement Delete Rule.
const RuleList = ({
rules,
rerender,
userID,
groupIDs,
orgID,
jwtRefresh,
jwtAccess,
username
}) => {
const [_rules, _setRules] = useState(rules)
const editRule = () => {
console.log("Todo: Implement Edit Rule")
}
const removeRule = (ruleId) => {
console.log("TODO: IMPLEMENT DELETE RULE IN THE DB")
//TODO: Figure out the reason this is not working
// _setRules(_rules.filter(rule => rule.id !== ruleId));
}
return (
<List>
{
_rules.map((rule => (
<ListItem key={rule.id}>
<p> {lang.label.I} {" "} <b>{lang.label[rule.action]}</b> {lang.label.toAccessTags} </p>
<p> <b>
{
Object.values(rule.access).map(tag =>
tag.name
).join(", ")
}
</b>
</p>
<p>{lang.label.toTheProfesional} {" "} <b>{rule.granteeID}</b></p>
<p>{lang.label.ruleExpiresIn} {rule.expires}</p>
<Button onClick={editRule}>{lang.label.Edit}</Button>
<Button onClick={removeRule(rule.id)}>{lang.label.Remove}</Button>
</ListItem>
)))
}
</List>
)
}
export default RuleList
当我取消注释此行时, // _setRules(_rules.filter(rule => rule.id !== ruleId));。即使在我单击删除按钮之前,该列表也不会显示在页面上。
请指教。
之前谢谢。
【问题讨论】:
-
onClick={removeRule(rule.id)}在箭头函数中传递 removeRule 像 this'onClick={()=>{removeRule(rule.id)}}因为当你的规则被渲染时 removeRule() 会立即被调用,所以你必须像这样调用它
标签: javascript reactjs react-hooks react-state