Реагировать на собственное состояние набора от навигатора ящика до другого компонента - PullRequest
0 голосов
/ 31 октября 2018

На первом экране у меня есть компонент с некоторым списком продуктов, например, ProductListing.js. И на ящике навигатора у меня есть несколько флажков. Я хочу установить состояние ProductListing.js, когда нажимаю на любой флажок навигатора.

App.js

import React, {Component} from 'react';
import Router from './src/config/routes';
export default class App extends React.Component {
  render () {
    return (
      <Router/>
    );
  }
}

Router.js

export default DrawerNavigator({
Dashboard: {screen: Dashboard},
   CreateLogin: {screen: CreateLogin},
   Test: {screen: Test}
}, {
   contentComponent: SideMenu,
   drawerWidth: 300,
   drawerPosition: 'right'
 });

SideMenu.js

render () {
  const { data, searchTerm, searchAttribute, ignoreCase, checked } = this.state;
    return (
      <View style={styles.container}>
        <ScrollView>
          <View>
          <TextInput
                style={styles.search} placeholder={"Search"}
                onChangeText={searchTerm => this.setState({ searchTerm })} />

              <SearchableFlatList
                 data={data} searchTerm={searchTerm}
                searchAttribute={searchAttribute} ignoreCase={ignoreCase}
                renderItem={({ item, index }) => <CheckBox
                                                          title={item.name +' ('+ item.count+')'}
                                                          onPress={() => this.handleChange(item.id)}
                                                          checked={checked[item.id]} />
                                                      }
                keyExtractor={({id}, index) => index.toString()} />
          </View>
        </ScrollView>
        <View style={styles.footerContainer}>
          <Text>Apply filter by choosing filter values</Text>
        </View>
      </View>
    );
  }
}

ProductListing.js

constructor(props){
            super(props);
            this.state ={ isLoading: true,isloadmore: false, page :1,dataSource: [],countryFilter:0, gradesFilter:'',country:'',totalRecord:0};
       }

render(){
const { navigation } = this.props;
           return(
 <View style={{flexDirection:'column',paddingRight:8}}>
                        <Button
                          title='Filter'
                          buttonStyle={{backgroundColor:'#000000',borderRadius:2}}
                          onPress={() => navigation.dispatch(DrawerActions.openDrawer())}
                        />
                   </View>
 );

       }

Теперь по щелчку handleChange в SideMenu.js я хочу обновить состояние gradesFilter в ProductListing.js, где я обновляю свой список товаров.

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Вы можете передать параметры из ящика на экран Прибора с помощью параметров навигации. Для этого вам нужно использовать stackNavigator внутри вашего DrawerNavigator, например: Маршрутизатор:

const MyStack = StackNavigator({
  Dashboard: {screen: Dashboard},
  CreateLogin: {screen: CreateLogin},
  Test: {screen: Test}
});

const MyDrawer = DrawerNavigator({
  Main: { screen: MyStack }
},
  {
   contentComponent: SideMenu,
   drawerWidth: 300,
   drawerPosition: 'right'
 });

export const Router = StackNavigator({
  Login: {screen: Login},
  Drawer: {
     screen: MyDrawer,
     navigationOptions: { header: null } } //prevent double header
});

Теперь вы можете перемещаться и передавать параметры из логина, панели инструментов или любого другого экрана через ящик, например

_login() {
    this.props.navigation.navigate('Drawer', { parameter: userName });
}

И для использования этого параметра вам необходимо получить доступ:

  const { parameter } = this.props.navigation.state.params;

, который вы можете использовать в дальнейшем для установки состояния, например

this.setState({
productSelection: parameter)};

Другой подход может быть через обработчик слушателя / обратного вызова.

0 голосов
/ 01 ноября 2018

Вы можете легко достичь этого с помощью портала! Взгляните здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...