React Native - Как использовать навигацию по свойству FlatList? - PullRequest
1 голос
/ 27 февраля 2020

Мне хотелось бы знать, как я могу использовать React Navigation для свойства FlatList, где имя Stack.Screen происходит из файла .json.

И с этим, когда пользователь нажимает на этот элемент, они переходят на другую страницу приложения.

Данные

{
  Data: [
    {
      "key": "0",
      "label": "Test",
      "goTo": "Test", <--- Here goes the name of Stack.Screen from routes.js
    }
  ]
}

Структура FlatList

function Item({ label, goTo }) {
  return (
    <Ripple rippleCentered onPressIn={goTo}> // (react-native-material-ripple)
      <Option>
        <Icon name={onIcon} size={28} color={onColor} /> // (react-native-vector-icons)
        <OptionLabel color={onColor}>{label}</OptionLabel>
      </Option>
    </Ripple>
  );
}

Я уже пытался использовать navigation.navigate({goTo}) свойство onPressIn от Ripple, но появляется ReferenceError: Не удается найти переменную: navigation

Конечный экспортируемый компонент

export default class Menu extends Component {
  render() {
    return (
      <Container color={this.props.color}>
        <FlatList
          data={Data}
          showsVerticalScrollIndicator={false}
          keyExtractor={item => item.key}
          numColumns={5}
          columnWrapperStyle={Styles.Row}
          renderItem={({ item }) =>
            <Item
              goTo={item.goTo}
              label={item.label}
            />
          }
        />
      </Container>
    );
  }
}

1 Ответ

0 голосов
/ 27 февраля 2020

Чтение из json файла

import json from './myfile.json'; // reading from json file

export default class Menu extends Component {
  render() {
    return (
      <Container color={this.props.color}>
        <FlatList
          data={json.Data} // accessing Data from json
          showsVerticalScrollIndicator={false}
          keyExtractor={item => item.key}
          numColumns={5}
          columnWrapperStyle={Styles.Row}
          renderItem={({ item }) =>
            <Item
              goTo={item.goTo}
              label={item.label}
            />
          }
        />
      </Container>
    );
  }
}

Навигация

Вы можете использовать useNavigation для вызова navigation.navigate(goTo)

например

import { useNavigation } from '@react-navigation/native';

function Item({ label, goTo }) {
  const navigation = useNavigation(); // navigation hook

  return (
    <Ripple rippleCentered onPressIn={() => navigation.navigate(goTo)}> // navigate to goTo screen
      <Option>
        <Icon name={onIcon} size={28} color={onColor} />
        <OptionLabel color={onColor}>{label}</OptionLabel>
      </Option>
    </Ripple>
  );
}

Обратите внимание, что Menu должно быть меньше NavigationContainer, чтобы useNavigation мог работать.

...