2016-07-02 2 views
1

Я установил новый образец/шаблонный проект для тестирования с использованием Meteor с React & MobX (с использованием архитектуры Mantra). Проект находится в https://github.com/markoshust/mantra-matui-mobxReact + MobX - обновление без повторного рендеринга до состояния

У меня возникла проблема, когда изменение состояния состояния State.header.title не отражает должным образом измененное изменение состояния при повторной визуализации.

Мое состояние строится втягивая простых объектов: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/stores/route.js

в один мастер наблюдаемого объекта: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/main.js#L8

Я Аукциона для изменения маршрута и вызова действия для обновления состояния: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/reactions/route.js#L10

Это действие обновляет состояние: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/actions/route.js#L5

Консоль выдает правильное изменение состояния, поэтому состояние обновляется должным образом. Однако компонент не перерисовывается с обновленным состоянием (эта строка - консоль. Log'ing old state val): https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/containers/Header.js#L6

Я вижу сообщение «update ...», поэтому компонент является повторной рендерингом, но, похоже, он все еще тянет в старом состоянии. Я добавил observer ко всем моим компонентам: https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/components/Header.js

+0

Я, кажется, исправили проблему с пользовательской withMobx композитора, единственное, что он делает ждет на следующем такте, чтобы сделать компонент. Любая идея, почему это исправляет это? Предполагается, что Mobx является синхронным. https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/libs/with_mobx.js#L5 –

+0

Я думаю, что 'State.header' является наблюдаемым, но не' State .header.title'. –

+0

Пробовал это, без изменений –

ответ

1

Мне нужно было создать собственный композитор для MobX. Я добавил прослушивание автозапуска для повторной компоновки компонента.

https://github.com/markoshust/mantra-matui-mobx/blob/master/client/modules/core/libs/with_mobx.js

import { compose } from 'mantra-core'; 
import { autorun } from 'mobx'; 

export default function composeWithMobx(fn, L, E, options) { 
    const onPropsChange = (props, onData) => { 
    const reactiveFn =() => fn(props, onData); 

    autorun(reactiveFn); 

    return reactiveFn(); 
    }; 

    return compose(onPropsChange, L, E, options); 
} 
+0

Привет, Марк, я только что прибыл в NL. Я видел, что некоторые ссылки в исходных ссылках нарушены. Если вы можете предоставить ссылки на исходный коммит, я с удовольствием рассмотрю оригинальное решение, чтобы выяснить, почему он не работает должным образом. – mweststrate

+0

Привет @mweststrate, спасибо, обновил ссылки! С тех пор, как я опубликовал, изменилось несколько вещей. Все работает сейчас, но только с composeWithRedux composer (который включает вызов autorun()). Должен ли мне не нужен автозапуск для этого? –

+0

Не думаю, что автозапуск должен быть в порядке. Обратите внимание, что возвращенный утилита лучше всего вызывать, когда компонент находится. – mweststrate

Смежные вопросы