Реагировать на собственное представление списка без отображения данных - PullRequest
0 голосов
/ 18 ноября 2018

Я занимаюсь разработкой простого iOS-приложения React для изучения React Native, и это мое первое приложение-реагирование.Сейчас я практикую использование ListView.Но кажется, что элементы загружаются в виде списка, но данные не отображаются.

Это мой редуктор

import * as AlbumListActions from '../actions/AlbumListActions';

const defaultState = {
    albums: [ ],
    loading: false,
    message: null
}

export default albumListReducer = (state = defaultState, action) => {
    switch (action.type) {
        case AlbumListActions.ALBUMS_START_FETCHING_ALBUMS:
            return { ...state, loading: true, albums: [ ] }
            break;

        case AlbumListActions.ALBUMS_COMPLETE_FETCHING_ALBUMS:
            return { ...state, loading: false, albums: action.payload }
            break;

        case AlbumListActions.ALBUMS_CATCH_FETCHING_ALBUMS:
            return { ...state, loading: false, message: action.payload }
            break;

        default:
            return { ...state };
    }
}

Это моё действие

import Axios from 'axios';

export const ALBUMS_START_FETCHING_ALBUMS = "(albums) start fetching albums";
export const ALBUMS_COMPLETE_FETCHING_ALBUMS = "(albums) complete fetching albums";
export const ALBUMS_CATCH_FETCHING_ALBUMS = "(albums) catch fetching albums";

export const completeFetchingAlbums = (data) => {
    return {
        type: ALBUMS_COMPLETE_FETCHING_ALBUMS,
        payload: data
    }
}

export const catchFetchingAlbums = (data) => {
    return {
        type : ALBUMS_CATCH_FETCHING_ALBUMS,
        payload: data
    }
}

export const fetchAlbums = (data) => {
    return (dispatch) => {
        dispatch({
            type: ALBUMS_START_FETCHING_ALBUMS
        });

        return Axios.get("http://rallycoding.herokuapp.com/api/music_albums").then((response) => {
            dispatch(completeFetchingAlbums(response.data));
        }).catch((error) => {
            dispatch(catchFetchingAlbums("Unable to fetch data from the server"));
        })
    }
}

Это мой список отображения компонентов.

class AlbumList extends React.Component {
    componentWillMount() {
        this.props.fetchAlbums();
    }

    renderAlbumItem = (album) => {
        return (
                <View style={styles.container}>
                    <Text>{album.title}</Text>
                </View>
            )
    }

    render() {
        return (
            <View>
            <FlatList
                data={this.props.albums}
                renderItem={this.renderAlbumItem}
                keyExtractor={(album) => album.title}
            />
            </View>
        )
    }
}

const mapStateToProps = state => {
    return state.albumList;
}

const mapDispatchToProps = (dispatch, ownProps) => {
    return bindActionCreators({
        fetchAlbums : AlbumListActions.fetchAlbums
    }, dispatch)
}

export default connect(mapStateToProps, mapDispatchToProps)(AlbumList);

КогдаЯ запускаю свое приложение, оно ничего не отображает.Что не так и как я могу это исправить?

1 Ответ

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

Подпись для renderItem неверна.Он принимает объект, одно из его свойств - item, в котором содержится альбом, который вы пытаетесь воспроизвести.

Чтобы заставить его работать, измените renderItem следующим образом:

renderAlbumItem({item}) => {
    return (
            <View style={styles.container}>
                <Text>{item.title}</Text>
            </View>
        )
}

Вы также можете переименовать item в album - renderAlbumItem({item: album}).Этот синтаксис называется деструктуризацией объектов, вы можете найти объяснение в Google.В этом случае используйте {album.title} для доступа к заголовку.

...