【问题标题】:How to update back prop to child componet using react hook如何使用反应钩子将后退道具更新为子组件
【发布时间】:2021-10-11 10:03:11
【问题描述】:

我有一个这样的父组件,只是为了显示对话框

子组件(主显示对话框)

   export const MedicalRecord = memo(function MedicalRecord() {
  // const onPressViewAll = useCallback(() => {}, [])
  const [show, setShow] = useState(false) ///to show dialog

  function hanndleDialog() {
    setShow(!show) set to show dialog
  }

  // useEffect(() => {
  //   if (show == true) {
  //     setShow(!show)
  //   }
  // },[show])
  return (
    <SummaryViewContainer
      count={5}
      title={"dashboardScreen.medicalRecords.title"}
      onPress={() => {
        hanndleDialog()
      }}
    >
      <View>
        {show && (
          <ProgressDialog
            show={show} //pass t
            callback={() => {
              hanndleDialog()
            }}
          />
        )}
        <RecordItem />
        <RecordItem />
        <RecordItem />
      </View>
    </SummaryViewContainer>
  )
})

以及显示此对话框的父组件

  export default function DialogTesting(show: boolean, { callback }) {
  const [showDialog, doShow] = useState(show) //show to present show in child

  return (
    <View>
      {/* <Button
        title="click"
        onPress={() => {
          setShow(true)
        }}
      >
        <Text>Show dialog</Text>
      </Button> */}
      <Dialog
        visible={showDialog}
        title="Record New Progress"
        style={DIALOG}
        onClose={() => {
          doShow(false)
          callback()
        }}
      >

但我不知道如何在关闭对话框时再次打开对话框,它只打开一次,我尝试React Hook : Send data from child to parent component 但不起作用!

我如何显示对话框,当我点击关闭按钮时,孩子们会返回原始状态,所以我可以再次点击它,非常感谢你们

这是这个问题的简短视频 https://recordit.co/0yOaiwCJvL

【问题讨论】:

  • 你能分享一个最低工作的sn-p吗?
  • 不幸的是,这段代码是整个项目,不是我的 :((( ,所以很难分享工作代码
  • 然后尝试删除memo,因为 props 和 states 是相同的,所以它可以渲染记忆的组件。我只是猜测。
  • 它不起作用 :( ,我整天都在尝试这样做
  • This is the sandbox 建议的最后一个解决方案。如果我正确理解了问题陈述,我希望这会有所帮助。

标签: reactjs react-native react-hooks


【解决方案1】:

我假设您想找到一种方法来显示基于点击的隐藏组件。所以this is the sandbox 也一样。

在此解决方案中,不使用a derived state,而是将状态保持在父状态,并根据该状态挂载/卸载子。

状态可以通过父级中存在的方法更新,并且此方法传递给子级以在“隐藏子级”按钮上触发。同样的方法也用于显示子组件。

以下是相同的核心代码,

import React from "react";

const Dialog = ({ hideMe }) => {
  return (
    <div>
      <div>I am dialog</div>
      <button onClick={hideMe}>Hide me</button>
    </div>
  );
};
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { showDialog: false };
  }

  toggleDialog = () => {
    this.setState((prevState) => {
      return { showDialog: !prevState.showDialog };
    });
  };

  render() {
    return (
      <div>
        <div>I am parent.</div>
        <button onClick={this.toggleDialog}>Toggle Dialog</button>
        {this.state.showDialog ? <Dialog hideMe={this.toggleDialog} /> : null}
      </div>
    );
  }
}

export default App;

【讨论】:

  • 嘿先生,但在我的问题中,在父组件中有一个名为 visiable 的道具,我如何在父组件和子组件中访问它?
  • 我的意思是,它有visiable 使对话框出现,然后它有一个布尔调用show 将值设置为visiable 为false,会有2 个道具,对吧?所以我想知道当visiable 在对话框中显示为真,在主屏幕中,布尔显示显示对话框返回false 时,我们怎么做?
  • 如果你的意思是你有这样的层次结构 parent1-&gt;parent2-&gt;child 并且状态 visibleparent1 中,那么你可以将 parent1 状态 visible 传递给 parent2 prop 并将这个 prop 原封不动地传递给 child 例如。在parent2 中,它将是this.props.visible,而不是上面代码中的this.state.showDialog。同样,函数将在parent1 中并传递给parent2,然后传递给child 不变。
  • 欢迎您,如果这是您正在寻找的解决方案,请接受答案。
  • 实际上我解决了我的部分问题,如果你能帮我解决这个问题会很棒,也就是说,我有一个名为 show 的儿童道具来显示父对话框,我使用 react hook要存储状态,它是 const[show,doShow] =useState(false)` 就像我在我的帖子中提到的那样,我通过将 prop 传递给父对话框来使用该钩子,例如 dialogFunc(show) ,但我的问题是,我在子项中设置了按钮(主屏幕)单击时将挂钩更改为true(用于显示对话框)然后,当我单击时,它会打开对话框,但是当我单击对话框时它仍然是正确的,所以我需要按2次再次放置对话框
猜你喜欢
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 2021-02-25
  • 2020-02-25
  • 2021-05-19
  • 1970-01-01
相关资源
最近更新 更多