В mapStateToProps
,
const mapStateToProps = (state) => {
return state;
};
state
следует разделить в соответствии с reducers
. Это из-за combineReducers
.
Итак, когда вы хотите получить фактическое состояние при использовании combineReducers
, вам придется сделать что-то вроде этого -
const mapStateToProps = (state) => {
return state.address; // or state.question
};
Если вы хотите отправить все данные о состоянии (т. Е. Принадлежащие обоим редукторам), вы можете сделать что-то вроде этого -
const mapStateToProps = (state) => {
return Object.assign({}, state.address, state.question);
};
или вам придется обработать его в коде reducer
.
ПРИМЕЧАНИЕ: Я не пробовал, вам нужно быть осторожным при этом, потому что, поскольку создается отдельный объект, это может вызвать проблемы с обновлением.
РЕДАКТИРОВАТЬ: Некоторые думали о реализации.
PS: Я думаю, что reducer
дизайн не правильный. Я имею в виду, что оба редуктора address
и questions
имеют одинаковое начальное состояние. Поэтому, когда вы делаете combineReducer()
, store.getState()
(т.е. состояние магазина) становится примерно таким -
state = {
address: {
questions: [{
title: 'What is the address of the property?',
id: 0,
question_type: 'address'
}],
sessionID: 1234,
session: {},
currentQuestion: defaultQuestion,
currentAnswer: '',
addressSelectd: false,
amount: 0,
address: {
address: {},
isPendind: false,
isRejected: false,
isFulfilled: false,
message: '',
}
},
questions: {
questions: [{
title: 'What is the address of the property?',
id: 0,
question_type: 'address'
}],
sessionID: 1234,
session: {},
currentQuestion: defaultQuestion,
currentAnswer: '',
addressSelectd: false,
amount: 0,
address: {
address: {},
isPendind: false,
isRejected: false,
isFulfilled: false,
message: '',
}
}
};
а не это -
state = {
questions: [{
title: 'What is the address of the property?',
id: 0,
question_type: 'address'
}],
sessionID: 1234,
session: {},
currentQuestion: defaultQuestion,
currentAnswer: '',
addressSelectd: false,
amount: 0,
address: {
address: {},
isPendind: false,
isRejected: false,
isFulfilled: false,
message: '',
}
}
Я бы настоятельно рекомендовал вам перенести вещи общего состояния (например, currentAnswer
и currentQuestion
) в отдельный редуктор.
Редактировать 2: Я только что проверил это с помощью следующего кода, что Object.assign()
не является правильным решением.
var address = {
questions: [{
title: 'What is the address of the property?',
id: 0,
question_type: 'address'
}],
sessionID: 12345,
session: {},
currentQuestion: defaultQuestion,
currentAnswer: '',
addressSelectd: false,
amount: 0,
address: {
address: {},
isPendind: false,
isRejected: false,
isFulfilled: false,
message: ''
}
};
var questions = {
questions: [{
title: 'What is the address of the property?',
id: 0,
question_type: 'address'
}],
sessionID: 1234,
session: {},
currentQuestion: defaultQuestion,
currentAnswer: '',
addressSelectd: false,
amount: 0,
address: {
address: {},
isPendind: false,
isRejected: false,
isFulfilled: false,
message: ''
}
};
var result = Object.assign({}, address, questions);
console.log(result);
Выход -
{
"questions": [
{
"title": "What is the address of the property?",
"id": 0,
"question_type": "address"
}
],
"sessionID": 1234,
"session": {},
"currentQuestion": {
"title": "What is the address of the property?",
"id": 0,
"question_type": "address"
},
"currentAnswer": "",
"addressSelectd": false,
"amount": 0,
"address": {
"address": {},
"isPendind": false,
"isRejected": false,
"isFulfilled": false,
"message": ""
}
}
Здесь address
имеет sessionID: 12345
, тогда как questions
имеет sessionID: 1234
, но result
имеет sessionID: 1234
.
Таким образом, Object.assign()
заменяет значения, установленные address
, значениями question
. Вот почему это похоже на работу.
Правильным способом было бы перепроектировать редуктор так, чтобы он имел общее состояние в новом редукторе.