我不明白此代码(适用于React / Redux)如何工作

时间:2019-09-18 03:10:46

标签: javascript reactjs redux

我对反应/还原有疑问。

我正在制作一个Web应用程序。它以我希望它没有任何问题的方式完美运行。即使我不明白。我不了解的部分是这一部分。

这是我的代码。

const myApps = () => {
  let myInfo = {};
  const form = [];
  form.push(<div>what</div>);
  myInfo = form.reduce((prev, element, index) => {
    prev[index] = {isTrue : false};
    return prev;
  }, {});
}

useEffect(() => {
    uploadToRedux(myInfo); // this is redux dispatch. I upload to redux "only" here.
}, []);

myInfo[0].isTrue = true;

if (myInfo[0].isTrue) console.log('Correct!');
else console.log('Incorrect!');

仅当使用{strong> useEffect 将myInfo发送到Redux时,我才将componentDidMount发送到Redux。顺便说一句,当我切换myInfo[0].isTrue = true时,redux中的状态会同时更改。即使我没有发送调度!

当然,这就是我想要的,但是即使没有发送调度,redux的状态也有任何变化吗?怎么可能呢?

2 个答案:

答案 0 :(得分:1)

据我所知,当您请求服务器(API)向您返回数据时,您需要调度自己。因此它需要是异步的。但是当它不异步时,您只需将数据传递给存储,它将自动分派。

因此,只要延迟后您的数据返回,它就是一个异步请求,接收数据时您需要调度数据。 (如果您不这样做,则可能由于Redux调度未定义的数据而导致错误)

希望对您有所帮助。

答案 1 :(得分:1)

请注意,您正在将函数作为回调传递给useEffect()

() => {
  uploadToRedux(myInfo); // this is redux dispatch. I upload to redux "only" here.
}

useEffect()将立即执行,但匿名函数(回调)将被安排为由JS运行时执行(即准备好执行,但实际上尚未执行)。

等到回调即将在redux中执行并更新值时,JS运行时将已经在useEffect()之后执行了代码行,即,以下代码行将在redux更新之前执行:

myInfo[0].isTrue = true;

if (myInfo[0].isTrue) console.log('Correct!');
else console.log('Incorrect!');

因此,当JS运行时将执行以下行:

uploadToRedux(myInfo);

myInfo[0].isTrue的值将已经更新,并且将被还原。

这种现象称为回调地狱。要了解更多信息,请阅读:http://callbackhell.com/

可以肯定的是,在redux更新之前记录myInfo [0] .isTrue的值

useEffect(() => {
  console.log("myInfo[0].isTrue", myInfo[0].isTrue);
  uploadToRedux(myInfo); // this is redux dispatch. I upload to redux "only" here.
}, []);