gpt4 book ai didi

javascript - 单选按钮选中的属性不是从列表中的按钮调用的

转载 作者:行者123 更新时间:2023-11-30 10:58:57 25 4
gpt4 key购买 nike

我想编写一个 React 组件,向用户显示他们可以使用 Semantic UI 中的单选按钮接受或拒绝的建议列表。 .

desired component

我的应用看起来像这样。

import React from "react";
import "./App.css";
import {Proposals} from "./components/Proposals";

function App() {
const proposals = [
{id: "1", context: "The cat is happy."},
{id: "2", context: "The triangle is blue."}
];

return (
<div>
<Proposals proposals={proposals}/>
</div>
)
}

export default App;

我的提案组件如下所示。

import React, {useState} from "react"
import {Form, Header, List, Radio} from "semantic-ui-react";

export const Proposals = ({proposals}) => {
const [judgments, setJudgments] = useState(
proposals.reduce((result, proposal) => {
result[proposal.id] = {accept: false, reject: false};
return result;
}, {})
);

const judge = (id) => {
return function (e, {value}) {
judgments[id].accept = value === "accept";
judgments[id].reject = value === "reject";
setJudgments(judgments)
};
};

return (
<div id="proposals">
<Header>Proposals</Header>
<List>
{proposals.map(proposal => {
return (
<List.Item key={proposal.id}>
<div>{proposal.context}</div>
<Form>
<Form.Group inline>
<Radio label="Accept"
value="accept"
name="accept-reject"
checked={judgments[proposal.id].accept}
onChange={judge(proposal.id)}/>
<Radio label="Reject"
value="reject"
name="accept-reject"
checked={judgments[proposal.id].reject}
onChange={judge(proposal.id)}/>
</Form.Group>
</Form>
</List.Item>
)
}
)}
</List>
</div>
)
};

我正在做的棘手的事情是将我的 onChange 处理程序 judge 编写为一个闭包,这样我就可以传入正在操作的提案的 id。这行得通。当我点击一个单选按钮时,judge 函数被调用,如果我将它的值记录到控制台,它们看起来都是正确的。

但是,当我点击它们时,单选按钮的状态并没有改变。如果我让 checked 属性调用一个也记录到控制台的函数,我看到它只在应用程序加载时被调用一次,再也不会被调用。

我使用 same pattern使用一个 radio 组,它工作正常。大概列表中的单选按钮有些东西搞砸了,但我不知道那是什么。


按照下面答案的建议,我将 judge 函数更改为以下内容。

const judge = (id) => {
return function (e, {value}) {
setJudgments(prev => {
if (prev.id !== id) return prev;
return {
...prev,
accept: value === "accept",
reject: value === "reject"
}
})
}
};

我也有同样的问题。

这似乎与我的不当updating state有关虽然。

最佳答案

judge上的闭包没有错。你的问题是你正在改变 state

judgments[id].accept = value === "accept"

您应该使用 useState setter 的更新版本来设置您的状态。

像这样

return function (e, {value}) {
setJudgments(prev =>({
...prev,
[id] :{
...prev[id],
accept: value === "accept",
reject: value === "reject"
}
}))
};

关于javascript - 单选按钮选中的属性不是从列表中的按钮调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58736016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com