当父母的道具发生变化时,不重新渲染孩子

安东尼·达

我在对子项进行重新渲染时遇到一些问题,我将方法传递给子项以查看是否应显示按钮,但是当父项的状态更改时,不会重新渲染子项。

我尝试了按钮的禁用属性,但也没有用。

这是我的代码(我删除了不必要的部分):

function Cards(props) {
  const isCardInDeck = (translationKey) => {
    return props.deck.some(
      (card) => !!card && card.translationKey === translationKey
    );
  };

  const addToDeck = (card) => {
    if (!isCardInDeck(card.translationKey) && !!card) {
      props.deck.push(card);
    }
  };

  const removeFromDeck = (card) => {
    if (isCardInDeck(card.translationKey) && !!card) {
      var index = props.deck.findIndex(
        (c) => c.translationKey === card.translationKey
      );
      props.deck.splice(index, 1);
    }
  };

  return (
    <div className="cardsContent">
      <div className="cards">
        {cardList.length > 0 ? (
          cardList.map((item, index) => {
            return (
              <Card key={index} card={item} addToDeckDisabled={isCardInDeck(item.translationKey)} addToDeckClick={addToDeck} removeFromDeckClick={removeFromDeck} />
            );
          })
        ) : (
          <span>
            <FormattedMessage id="app.cards.label.no.card.found" defaultMessage="No card found with filter."/>
          </span>
        )}
      </div>
    </div>
    );
}

function Card(props) {

  const toggleShowDescription = () => {
    if (!showDescription) {
      setShowDescription(!showDescription);
    }
  };

  return (
    <div onClick={toggleShowDescription} onBlur={toggleShowDescription} >
      <img src={"../images/cards/" + props.card.image} alt={props.card.image + " not found"} />
      {showDescription ? (
        <div className="customCardDetail">
          <div className="cardName"></div>
          <div className="cardType">
            {props.addToDeckDisabled ? (
              <Button onClick={() => { props.removeFromDeckClick(props.card);}} startIcon={<RemoveIcon />}>
                Remove from deck
              </Button>
            ) : (
              <Button onClick={() => { props.addToDeckClick(props.card); }} startIcon={<AddIcon />}>
                Add to deck
              </Button>
            )}
          </div>
          <div className="cardDescription">
            <span>
              <FormattedMessage id={props.card.description} defaultMessage={props.card.description} />
            </span>
          </div>
        </div>
      ) : (
        ""
      )}
    </div>
  );
}
杜德

您的代码不会更新状态。Cards改变它正在接收的道具。要在React的功能组件中使用状态,您应该使用useState钩子。

Cards 然后看起来像这样:

