代码之家  ›  专栏  ›  技术社区  ›  MJM

反应导航不改变屏幕

  •  0
  • MJM  · 技术社区  · 7 年前

    我试图通过单击平面列表中的元素导航到另一个屏幕(艺术家)。此平面列表包含艺术家实例,如\u renderListItem方法中设置的。到目前为止我已经试过了 不同的方法(目前有两种方法被注释掉),但似乎都不起作用:

    方法1:导航操作

    方法3:Navigator.push

    import React, { Component } from 'react';
    import { PropTypes } from 'prop-types';
    import Artist  from './Artist';
    import { createStackNavigator, withNavigation, NavigationActions } from 'react-navigation';
    import {
      ScrollView,
      StyleSheet,
      View,
      Text,
      Image,
      FlatList,
      ActivityIndicator,
      TouchableOpacity,
      TouchableHighlight,
    } from 'react-native';
    
    export default class LinksScreen extends React.Component {
      constructor(props) {
        super(props);
        this._onAlertTypePressed = this._onAlertTypePressed.bind(this);
      }
    
      _onAlertTypePressed(typeId: string, typeName: string, imageUrl: string) {
        console.log(typeId)
        console.log(typeName)
        console.log(imageUrl)
    
    // NavigationActions
        // NavigationActions.navigate({
        //                 routeName: 'Artist',
        //                 params: { itemId: typeId, itemName: typeName, itemImageUrl: imageUrl,},
        //               });
    
    // NAVIGATE
         this.props.navigation.navigate('HomeStack',{},
         {
           type: "Navigate",
           routeName: "Artist",
           params: {
             itemId: typeId,
             itemName: typeName,
             itemImageUrl: imageUrl}
                 }
               );
    
    // PUSH
      //     this.props.navigator.push({
      //       screen: 'Artist',
      //       title: 'Artist',
      //       passProps: {
      //         itemId: typeId,
      //         itemName: typeName,
      //         itemImageUrl: imageUrl,
      //       },
      //     });
      }
    
      _renderListItem = ({item}) => (
        <Artist
          itemId={item.id}
          itemName={item.title.rendered}
          itemImageUrl={
            item.better_featured_image
              ? item.better_featured_image.source_url
              : 'http://54.168.73.151/wp-content/uploads/2018/04/brand-logo.jpg'
          }
          onPressItem={this._onAlertTypePressed}
        />
      );
    
      static navigationOptions = {
        title: 'Links',
      };
    
      state = {
        data: [],
        isLoading: true,
        isError: false,
      };
    
      // static propTypes = {
      //   navigation: PropTypes.shape({
      //     navigate: PropTypes.func.isRequired,
      //   }).isRequired,
      // };
    
      componentWillMount() {
        fetch('http://54.168.73.151/wp-json/wp/v2/pages?parent=38&per_page=100')
          .then(response => response.json())
          .then(responseJson => {
            responseJson.sort(
              (a, b) => (a.title.rendered < b.title.rendered ? -1 : 1)
            );
            this.setState({
              data: responseJson,
              isLoading: false,
              isError: false,
            });
          })
          .catch(error => {
            this.setState({
              isLoading: false,
              isError: true,
            });
            console.error(error);
          });
      }
    
    // Not used anymore.
      renderRow = item => (
        <View style={styles.grid}>
          <Image
            style={styles.thumb}
            source={{
              uri: item.better_featured_image
                ? item.better_featured_image.source_url
                : 'http://54.168.73.151/wp-content/uploads/2018/04/brand-logo.jpg',
            }}
          />
          <Text style={styles.title}>{item.title.rendered}</Text>
        </View>
      );
    
      getKey = item => String(item.id);
    
      renderComponent() {
        if (this.state.isLoading) {
          return <ActivityIndicator />;
        } else if (this.state.isError) {
          return <Text>Error loading data</Text>;
        } else {
          return (
            <FlatList
              numColumns={3}
              contentContainerStyle={styles.elementsContainer}
              data={this.state.data}
              renderItem={this._renderListItem}
              keyExtractor={this.getKey}
            />
          );
        }
      }
    
      render() {
        return (
          <View style={styles.container}>
            <Text
              style={{
                fontSize: 20,
                color: '#FFFFFF',
                marginLeft: 4,
                marginTop: 10,
              }}>
              RESIDENTS
            </Text>
            {this.renderComponent()}
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        backgroundColor: '#000000',
      },
      elementsContainer: {
        backgroundColor: '#000000',
      },
      grid: {
        marginTop: 15,
        marginBottom: 15,
        marginLeft: 5,
        height: 125,
        width: 115,
        borderBottomWidth: 1,
        borderBottomColor: '#191970',
      },
      title: {
        color: '#FFFFFF',
        textAlign: 'left',
        fontSize: 12,
      },
      thumb: {
        height: 110,
        width: 110,
        resizeMode: 'cover',
      },
    });
    

    艺术家.js

    _onPress() 方法似乎正在工作(此处预期的参数值正确),但我无法导航到此屏幕。

    import React, { Component } from 'react';
    import { createStackNavigator } from 'react-navigation';
    import {
      ScrollView,
      StyleSheet,
      View,
      Text,
      TouchableOpacity,
      Image,
    } from 'react-native';
    
    class Artist extends React.PureComponent {
    
      _onPress = () => {
         // console.log(this.props)
    
         const itemId = this.props.itemId
         const itemName = this.props.itemName
         const itemImageUrl = this.props.itemImageUrl
    
        console.log(itemId)
        console.log(itemName)
        console.log(itemImageUrl)
    
    // FOR PUSH
      //   this.props.onPressItem(
      //     this.props.itemid,
      //     this.props.itemName,
      //     this.props.itemImageUrl,
      //   );
      // };
    }
    
      static navigationOptions = {
        title: 'Artist',
      };
    
      render() {
        return (
          <TouchableOpacity
            {...this.props}
            style={styles.grid}
            onPress={this._onPress}>
            <Image
              style={styles.image}
              source={{uri: this.props.itemImageUrl}}
            />
            <Text style={styles.title}>{this.props.itemName}</Text>
          </TouchableOpacity>
        );
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        backgroundColor: '#000000',
      },
      grid: {
        marginTop: 15,
        marginBottom: 15,
        marginLeft: 5,
        height: 125,
        width: 115,
        borderBottomWidth: 1,
        borderBottomColor: '#191970',
      },
      title: {
        color: '#FFFFFF',
        textAlign: 'left',
        fontSize: 12,
      },
      image: {
        height: 110,
        width: 110,
        resizeMode: 'cover',
      },
    });
    
    export default Artist;
    

    MainTabNavigator.js网站

    import React from 'react';
    import { Platform, AppRegistry } from 'react-native';
    import { createStackNavigator, createBottomTabNavigator } from 'react-navigation';
    
    import TabBarIcon from '../components/TabBarIcon';
    import HomeScreen from '../screens/HomeScreen';
    import LinksScreen from '../screens/LinksScreen';
    import SettingsScreen from '../screens/SettingsScreen';
    import Artist from '../screens/Artist';
    
    const HomeStack = createStackNavigator({
      Home: {
        screen: HomeScreen,
      },
      Links: {
        screen: LinksScreen,
      },
      Artist: {
        screen: Artist,
      },
    });
    
    AppRegistry.registerComponent('ParamsRepo', () => HomeStack);
    
    export default HomeStack;
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   needsleep    7 年前

    尝试将代码简化如下:

    this.props.navigation.navigate('Artist',
        {
         itemId: typeId,
         itemName: typeName,
         itemImageUrl: imageUrl
        }
    });
    
    推荐文章