Взаимодействие между redux и useEffect - PullRequest
3 голосов
/ 08 мая 2020

Я работал над функцией, которая искусственно загружает некоторые данные в компонент ie. воссоздает отображение страницы на основе загруженных данных. У меня возникают проблемы с вызовом useEffect. Вот код:

const funcA = (props) => {
    let a = [1, 2, 3];
    let b = [2, 3];
    setSelected(a);
    setParam(b);
    return (
        <div>...</div>
);
}

const funcB = (props) => {
    useEffect(
        () => {
            setParam([]);
        },
        [props.selected]
    );
    return (<div>...</div>);
}

setSelected() и setParam() - это действия, которые изменяют мое хранилище redux. Теперь, когда я изменяю selected, используя setSelected() в funcA, в funcB вызывается useEffect, который изменяет данные param на основе значений selected. Я думал, что это не должно быть проблемой, поскольку я звоню setParam() после звонка setSelected, но кажется, что useEffect запускается после setParam().

Короче говоря, это порядок, который я хотите, чтобы они выполнялись в:

  1. setSelected ()
  2. useEffect () (из-за изменения в selected)
  3. setParam ()

, но они выполняются в следующем порядке:

  1. setSelected ()
  2. setParam ()
  3. useEffect () ( из-за изменения в выбранном)

Любая помощь приветствуется. Спасибо !!

1 Ответ

0 голосов
/ 30 мая 2020

В мире реакции вам обычно не следует полагаться на порядок , в котором вызываются ваши функции setSomething ().

React «собирает» вызовы обновления состояния и выбирает наиболее эффективные способ обновления состояния.

Вместо того, чтобы думать в «порядке вызова» , вы должны подумать в «каким должно быть состояние B, если состояние A равно X?» .
Вместо "изменить состояние, если пользователь нажимает" , подумайте о ", что хочет пользователь, чтобы получить / увидеть?" .

Не хорошо:

  1. setSelected ()
  2. useEffect () (из-за изменения в selected)
  3. setParam ()

Лучше:

  1. setSelected ()
  2. useEffect () (вызывает setParam () из-за изменения в selected)
  3. useEffect () (вызывает setParam () из-за .. . почему?)

Вероятно, вам придется переосмыслить и немного изменить структуру своего состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...