function Cards(props) {
  const [deck, setDeck] = useState(props.initialDeck)

  const isCardInDeck = (translationKey) => {
    return deck.some(
      (card) => !!card && card.translationKey === translationKey
    );
  };

  const addToDeck = (card) => {
    if (!isCardInDeck(card.translationKey) && !!card) {
      setDeck([...deck, card])
    }
  };

  const removeFromDeck = (card) => {
    if (isCardInDeck(card.translationKey) && !!card) {
      setDeck(deck.filter(deckItem => deckItem.translationKey !== card.translationKey))
    }
  };

  return (
    <div className="cardsContent">
      <div className="cards">
        {cardList.length > 0 ? (
          cardList.map((item, index) => {
            return (
              <Card key={index} card={item} addToDeckDisabled={isCardInDeck(item.translationKey)} addToDeckClick={addToDeck} removeFromDeckClick={removeFromDeck} />
            );
          })
        ) : (
          <span>
            <FormattedMessage id="app.cards.label.no.card.found" defaultMessage="No card found with filter."/>
          </span>
        )}
      </div>
    </div>
    );
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当react js中的任何状态发生变化时,如何停止重新渲染子组件?

来自分类Dev

如果特定道具发生变化,则重新渲染整个组件

来自分类Dev

当绘制数据的列内容因使用反应元素而发生变化时,如何触发绘图的重新渲染

来自分类Dev

$watch 服务发生变化时

来自分类Dev

在react中,当孩子发生变化时如何引起注意?

来自分类Dev

当上下文使用者中的任何状态发生变化时,React是否会重新渲染所有组件?

来自分类Dev

在渲染过程中点击道具会发生变化

来自分类Dev

容器道具在儿童状态变化后发生变化

来自分类Dev

当重点关注的舞台发生变化时获得通知

来自分类Dev

每次Ember发生变化时如何运行代码

来自分类Dev

在页面标题发生变化时发出警报

来自分类Dev

方向发生变化时片段会崩溃

来自分类Dev

位置发生变化时如何更新UI?

来自分类Dev

初始化时滑块的大小发生变化

来自分类Dev

当余烬数据/模型发生变化时触发警报

来自分类Dev

当某些变量发生变化时如何激活函数?

来自分类Dev

Visual Studio:当数据库结构发生变化时,重新加载数据集和Datagrid

来自分类Dev

当Vue的数据属性之一发生变化时,Vue会重新执行所有指令操作

来自分类Dev

指针属性在重新检查时发生变化

来自分类Dev

重新启动后nftables发生变化

来自分类Dev

当函数中的值发生变化时,指针不反映变化

来自分类Dev

将道具转移给孩子而无需重新渲染父母

来自分类Dev

将道具转移给孩子而无需重新渲染父母

来自分类Dev

当另一个vuex中的吸气剂发生变化时,我可以重新计算吸气剂吗?

来自分类Dev

仅在原子值发生变化时才调用副作用函数

来自分类Dev

仅当GIT / SVN发生变化时,Jenkins的Post Build步骤

来自分类Dev

当一个特殊领域发生变化时做一些事情(主义)

来自分类Dev

仅当测试失败次数发生变化时,我才能让Jenkins使构建失败吗?

来自分类Dev

AngularJS 1.5当模板组件内部的内容发生变化时,如何获取事件

Related 相关文章

  1. 1

    当react js中的任何状态发生变化时,如何停止重新渲染子组件?

  2. 2

    如果特定道具发生变化,则重新渲染整个组件

  3. 3

    当绘制数据的列内容因使用反应元素而发生变化时,如何触发绘图的重新渲染

  4. 4

    $watch 服务发生变化时

  5. 5

    在react中,当孩子发生变化时如何引起注意?

  6. 6

    当上下文使用者中的任何状态发生变化时,React是否会重新渲染所有组件?

  7. 7

    在渲染过程中点击道具会发生变化

  8. 8

    容器道具在儿童状态变化后发生变化

  9. 9

    当重点关注的舞台发生变化时获得通知

  10. 10

    每次Ember发生变化时如何运行代码

  11. 11

    在页面标题发生变化时发出警报

  12. 12

    方向发生变化时片段会崩溃

  13. 13

    位置发生变化时如何更新UI?

  14. 14

    初始化时滑块的大小发生变化

  15. 15

    当余烬数据/模型发生变化时触发警报

  16. 16

    当某些变量发生变化时如何激活函数?

  17. 17

    Visual Studio:当数据库结构发生变化时,重新加载数据集和Datagrid

  18. 18

    当Vue的数据属性之一发生变化时,Vue会重新执行所有指令操作

  19. 19

    指针属性在重新检查时发生变化

  20. 20

    重新启动后nftables发生变化

  21. 21

    当函数中的值发生变化时,指针不反映变化

  22. 22

    将道具转移给孩子而无需重新渲染父母

  23. 23

    将道具转移给孩子而无需重新渲染父母

  24. 24

    当另一个vuex中的吸气剂发生变化时,我可以重新计算吸气剂吗?

  25. 25

    仅在原子值发生变化时才调用副作用函数

  26. 26

    仅当GIT / SVN发生变化时,Jenkins的Post Build步骤

  27. 27

    当一个特殊领域发生变化时做一些事情(主义)

  28. 28

    仅当测试失败次数发生变化时,我才能让Jenkins使构建失败吗?

  29. 29

    AngularJS 1.5当模板组件内部的内容发生变化时,如何获取事件

热门标签

归档