在复选框上单击两次以更新状态

发布于 2025-01-30 08:16:24 字数 572 浏览 3 评论 0原文

我正在映射此数组,

array=[
    {'id': 1, 'isActive': true, 'name': apple}, 
    {'id': 2, 'isActive': false, 'name': orange}, 
    {'id': 3, 'isActive': false, 'name': forest}
]

项目的图像之后看起来像这样的输入

<input
    id={item.id}
    type="checkbox"
    onClick={() => handleActive(item)}
    checked={item.isActiveMarket}
/>

当我单击复选框以激活或脱离活性时,我想在项目中更改

,但是该数组应保持完整,而不会删除任何元素的 任何元素功能这是我得到的

const handleActive = (item) => {
    item.isActive = !item.isActive;
};

,但只有当我双击它时

I am mapping through this array

array=[
    {'id': 1, 'isActive': true, 'name': apple}, 
    {'id': 2, 'isActive': false, 'name': orange}, 
    {'id': 3, 'isActive': false, 'name': forest}
]

I have an input that looks like this after the map of array

<input
    id={item.id}
    type="checkbox"
    onClick={() => handleActive(item)}
    checked={item.isActiveMarket}
/>

I want to change isActive inside the item when i click on the checkbox to activate or desactivate, but the array should stay full without deleting any element

For the function this is what I got

const handleActive = (item) => {
    item.isActive = !item.isActive;
};

it works but only when I double click on it

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦初启 2025-02-06 08:16:24

尝试使用Onchange而不是OnClick

Try to use onChange instead of onClick

一笔一画续写前缘 2025-02-06 08:16:24

使用以下代码:

<input
    id={item.id}
    type="checkbox"
    onChange={() => handleActive(item)}
    checked={item.isActiveMarket}
/>

Use the below code:

<input
    id={item.id}
    type="checkbox"
    onChange={() => handleActive(item)}
    checked={item.isActiveMarket}
/>
北音执念 2025-02-06 08:16:24
const initialState = [
    {'id': 1, 'isActive': true, 'name': apple}, 
    {'id': 2, 'isActive': false, 'name': orange}, 
    {'id': 3, 'isActive': false, 'name': forest}
];

const [items, setItems] = useState(initialState);

const onActiveToggle = (id) => {
    const item = items.find(item => item.id === id);

    setItems(prev => prev.splice(prev.indexOf(item), 1, {...item, isActive: !item.isActive}));
}

...
...
<>
  {items.map((item, index) => (
    <input
    key={item.id}
    id={item.id}
    type="checkbox"
    onChange={() => handleActive(item.id)}
    checked={item.isActive}
/>
  ))}
</>

...
...
const initialState = [
    {'id': 1, 'isActive': true, 'name': apple}, 
    {'id': 2, 'isActive': false, 'name': orange}, 
    {'id': 3, 'isActive': false, 'name': forest}
];

const [items, setItems] = useState(initialState);

const onActiveToggle = (id) => {
    const item = items.find(item => item.id === id);

    setItems(prev => prev.splice(prev.indexOf(item), 1, {...item, isActive: !item.isActive}));
}

...
...
<>
  {items.map((item, index) => (
    <input
    key={item.id}
    id={item.id}
    type="checkbox"
    onChange={() => handleActive(item.id)}
    checked={item.isActive}
/>
  ))}
</>

...
...
婴鹅 2025-02-06 08:16:24

您需要添加使用效果才能更新状态:

  useEffect(() => {
    // console.log('items useEffect runs')

  }, [items])

You need to add in a useEffect to update the state:

  useEffect(() => {
    // console.log('items useEffect runs')

  }, [items])
爱人如己 2025-02-06 08:16:24

似乎反应具有状态同​​步不当行为。添加密钥道具并将其设置为检查状态,这样,您将能够触发渲染。

<input
    id={item.id}
    type="checkbox"
    onClick={() => handleActive(item)}
    checked={item.isActiveMarket}
    key={item.id}
/>

It seems like react has a state synchronisation misbehaviour. Add the key prop and set it to the checked state, this way you will be able to trigger the rendering.

<input
    id={item.id}
    type="checkbox"
    onClick={() => handleActive(item)}
    checked={item.isActiveMarket}
    key={item.id}
/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文