2016-05-30 2 views
2

Мое приложение использует Navigator для маршрутизации и переходов на экран.Как обновить компонент, когда навигатор возвращается к нему?

Первый экран имеет список предметов. Когда пользователь удаляет элемент, он открывает подробный экран, на котором пользователь может его редактировать.

Когда пользователь закончил редактирование и вернулся (функция popigator's pop()), список не отражает изменения, сделанные пользователем. Экран нужно снова загрузить, чтобы отобразить обновленный список.

Есть ли способ заставитьОбновить компонент в стеке Навигатора?

Я пробовал использовать «Навигатор onWillFocus» Navigator, я могу console.log маршрут, но не знаю, как получить ссылку на экран, который представлен маршрутом, и заставить его обновить ,

Это правильно регистрирует маршрут мы собираемся перейти к:

_onWillFocus(route) { 
     console.log('will transition to ' + route.name) 
}, 

...

<Navigator 
      ref={(ref) => this._navigator = ref} 
      style={{flex:1}} 
      configureScene={() => Navigator.SceneConfigs.FadeAndroid} 
      renderScene={this.renderScene} 
      onWillFocus={this._onWillFocus} 
/> 
+1

Не существует изменения состояния, которое должно вызывать 'render' из' ListView'? Если его нет, повторный рендеринг не должен иметь никакого эффекта и будет отображать старые данные, если вы не рендер не полагаетесь на мутации объектов, что не является способом «реагировать». –

+0

Ввод метода console.log в режиме «render» на экране списка подтверждает, что он фактически вызывается, когда пользователь возвращается на экран. Я просто понял, что делаю что-то глупое: источник данных определялся только один раз в getInitialState, но я нигде не добавлял код для его обновления. Единственный способ обновления данных состоял в том, что весь компонент был перезагружен. – amirfl

ответ

5

Предполагая, что вы действительно хотите использовать onWillFocus событие, потому что имеет наибольший смысл в вашем case, вот один из способов сделать это:

Измените свой метод renderScene, так что ссылка на предоставленный компонент сцены сохраняется (в то время как com Понент установлен):

renderScene(route, nav) { 
    var Component = route.component; 

    return (
    <Component 
     ref={component => { route.scene = component; }} 
     navigator={nav} 
     {...route.passProps} 
    /> 
); 
} 

Затем в onWillFocus обработчике вы можете направить событие компонента:

_onWillFocus(event) { 
    const { data: { route } } = event; 

    if (route.scene && route.scene.componentWillFocus) { 
    route.scene.componentWillFocus(event); 
    } 
} 

Наконец, в обработчике компонент componentWillFocus вы можете делать все, что вам необходимо обновить состояние и вызвать новый рендер.

Для других случаев применения, пожалуйста, посмотрите на https://facebook.github.io/react/tips/communicate-between-components.html

Для связи между двумя компонентами, которые не имеют отношения родитель-ребенок, вы можете создать свою собственную глобальную систему событий. Подпишитесь на события в componentDidMount(), отмените подписку в компонентеWillUnmount() и вызовите setState(), когда вы получаете событие. Паттерн потока является одним из возможных способов его организации.

+0

Я нашел ваш ответ, и я думаю, что это именно то, что мне нужно. Я немного потерялся в дескрипторе 'componentWillFocus' в принимающем компоненте. Как это событие реализовано? Можете ли вы поделиться примером? Невозможно понять, является ли это событием компонента или событием сцены Navigator. Благодаря! – Fernando

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