【问题标题】:Trying to change state in Parent from Child component React Hooks试图从子组件 React Hooks 更改父级中的状态
【发布时间】:2020-06-21 08:55:01
【问题描述】:

我一直在查看相关帖子并尝试了一些解决方案,但我无法根据我的情况调整其中任何一个。 我正在尝试通过发送函数并从子组件调用它来更改selectedPin 的状态。

见下面我的代码

父组件:

export default function Pins(data) {
const chargers = data.data;
const [selectedPin, setSelectedPin] = useState(null);

const handleClose = () => {
setSelectedPin(null);
};

return (
<>
  {chargers.map((charger, index) => (
    <Marker
      key={index}
      longitude={charger.AddressInfo.Longitude}
      latitude={charger.AddressInfo.Latitude}
    >
      <Button
        onClick={(e) => {
          e.preventDefault();
          setSelectedPin(charger);
        }}
      >
        <img src="./assets/pin.svg" alt="marker pin" />
      </Button>
    </Marker>
  ))}
  {selectedPin ? (
    <PopupInfo selectedPin={selectedPin} handleClose={handleClose} />
  ) : null}
 </>
 );
}

子组件:

export default function PopupInfo(selectedPin, { handleClose }) {
const pin = selectedPin.selectedPin;
console.log(pin);
console.log(handleClose);

return (
<Popup
  latitude={pin.AddressInfo.Latitude}
  longitude={pin.AddressInfo.Longitude}
  onClose={handleClose}
  >
    <div>Popup Info</div>
  </Popup>
  );
}

当控制台在子组件中记录handleClose 时,我得到undefined

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    我认为您应该将它们都作为命名道具传递:

    export default function PopupInfo({ selectedPin, handleClose })

    或者这样做:

    export default function PopupInfo(props) 然后使用props.selectedPinprops.handleClose

    【讨论】:

    • 我认为这可以解决问题,当将 handleClose fn 传递给子组件时,请确保将其包装在 useCallback 钩子中
    • 您的第二个选项有效。谢谢!我也会给你一个赞成票,但我的代表很低......
    • 这项工作是但不是正确的方法。 @mcAdam,请参考单向数据流的文档和优点。
    • @NandhaFrost 我认为您感到困惑。这并没有违反单向流动的规律。有据可查,您可以将道具传递给子组件以更新父状态
    【解决方案2】:

    React 是单向数据流模型,它是 React 的核心特性。

    子级不能修改父级的状态。您必须想出一个想法来处理 Parent 本身中的数据或将其作为道具传递给绕过(不推荐)

    如果您有兴趣了解更多:https://www.youtube.com/watch?v=hO8u07-WTOk

    【讨论】:

    • 这不是真的。如果您将道具从父级传递给子级并以这种方式设置,则可以从子级修改父级的状态。
    • 不,我不会错的。这就是拥有单向数据流模型的主要原因
    • 拜托,它不会破坏单向流。传递 props 来更新父状态是完全可以的
    • 感谢您的视频。这听起来确实很有趣,并且与 Treehouse 和 Udacity 教授父子组件关系的方式完全不同
    • @mcAdam 请查看此问题并接受答案以获得更好的解释:stackoverflow.com/questions/35537229/…
    猜你喜欢
    • 2021-08-15
    • 2016-12-26
    • 1970-01-01
    • 2021-05-21
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多