React 子组件在父组件中更新状态后如何将其重置回原始状态

Posted

技术标签:

【中文标题】React 子组件在父组件中更新状态后如何将其重置回原始状态【英文标题】:How can reset a React child component back to original state after it updates state in the parent 【发布时间】:2020-04-27 13:28:01 【问题描述】:

我是 React 的新手,并试图模仿以下场景的更复杂版本:

    我有一个包含状态变量的父组件。 我有一个子组件,我向它传递了一个函数来更新父组件中的状态变量。 在我的父函数中,我希望能够重置孩子可能已更改的状态变量。 我希望子函数反映由父函数发起的重置。

在我在这里模仿的真实示例中,在第 2 步中,很多事情都会随着状态值的更新而变化,而不仅仅是值的直接更新。我想在我的父级中提供一个“重置”,这反过来应该反映在这个具有范围滑块的子组件中。

这是我的简单示例:

import React,  useState  from "react";

export const App = () => 
  const [rangeValue, setRangeValue] = useState(0)

  const reset = (e) => 
    e.preventDefault()
    setRangeValue(0)//reset state to 0 in App
    //how can I get the initial Position in Range component back to 0?
  

  return (
    <div>
      <p>The range value is: rangeValue</p>
      <Range setRangeValue = setRangeValue/>
      <p><a href="/#" onClick=reset>reset</a></p>
    </div>
  )


const Range = (setRangeValue: setRangeValue) =>

  const handleChange = (event) => 
    setRangeValue(event.target.value)
  
  return (
    <input 
      type="range"
      min="0"
      max="10"
      step="1"
      defaultValue=0
      onChange=(event) => handleChange(event) />
  )


export default App;

这是一个代码沙箱: https://codesandbox.io/s/github/FergusDevelopmentLLC/range-test

实现这样一个想法的正确方法是什么?

【问题讨论】:

【参考方案1】:

您可能希望通过将值从父级传递给它并摆脱默认值来创建您的 Range 组件controlled

import React,  useState  from "react";

export const App = () => 
  const [rangeValue, setRangeValue] = useState(0)

  const reset = (e) => 
    e.preventDefault()
    setRangeValue(0)//reset state to 0 in App
    //how can I get the initial Position in Range component back to 0?
  

  return (
    <div>
      <p>The range value is: rangeValue</p>
      /* pass the value here */
      <Range rangeValue=rangeValue setRangeValue = setRangeValue/> 
      <p><a href="/#" onClick=reset>reset</a></p>
    </div>
  )


const Range = (rangeValue, setRangeValue: setRangeValue) =>

  const handleChange = (event) => 
    setRangeValue(event.target.value)
  
  return (
    <input 
      type="range"
      min="0"
      max="10"
      step="1"
      value=rangeValue // <-- here get the value from parent, when reset it will come down from parent again without whatever value it was reset to
      onChange=(event) => handleChange(event) />
  )


export default App;

【讨论】:

谢谢你,你的帖子让我知道了如何克服这个问题。在我更复杂的版本中,滑块是一个范围:npmjs.com/package/rc-slider 但解决方案是相同的,使用受控版本。

以上是关于React 子组件在父组件中更新状态后如何将其重置回原始状态的主要内容,如果未能解决你的问题,请参考以下文章

如何从 React 中的父类更新我的子组件状态?

如何使用从 React 中的子组件获取的数据更新父组件中的状态

如何在父组件中强制刷新子组件

使用 React 在父组件中公开子组件的状态和方法

React Native - 直接在父组件上设置子组件的状态

react 子组件调用父组件方法