组件道具未在状态更改时更新

Posted

技术标签:

【中文标题】组件道具未在状态更改时更新【英文标题】:Component props not updating on state change 【发布时间】:2021-12-14 11:14:13 【问题描述】:

我在 React 中有一个组件。当状态 cloneMode 改变时,它的 prop group 应该更新。为此,我使用以下代码: 结构:

const DraggableElement = ( list, setList, cloneMode ) => 
 return (
    <ReactSortable
      group=
        cloneMode
          ?  name: "tasks_group", pull: "clone" 
          : "tasks_group"
      
      key=cloneMode
      list=list
      setList=setList
      animation=200
      delay=1
      className="task-child_drag"
    >
      list.map((e) => 
        return <TaskItem key=e._id task=e />;
      )
    </ReactSortable>
  );
;

家长:

const Tasks = () => 
  const [cloneMode, setCloneMode] = useState(false);

  return (
    <div className="tasks">
            <DraggableElement
              list=todo
              setList=setTodo
              cloneMode=cloneMode
            />
            <DraggableElement
              list=inProgress
              setList=setInProgress
              cloneMode=cloneMode
            />
            <DraggableElement
              list=done
              setList=setDone
              cloneMode=cloneMode
            />
          </div>
  );
;

当我运行setCloneMode(true) 时,它不会影响组件。关于如何实现它的任何想法?

【问题讨论】:

cloneModeDraggableElement 中的一个道具,你在哪里使用useState?我不清楚。 @Adam 很抱歉造成混乱!我已更新问题以包含父组件 你如何/在哪里打电话给setCloneMode(true) 你能创建一个codesanbdox吗? 你能创建一个 codsandbox 链接吗,这里给出的代码 sn-p 道具没有改变,因为你提到 setCloneMode 正在改变。但是它叫什么名字呢? 【参考方案1】:

第一件事是,你没有改变状态(或者忘记写下来)。没有它,我们无法回答您的问题。

这是 React 的默认行为。 Component should rerender once the value of props or state is changed.

所以,请下载React Dev Tools,它是 Chrome 或 Edge 的浏览器扩展程序,有助于实时查看/更改 chrome 开发人员窗口中的道具和状态的值。有了这个,您将更好地了解您的问题,并从那里开始调试。

【讨论】:

【参考方案2】:

如果没有 codepen,任何关于您认为状态未更新的原因的信息,或者任何更多的上下文都很难回答您的问题,但这里有一个可以尝试的事情列表:

    打开React Developer Tools 并确认状态/道具正在/没有更新。或者,您可以通过让 prop 成为数据属性的值来进行检查,以便您可以在检查器 data-test=cloneMode 中看到它。 从DraggableElement 组件中删除key 属性。你在这里不需要钥匙。如果你打算在 React 的任何地方使用一个键,它应该是唯一的。您现在进行此设置的方式所有的键都将是 true 或 false。 如果所有其他方法都失败了,我会尝试为其中之一手动传递 true 道具值,以确保 100% 确保道具不起作用。

【讨论】:

以上是关于组件道具未在状态更改时更新的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中通过更改父级的道具来更新子组件

Vue props 数据未在子组件中更新

当父组件在 Next.js 应用程序中更新其道具时重新渲染 React 子组件

Redux 状态未在开发工具中更新,但当前状态正在反映在道具中

父组件更改道具(布尔值)时子组件不更新

道具更改时子组件不会更新