React Hooks,在onClick函数中有条件地更改状态,在下次单击时更新

伊斯恩加特

您好,我有一个列表组件,它呈现了一些<Card>具有的组件prop isSelected因为很多事情发生在一个<Card>组件都有isSelected === true我加了state<List>组件,我要当有人点击一个卡检查:

1)如果没有以前选择的项目(state===null将其ID添加到状态)

2)如果某人在状态中已经选择了某个项目的情况下单击同一项目或另一项目,则仅取消选择活动项目。

import {Card} from "./Card";
import cloneDeep from 'lodash/cloneDeep';

const List = () => {
    const [selectedCard, setSelectedCard] = useState(null);

    const onCardClick = id => {
        console.debug(selectedCard, id)
        const newSelectedCard = cloneDeep(selectedCard);
        // if he clicks another item while an item is active
        // or if he clicks the same item while active
        // should just make it inactive
        if (newSelectedCard !== null || newSelectedCard === id) {
            setSelectedCard(null)
        } else {
            setSelectedCard(id)
        }
        console.debug(selectedCard, id)
    }

    return (
        <ul className="card-list">
            {cardData.map(card => (
                <Card
                    onClick={() => onCardClick(card.id)}
                    key={card.id}
                    isSelected={selectedCard === card.id}
                    {...card}
                />
            ))}
        </ul>
    )
}


export const CardList = () => (
    <List/>
);

问题是2console.debugs显示相同的值,这意味着状态不会立即更新,并且Im在这里和那里遇到一些奇怪的行为。我在这里想念什么吗?

哈比尔

基本上你需要遵循以下三个条件

if(newSelectedCard === null){
        setSelectedCard(id)
    }
    else if(newSelectedCard === id){
        setSelectedCard(null);
    }
    else{
        setSelectedCard(id)
    }

这是完整的示例:

import cloneDeep from 'lodash/cloneDeep';
import React, {useState} from "react";

const List = () => {
    const [cardData, setCardData] = useState([
        {id: 1, title: 'First Card'},
        {id: 2, title: 'Second Card'},
        {id: 3, title: 'Third Card'},
        {id: 4, title: 'Fourth Card'},
    ]);
    const [selectedCard, setSelectedCard] = useState(null);

    const onCardClick = id => {
        console.log(selectedCard, id);
        const newSelectedCard = cloneDeep(selectedCard);
        // if he clicks another item while an item is active
        // or if he clicks the same item while active
        // should just make it inactive
        if(newSelectedCard === null){
            setSelectedCard(id)
        }
        else if(newSelectedCard === id){
            setSelectedCard(null);
        }
        else{
            setSelectedCard(id)
        }
        console.log(selectedCard, id)
    };

    return (
        <ul className="card-list">
            {cardData.map(card => (
                <Card
                    onClick={() => onCardClick(card.id)}
                    key={card.id}
                    isSelected={selectedCard === card.id}
                    {...card}
                />
            ))}
        </ul>
    )
};

export const CardList = () => (
    <List/>
);

const Card = (props) => {
    const backColor = props.isSelected? '#F9740E' : '#3FB566';
    return (
        <div onClick={() => props.onClick()}>
            <div style={{backgroundColor: backColor, border: '1px solid darkgreen', color: 'white', padding: 10, marginBottom: 10}}>
                <h3>{props.id}</h3>
                <h4>{props.title}</h4>
            </div>
        </div>
    );
};

这里更新是代码沙箱

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于状态在React JS中有条件地渲染内容

来自分类Dev

在React中有条件地设置活动类

来自分类Dev

在React中有条件地添加HTML属性

来自分类Dev

在React中有条件地设置活动类

来自分类Dev

在 React 组件中有条件地渲染 <td>

来自分类Dev

React延迟后如何有条件地更改useEffect的状态?

来自分类常见问题

如何在React Native底部选项卡中有条件地更改屏幕按钮?

来自分类Dev

如何在React Native底部选项卡中有条件地更改屏幕按钮?

来自分类Dev

如何在React Native Component中有条件地包含图像?

来自分类Dev

在React.js中有条件地设置html属性

来自分类Dev

在React JSX中有条件地渲染组件部分

来自分类Dev

如何在React JS中有条件地呈现错误?

来自分类Dev

如何在React中有条件地将布局应用于组件

来自分类Dev

在 React 中有条件地添加表 n+1 行(<tr>)

来自分类Dev

如何使用React Redux状态有条件地显示和禁用按钮

来自分类Dev

根据React功能组件中的状态变量有条件地设置className

来自分类Dev

有条件地渲染JSX的React组件的更新周期如何表现?

来自分类常见问题

如何有条件地包装React组件?

来自分类Dev

有条件地与react-router链接

来自分类Dev

有条件地禁用React Checkbox

来自分类Dev

使用React有条件地停止游戏循环

来自分类Dev

有条件地在react jsx中渲染className

来自分类Dev

React-native - 有条件地设置高度

来自分类Dev

如何在React中有条件地将子组件添加到父组件?

来自分类Dev

如何在React Native中有条件地从三个不同的选项进行渲染?

来自分类Dev

如何检查id是否等于用户的id并在react js中有条件地显示按钮?

来自分类Dev

有没有办法在React JS中使用onClick有条件地呈现内容?

来自分类Dev

在React中,我需要从本地存储中获取状态,然后根据该状态有条件地设置另一个状态

来自分类Dev

通过React useHistory传递道具时,如何有条件地渲染道具并检查未定义内容?

Related 相关文章

  1. 1

    基于状态在React JS中有条件地渲染内容

  2. 2

    在React中有条件地设置活动类

  3. 3

    在React中有条件地添加HTML属性

  4. 4

    在React中有条件地设置活动类

  5. 5

    在 React 组件中有条件地渲染 <td>

  6. 6

    React延迟后如何有条件地更改useEffect的状态?

  7. 7

    如何在React Native底部选项卡中有条件地更改屏幕按钮?

  8. 8

    如何在React Native底部选项卡中有条件地更改屏幕按钮?

  9. 9

    如何在React Native Component中有条件地包含图像?

  10. 10

    在React.js中有条件地设置html属性

  11. 11

    在React JSX中有条件地渲染组件部分

  12. 12

    如何在React JS中有条件地呈现错误?

  13. 13

    如何在React中有条件地将布局应用于组件

  14. 14

    在 React 中有条件地添加表 n+1 行(<tr>)

  15. 15

    如何使用React Redux状态有条件地显示和禁用按钮

  16. 16

    根据React功能组件中的状态变量有条件地设置className

  17. 17

    有条件地渲染JSX的React组件的更新周期如何表现?

  18. 18

    如何有条件地包装React组件?

  19. 19

    有条件地与react-router链接

  20. 20

    有条件地禁用React Checkbox

  21. 21

    使用React有条件地停止游戏循环

  22. 22

    有条件地在react jsx中渲染className

  23. 23

    React-native - 有条件地设置高度

  24. 24

    如何在React中有条件地将子组件添加到父组件?

  25. 25

    如何在React Native中有条件地从三个不同的选项进行渲染?

  26. 26

    如何检查id是否等于用户的id并在react js中有条件地显示按钮?

  27. 27

    有没有办法在React JS中使用onClick有条件地呈现内容?

  28. 28

    在React中,我需要从本地存储中获取状态,然后根据该状态有条件地设置另一个状态

  29. 29

    通过React useHistory传递道具时,如何有条件地渲染道具并检查未定义内容?

热门标签

归档