对父组件的异步函数调用

停止面

我有这个

const Parent = () => {
    [modalOpen, setModal] = React.useState(false);

    return <Child
               open={modalOpen}
               closeModal={() => setModal(false)}
               functionFromParent={() => console.log('Logged')} />
}

然后

const Child = ({ functionFromStore, functionFromParent, closeModal }) => {
    async function foo() {
        try {
          await ...;
          functionFromStore();
          functionFromParent();
        } catch (error) {
          ....
        }
    }

    const bar = () => {
        foo();
        closeModal();
    }

    return <div
           style={{backgroundColor: 'hotpink', width: '10rem', height: '10rem' }}
           onClick={() => bar()}/>
}

零件。

<Parent />决定是否显示<Child />(它是Modal)。<Child />具有三个功能,closeModal()并且functionFromParent()来自<Parent/ >functionFromStore()从未来reduxdispatchToProps()为了简单起见,我忽略了所有connect(stateToProps, dispatchToProps)(...)内容。但让我们假设<Child />直接连接到store

单击<div />in<Child/>执行bar()这导致<Child />unmount,因为closeModal()<Parent />被调用时,关闭模式然而,bar()还呼吁foo(),作为一个async功能。

await解决了,functionFromStore()是所谓的,但不是functionFromParent()我不知道为什么呢?store即使<Child />卸载了组件(为什么函数仍来自被调用函数,而不是来自父函数?

此外,functionFromParent()即使在<Child />未挂载的情况下,有没有办法打电话它以某种方式起作用functionFromStore(),是否有办法使其起作用functionFromParent()

HMR

我无法重现您描述的行为,但这可能是一个关闭问题,因为您多次设置状态,但是在处理程序的关闭中有一个过时的状态值

您可以通过将回调传递给state setter:来解决它setSomeState(currentState=>({...currentState,changes})),这是一个完整的示例:

function Parent() {
  const [state, setState] = React.useState({
    showModal: true,
    showFoo: false,
  });

  return (
    <div>
      {state.showModal ? (
        <Child
          open={state.showModal}
          closeModal={() =>
            setState(state => ({
              ...state,
              showModal: false,
            }))
          }
          functionFromParent={() =>
            setState(state => ({
              ...state,
              showFoo: true,
            }))
          }
        />
      ) : (
        'Child is gone '
      )}
      {state.showFoo ? <Foo /> : 'no foo'}
    </div>
  );
}
function Child({ functionFromParent, closeModal }) {
  function foo() {
    setTimeout(() => {
      functionFromParent();
    }, 1000);
  }
  const bar = () => {
    foo();
    closeModal();
  };
  return <button onClick={bar}>click me</button>;
}
function Foo() {
  return 'hi, I am Foo';
}
ReactDOM.render(
  <Parent />,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从子组件调用父函数

子组件未调用父组件函数

从子组件中调用父组件函数

在组件代码的开头调用异步函数

如何从异步函数调用组件方法?

父组件在子组件列表上调用子组件函数

在React的子组件中调用父函数

如何在父组件中调用函数

父组件的angular2调用函数

无法从 React 中的子组件调用父组件函数

从Angular的子组件中调用父组件函数

使用父组件中的按钮调用子组件中的函数

在反应组件中直接调用异步函数是否合法?

从React组件调用函数时的异步行为

(如何)可以从NgbModal模态调用父组件函数?

AngularJS ES6 父函数未被子组件调用

如何在父事件上调用子组件上的函数

不使用 props 在父组件中调用函数

vue2使用组件中的$ emit调用父函数

离子2:如何从Popover组件调用父页面函数

React:在父组件中调用子函数的问题

从子组件调用的反应父函数不更新状态?

当子组件位于路由器出口Angular中时,从子组件调用父组件函数

从子组件Angular调用父组件函数,从sessionStorage实时更新变量

ReactJS:子组件调用父组件时,“ this.props”不是函数

触发子组件事件时如何调用父组件构造函数

如何从Angular 1x中的嵌套子组件中调用父组件中的函数

如何通过React中子组件的onchange事件调用父类组件中的函数?

父组件中的子组件在单击 React 时调用不同的函数