Як відстежувати конкретні зміни властивостей у магазині Redux після надсилання дії


76

Зараз я намагаюся зрозуміти, як обробляти диспетчеризацію дії в компоненті на основі зміни даних після відправлення в інший компонент.

Візьмімо цей сценарій:

dispatch(someAjax) -> властивість у державних оновленнях.

Після цього мені потрібен інший компонент, який залежить від цієї ж властивості, щоб знати, що оновлено, і відправити дію на основі нового значення.

Замість того, щоб використовувати якийсь тип value.on(change...рішення, який найкращий спосіб обробляти цей тип дій "каскадним"?

Відповіді:


62

Існує два основних підходи: або проміжне програмне забезпечення, яке відрізняє стан після виконаної дії, або використання store.subscribeAPI низького рівня Redux .

Часті запитання щодо Redux містять відповідь, яка охоплює це . Крім того, я веду категоризований список доповнень та утиліт, пов’язаних із Redux, і включає групу існуючих бібліотек передплати на зміну магазину, які реалізують різні підходи до прослуховування змін даних.


1
Дякую за цей список, він справді корисний. Насправді я намагаюся зрозуміти, це найкращий спосіб повідомити декілька компонентів про те, що деякі дані повертаються із виклику AJAX і що клавіша X змінилася. Кожен із цих компонентів тоді, можливо, спрацьовує власні дії. Я можу дізнатись про зміни в проміжному програмному забезпеченні, але частина, яку я намагаюся з’ясувати, - це те, що робити, коли виявлено зміну. Я відчуваю, що потрібен якийсь автобус подій, але це недобре з Redux. Будь-яка порада там?
Jazzy

1
Основним рекомендованим підходом для спілкування у React та Redux є передача батьками реквізиту дітям та діти, які виконують зворотний дзвінок для сповіщення батьків. Однак інші підходи, такі як шини подій, безумовно, мають своє використання, і якщо шина події відповідає вашому випадку використання, перейдіть за цим. Можливо, ви захочете переглянути приклади на ctheu.com/2015/02/12/… та andrewhfarmer.com/component-communication .
markerikson

4
Хоча ви конкретно не відповіли на питання, перший пункт у вашому списку справді спрацював для моєї справи. redux-watch - це простий і креативний спосіб отримати цю функціональність. Ще раз дякую за список, це корисно.
Jazzy

Так, нещодавно я розділив сторінку поширених запитань на окремі сторінки за категорією. Просто оновив посилання в моїй відповіді, щоб воно відповідало. Дякую!
markerikson

100

Ви можете використовувати Redux mapStateToPropsі connectз componentDidUpdate(prevProps, prevState, snapshot)гачком React .

Отже, в основному ваш код може виглядати так:

const mapStateToProps = (state) => ({ 
   specificProperty: state.specificProperty,
   // any props you need else
});

class YourComponent extends React.Component {
    render() {
      // render your component  
    }

    componentDidUpdate(prevProps, prevState, snapshot) {
        if (prevProps.specificProperty !== this.props.specificProperty) {
            // Do whatever you want
        }
    }
}

YourComponent = connect(mapStateToProps)(YourComponent);

2
Відповідає наданим тегам, потім
hellogoodnight

2
Приємно. Також можлива друкарська помилка? Ви маєте на увазі nextProps.specificProperty !== this.props.specificProperty?
python1981

1
@BrunoCarvalhal, якщо ти не використовуєш реакцію, можливо, кращий варіант, залежно від вашого JS Framework, ніж redux;)
FabienChn

4
Незначне оновлення до цього, componentWillUpdateбільше не слід використовувати з React 16. Рекомендованим підходом тепер є getDerivedStateFromProps .
wootencl

4
Залежить - може бути, getDerivedStateFromPropsякщо вам потрібен новий стан, але можливо, ви хочете використовувати componentDidUpdateдля трохи більшої універсальності.
Джонні Ретбоун,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.