React-native-router-flux: Динамическая установка стиля navigationBarStyle в хуке жизненного цикла сцены

Созданный на 9 авг. 2016  ·  9Комментарии  ·  Источник: aksonov/react-native-router-flux

Я хочу тематизировать свои сцены на основе данных, полученных из базы данных. Та же сцена может отображать панель навигации розового, фиолетового, синего цвета и т. Д. В зависимости от того, что пользователь настроил в своих настройках.

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

Можно ли установить navigationBarStyle динамически на самой сцене, то есть в ловушке жизненного цикла после получения данных, вместо того, чтобы определять его заранее на уровне маршрутизатора, где определено <Scene key="scene-name" /> ?

question

Самый полезный комментарий

Да, вы можете обновить реквизиты с помощью Actions.refresh (). Пример:
Actions.refresh ({renderRightButton: this._renderRightButton});
https://github.com/aksonov/react-native-router-flux/blob/master/docs/OTHER_INFO.md

Все 9 Комментарий

Точно так же я хочу использовать динамическую правую кнопку на панели навигации, которая отображает лист действий с действиями, которые зависят от данных. Подумайте ... Follow userABC123 ; Block userABC123 ; и т.д. Есть ли способ динамически сгенерировать функцию onRight в ловушке жизненного цикла (т.е. после получения данных) для создания настраиваемого листа действий?

Да, вы можете обновить реквизиты с помощью Actions.refresh (). Пример:
Actions.refresh ({renderRightButton: this._renderRightButton});
https://github.com/aksonov/react-native-router-flux/blob/master/docs/OTHER_INFO.md

@sheparddw правильный. Таким же образом вы можете обновить navigationBarStyle с помощью Actions.refresh({navigationBarStyle ... }) .

Куда поместить вызов Actions.refresh ()?
Когда я помещаю вызов обновления в свое действие потока (которое вызывается, когда должно быть изменение стиля), он обновляет только стиль навигационной панели на текущей выбранной вкладке. Когда я переключаю вкладки, он возвращается к старому стилю.

Единственный компонент, который обновляется всякий раз, когда я переключаю вкладки, - это моя панель вкладок, поэтому я попытался поместить обновление в свой компонент панели вкладок в componentWillReceiveProps или componentWillUpdate . Тогда я получаю бесконечную рекурсию, потому что каждый раз, когда она обновляется, Tabbar получает новые реквизиты и обновляется снова.

@aksonov не

Я играл с Actions.refresh в своем компоненте, но не думаю, что это правильный способ динамического обновления свойств сцены. Вот мои выводы.

// Примечание: я использую класс es6, который расширяет Component

Если разместить Actions.refresh ({title: 'drawer'}); в конструкторе, то реагируем на жалобы следующим образом:

Предупреждение: setState (...): невозможно обновить во время существующего перехода состояния (например, в render или конструкторе другого компонента). Методы рендеринга должны полностью зависеть от свойств и состояния; побочные эффекты конструктора - это анти-шаблон, но их можно переместить в componentWillMount .

Это всего лишь предупреждение и мы добиваемся желаемого результата. Однако есть побочный эффект - функция рендеринга вызывается дважды, когда мы это делаем.

Если мы поместим это напрямую в функцию componentWillMount, то response не выдаст никаких предупреждений, но render также вызывается дважды.

Если мы сделаем это в конструкторе:
this.props.navigationState.title = 'test';

тогда реакция не будет жаловаться, и название нашей панели навигации будет проверено. Метод рендеринга будет вызван только один раз. То же самое касается вызова onRight, onRightTitle и т. Д. Теперь все в соответствии с этим https://facebook.github.io/react/docs/jsx-spread.html#mutating -props-is-bad мутировать реквизиты - это плохо.

Итак, вы можете либо изменить свойства, что плохо, либо вы можете вызвать Actions.refresh и получить побочные эффекты, такие как двойной рендеринг компонента ... Есть идеи?

Есть обновления по этому поводу? У меня такая же проблема, когда я пытаюсь динамически установить navigationBarStyle в зависимости от свойств пользователя. В частности, я пытаюсь изменить цвет фона панели навигации. Actions.refresh({navigationBarStyle ... }) тоже не работает.

<Scene key="myScene"
component={myComponent}
renderTitle={() => { return <NavigationBarTitle title="My Title"/>}}
sceneStyle={styles.scene}
navigationBarStyle={[styles.navBar, this.props.theme.backgroundColor]} <- backgroundColor не обновляется при изменении состояния
onRight={this.pushNoticeFilter}/>

Мне удалось динамически отображать разные заголовки и стили в моем настраиваемом компоненте заголовка панели навигации, но navigationBarStyle не отслеживает изменения состояния.

Имеет ли это какое-то отношение к тому, что RNRF игнорирует повторные рендеры сцен, когда он печатает «Key myScene is already defined!»?

@mikaelrosquist @compojoom Я использую redux для хранения «тем», которые я получаю с сервера. Самый простой способ, который я нашел, сделать стили динамической панели навигации - просто создать компонент-оболочку.

import React, { Component } from 'react';
import { NavBar } from 'react-native-router-flux';
import Variables from 'market/app/styles/base';

class CircllyNavBar extends Component {
  render() {
    return (
      <NavBar {...this.props} navigationBarStyle={{ backgroundColor: Variables.BRAND_PRIMARY() }} />
    )
  }
}

export default CircllyNavBar;
<Scene key="search_form" title="Search"
    component={SearchForm}
    navBar={CircllyNavBar} />

@OhaiBBQ Спасибо! Прекрасно работает! 👍

@mikaelrosquist Нет проблем. Еще одна вещь, которая мне показалась интересной (поскольку я новичок в React), заключалась в том, что вы можете установить свойства по умолчанию для сцены RNRF, используя свойство defaultProps class компонента React.

class Scene extends RNRFScene { }

Scene.defaultProps = {
  navBar: CircllyNavBar
};
Была ли эта страница полезной?
0 / 5 - 0 рейтинги

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

kennethlynne picture kennethlynne  ·  38Комментарии

maitriyogin picture maitriyogin  ·  34Комментарии

asd8855 picture asd8855  ·  36Комментарии

brandon-dewitt picture brandon-dewitt  ·  40Комментарии

AlmogRnD picture AlmogRnD  ·  39Комментарии