Реагировать | Компонент не показывает обновленное состояние

Я пытаюсь обновить состояние компонента реакции на основе свойств.

У меня есть этот файл, который является основным дочерним компонентом экрана:

RoomsList.js

import React from 'react';
import { View, ActivityIndicator, StyleSheet } from 'react-native';
import {connect} from "react-redux";

import {getRooms} from "../../store/actions";
import RoomIcon from "../RoomIcon/RoomIcon";

class RoomList extends React.Component {
    componentDidMount() {
        this.props.onGetRooms();
    }

    renderRooms() {
        return this.props.rooms.map(room => {
            return (
                <RoomIcon key = {room.id} room = {room} />
            )
        });
    }

    render() {
        return (
            <View style = {styles.container}>
                { this.props.rooms.length ? this.renderRooms() : <ActivityIndicator /> }
            </View>
        )
    }
}

const styles = StyleSheet.create({
    container: {
        flexDirection: 'row',
        width: '100%',
        justifyContent: 'space-between',
        flexWrap: 'wrap',
    }
});

const mapStateToProps = state => {
    return {
        rooms: state.rooms.rooms
    }
};

const mapDispatchToProps = dispatch => {
    return {
        onGetRooms: () => dispatch(getRooms())
    }
};

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

Редуктор комнат

import { SET_ROOMS } from '../actions/actionTypes';

const initialState = {
    rooms: []
};

const roomsReducer = (state = initialState, action) => {
    switch (action.type) {
        case SET_ROOMS:
            return {
                ...state,
                rooms: action.rooms
            };
        default:
            return state;
    }
};

export default roomsReducer;

Когда состояние обновляется в функции mapStateToProps, я могу подтвердить, что это происходит, поскольку я помещаю туда журнал консоли, чтобы получить комнаты, и объект является обновленным объектом.

Однако похоже, что рендеринг на самом деле не обновляется, хотя состояние обновляется. Я попытался сделать componentWillReceiveProps и назначить состояние, но на самом деле состояние здесь никогда не обновляется.

Действие комнат

import {SET_ROOMS} from './actionTypes';
import store from "../index";

export const getRooms = () => {
    return dispatch => {
        fetch("http://localhost/rooms").catch(err => {
            console.info(err)
        }).then(res => {
            res.json();
        }).then(parsedRes => {
            dispatch(setRooms(parsedRes));
        })
    }
};

export const addRoom = (roomName, roomDescription) => {
    const rooms = store.getState().rooms.rooms;

    const room = {
        room_name: roomName,
        room_description: roomDescription
    };

    return dispatch => {
        fetch("http://localhost/rooms", {
            method: 'POST',
            headers: {
               'Content-Type': 'application/json',
            },
            body: JSON.stringify(room)
        }).catch(err => {
            console.info(err)
        }).then(res => res.json())
        .then(parsedRes => {
            rooms.push(parsedRes);

            dispatch(setRooms(rooms));
        })
    }
};

export const setRooms = rooms => {
    return {
        type: SET_ROOMS,
        rooms: rooms
    }
};

Инициализация Redux Store

import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import reducers from './reducers';

const composeEnhancers = compose;

const store = createStore(reducers, composeEnhancers(applyMiddleware(thunk)));

export default store;

Инициализация редукторов

import {combineReducers} from "redux";
import lightsReducer from "./lights";
import roomsReducer from "./rooms";
import modalsReducer from "./modals";

export default combineReducers({
    lights: lightsReducer,
    rooms: roomsReducer,
    modals: modalsReducer
});

Когда вы регистрируете реквизит, что вы получаете?

Colin Ricardo 10.12.2018 21:06

Привет, @Colin, если вы имеете в виду метод mapStateToProps и ведение журнала внутри него, я получаю недавно обновленный объект с добавленным объектом комнаты

user8116198 10.12.2018 21:12

Извините, надо было быть более конкретным. Я имею ввиду в render, когда вы регистрируете, что вы получаете?

Colin Ricardo 10.12.2018 21:19

Внутри рендера я получаю только начальный реквизит. Если я вхожу в журнал, этот журнал консоли больше никогда не вызывается

user8116198 10.12.2018 21:21

@Colin, поэтому внутри функции mapStateToProps я веду консольный журнал. Там я могу видеть, как обновляется состояние, когда я добавляю новую комнату. Однако это не похоже на реальный компонент. Я попытался вывести из системы все данные внутри метода рендеринга, но, похоже, ничего не произошло. Я отображаю, не переходя к дочернему компоненту, и все же состояние компонента, похоже, не отражает того, что на самом деле происходит с состоянием redux.

user8116198 10.12.2018 23:00

ваш код кажется нормальным, поэтому я предполагаю, что редуктор делает что-то не так. можешь поделиться кодом редуктора?

Ji aSH 11.12.2018 00:10

Привет, @AshKander, я обновил сообщение, добавив редуктор

user8116198 11.12.2018 23:15

Редуктор вроде тоже в порядке. Можете показать код функции getRooms? Я вижу, что ваш редуктор обрабатывает только тип действия SET_ROOMS. Это тип, возвращаемый getRooms?

Niels Ladekarl 11.12.2018 23:26

Привет, @NielsLadekarl. Я вставил это сейчас, извините. Наверное, надо было все это поставить на первое место!

user8116198 12.12.2018 09:18

@ tallent123 действие тоже вроде нормально. Я вижу на вашей картеStateToProps, что вы получаете доступ к комнатам через state.rooms.rooms. Это потому, что вы используете combReducers? Извините за вопрос, но не могли бы вы показать, как вы инициализируете хранилище redux?

Niels Ladekarl 12.12.2018 10:31

@NielsLadekarl извини, что это заняло так много времени. Я обновил исходный вопрос с инициализацией редуктора и магазином

user8116198 12.12.2018 19:40

Итак, после небольшой отладки я вернул данные из API как все комнаты. Установка этого параметра, как казалось, фактически обновляла комнаты на главном экране. Единственное различие, которое я мог сказать, заключалось в том, что когда созданная мной комната была помещена в массив, некоторые ключи были в другом порядке. Повлияет ли это на это?

user8116198 12.12.2018 19:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
12
65
0

Другие вопросы по теме