2015-06-28 11 views
5

Questa domanda riguarda le strategie per il passaggio degli oggetti dati attorno a diversi componenti.Come aggiornare gli oggetti di scena del percorso iniziale in un componente NavigatoriOS?

Nello screenshot qui sotto, ho un NavigatorIOS con un percorso iniziale di un ListComponent. Si trova in un menu laterale che visualizza un componente Filtri. Attualmente, il menu laterale è aperto e I filtri sono visibili.

Il mio obiettivo è che quando l'utente cambia le cose in Filtri, voglio aggiornare il ListComponent.

Potrei usare un oggetto singleton per memorizzare i filtri, ma ho ancora bisogno di trovare un modo per dire al ListComponent che hanno cambiato.

enter image description here

var defaultFilters = { 
invited: true, 
joined: false, 
public: true, 
private: false, 
} 

class MainTab extends Component { 

constructor(props){ 
    super(props); 

    this.props.filters = defaultFilters; 
} 

render() { 

    var onFilterChange = function (filters) { 
     console.log("filters changed"); 
    }; 

    var filtersComponent = (<Filters filters={this.props.filters} onFilterChange={onFilterChange.bind(this)} />); 

    return (
     <SideMenu menu = { filtersComponent } touchToClose={true} openMenuOffset={300} animation='spring'> 
      <NavigatorIOS 
       style={styles.container} 
       initialRoute={{ 
        title: 'List', 
        component: ListComponent 
       }} 

       /> 
     </SideMenu> 
    ); 
} 
} 

Risolto

var onFilterChange = function (filters) { 
     console.log("filters changed"); 

     this.refs.navigator.replace({ 
      title: 'List', 
      component: ListComponent, 
      passProps: { 
       filters: filters 
      } 
      }); 
    }; 

    <NavigatorIOS 
      ref='navigator' 
      ... 
      /> 
+0

Si consiglia di inviare la tua risposta come ... una risposta, perché è quella giusta. –

risposta

5

Il percorso ha un'opzione passProps che accetta un oggetto di oggetti di scena, in modo che è così che si passa puntelli nel componente nel navigatore. Potresti potenzialmente modificare lo stato MainTab in onFilterChange e inviarlo tramite passProps. In alternativa si consiglia di guardare il metodo replace sul navigatore.

https://facebook.github.io/react-native/docs/navigatorios.html

+0

Per il contesto, vedere https://github.com/facebook/react-native/issues/795. Quindi, non sarò in grado di avere 'ListComponent' che esegue automaticamente il rendering da una modifica di stato nel' MainTab'. Tuttavia, usando il tuo suggerimento di sostituire, ho avuto modo di funzionare. Aggiungerò la mia soluzione sopra. Grazie ancora, Colin! –

+0

Colin, si scopre anche che quando si tenta di "sostituire" con lo stesso componente, non accadrà nulla. In questo momento lo sto ingannando passando da due componenti diversi dello stesso codice esatto in modo che possa far apparire il mio elenco come auto-filtro. In seguito, pubblicherò una nuova domanda StackOverflow che descrive in dettaglio la mia mod e chiedo pensieri su una soluzione migliore. –

0

Uso del PO, joshua-lieberman, stessa risposta.

ha funzionato per me usando Navigator

var onFilterChange = function (filters) { 
    console.log("filters changed"); 

    this.refs.navigator.replace({ 
     title: 'List', 
     component: ListComponent, 
     passProps: { 
      filters: filters 
     } 
     }); 
}; 
... 
     <Navigator 
     ref='navigator' 
     ... 
     /> 

lo uso in componentDidMount

componentDidMount() { 
    this.changeInitialRoute(this.refs.navigator); 
} 

changeInitialRoute(navigator) { 
    const valet = this.props.valet; 
    if (valet && valet.user_id && valet.token) { 
     console.log('valet ready', this.props); 
     navigator.resetTo({title: 'Home', index: 0}); 
    } else { 
     navigator.resetTo({title: 'Login', index: 0}); 
    } 
} 
Problemi correlati