【问题标题】:Dispatch an action only once that too if an async action has successfully fetched data and updated the state如果异步操作已成功获取数据并更新状态,则也仅调度一次操作
【发布时间】:2021-12-01 11:40:25
【问题描述】:

我只想分派一个动作一次,但我传递给这个动作的有效负载取决于另一个异步动作获取的结果,该动作也只运行一次。

const data=useSelector(aSelector.getData);
const selectedData=useSelector(bSelector.getSelectedData);

React.useEffect(()=>{
       dispatch(sagaAction.fetchData());   //this is async action that sets state which I use to dispatch below action
       dispatch(simpleAction.setSelectedData(data.name);  //This action sets state which is used as selectedData.this action should run once when above action has succesfully fetched data .Both actions should run only once 

})

上面的代码并不完全正确。只是给出一个想法,我想实现什么以及我认为我可以如何做到这一点。是否有任何合理的方法可以实现这一目标。提前致谢。

【问题讨论】:

    标签: reactjs redux react-hooks use-effect redux-saga


    【解决方案1】:

    您需要将它们分成两个不同的useEffect 钩子,并像这样利用useEffect 的依赖参数:

    const data = useSelector(aSelector.getData);
    const selectedData = useSelector(bSelector.getSelectedData);
    
    React.useEffect(() => {
      // The [data] array below tells React to run this useEffect when the
      // component mounts and then again any time `data` changes, 
      // but then we use the `if` statement to make sure
      // we only run the dispatch when `data` exists
      if(data) {
        dispatch(simpleAction.setSelectedData(data.name);
      }
    }, [data])
    
    React.useEffect(() => {
      // The empty array below tells React to only run this `useEffect` once when the component mounts
      dispatch(sagaAction.fetchData());
    }, [])
    

    【讨论】:

    • 正是我想要的。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2021-01-18
    • 2017-12-02
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多