Я пытаюсь обновить состояние компонента реакции на основе свойств.
У меня есть этот файл, который является основным дочерним компонентом экрана:
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, если вы имеете в виду метод mapStateToProps и ведение журнала внутри него, я получаю недавно обновленный объект с добавленным объектом комнаты
Извините, надо было быть более конкретным. Я имею ввиду в render, когда вы регистрируете, что вы получаете?
Внутри рендера я получаю только начальный реквизит. Если я вхожу в журнал, этот журнал консоли больше никогда не вызывается
@Colin, поэтому внутри функции mapStateToProps я веду консольный журнал. Там я могу видеть, как обновляется состояние, когда я добавляю новую комнату. Однако это не похоже на реальный компонент. Я попытался вывести из системы все данные внутри метода рендеринга, но, похоже, ничего не произошло. Я отображаю, не переходя к дочернему компоненту, и все же состояние компонента, похоже, не отражает того, что на самом деле происходит с состоянием redux.
ваш код кажется нормальным, поэтому я предполагаю, что редуктор делает что-то не так. можешь поделиться кодом редуктора?
Привет, @AshKander, я обновил сообщение, добавив редуктор
Редуктор вроде тоже в порядке. Можете показать код функции getRooms? Я вижу, что ваш редуктор обрабатывает только тип действия SET_ROOMS. Это тип, возвращаемый getRooms?
Привет, @NielsLadekarl. Я вставил это сейчас, извините. Наверное, надо было все это поставить на первое место!
@ tallent123 действие тоже вроде нормально. Я вижу на вашей картеStateToProps, что вы получаете доступ к комнатам через state.rooms.rooms. Это потому, что вы используете combReducers? Извините за вопрос, но не могли бы вы показать, как вы инициализируете хранилище redux?
@NielsLadekarl извини, что это заняло так много времени. Я обновил исходный вопрос с инициализацией редуктора и магазином
Итак, после небольшой отладки я вернул данные из API как все комнаты. Установка этого параметра, как казалось, фактически обновляла комнаты на главном экране. Единственное различие, которое я мог сказать, заключалось в том, что когда созданная мной комната была помещена в массив, некоторые ключи были в другом порядке. Повлияет ли это на это?





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