對於我正在編寫的反應組件,我正在使用redux來管理組件的狀態。我之前沒有真正使用過redux,所以我遇到了一些我寫過的減速器的問題。我的反應組件中的一個方法使得一個http請求通過一個簡單的動作函數將數據分派給reducer。然而,我爲這個reducer寫了另一個動作來從狀態中刪除條目,但是每當我使用這個動作時,reducer都會返回一個空數組。任何幫助表示讚賞。redux reducer在過濾狀態時返回空數組
減速器:
export function Weeklystate(state=[], action){
switch(action.type){
case 'ADD_PROVIDER':
return [...state, action.arr];
case 'REMOVE_PROVIDER':
const newstate = [...state];
return newstate.filter((provider) => provider[0].full_name.toLowerCase().indexOf(action.str) === -1);
default:
return state;
}
}
actions.js:
export function addProvider(arr){
return {
type: 'ADD_PROVIDER',
arr
};
}
export function removeProvider(str){
return {
type: 'REMOVE_PROVIDER',
str
};
}
組件方法:
getData(){
const { url, queries } = this.state;
let data_arr = [];
const que = queries.map(function(query){
let postquery = {
full_name: query.name,
date_start: query.startdate,
date_end: query.enddate
};
return axios.post(url, postquery);
});
axios.all(que).then((responses) => {
responses.forEach((response) => {
this.props.addProvider(response.data);
});
});
}
componentWillMount(){
this.getData();
this.props.removeProvider('Example Name here');
const { rawdata } = this.props;
return console.log(this.props);
}
個MaptoProps功能:
function mapStateToPropsBETA(state){
return {
rawdata: state.rawdata,
parseddata: state.parseddata
};
}
function mapDispatchtoProps(dispatch){
return bindActionCreators({
addProvider: addProvider,
removeProvider: removeProvider
}, dispatch);
}
export default connect(mapStateToPropsBETA, mapDispatchtoProps)(Weekly_Beta);
stores.js:
const WeeklyStore = createStore(reducer);
WeeklyStore.subscribe(() => {
console.log(WeeklyStore.getState());
});
export default WeeklyStore;
樣本數據:
[
[
{
first_name: "First Name Here...",
last_name: "Last Name Here...",
full_name: "Full Name Here",
date: "2016-01-17",
charges: {
cosmetic: 25000.00,
medical: 25000.00,
total: 50000.00
},
payments: 75000.00,
appointments: 99,
pk: 5
},
{
first_name: "First Name Here...",
last_name: "Last Name Here...",
full_name: "Full Name Here",
date: "2016-01-24",
charges: {
cosmetic: 25000.00,
medical: 25000.00,
total: 50000.00
},
payments: 75000.00,
appointments: 99,
pk: 5
},
],
[
{
first_name: "First Name Here...",
last_name: "Last Name Here...",
full_name: "Full Name Here",
date: "2016-01-17",
charges: {
cosmetic: 25000.00,
medical: 25000.00,
total: 50000.00
},
payments: 75000.00,
appointments: 99,
pk: 5
},
{
first_name: "First Name Here...",
last_name: "Last Name Here...",
full_name: "Full Name Here",
date: "2016-01-24",
charges: {
cosmetic: 25000.00,
medical: 25000.00,
total: 50000.00
},
payments: 75000,
appointments: 99,
pk: 5
},
]
];
UPDA TE:
我做了一些測試,並得到了一些奇怪的結果。我在控制檯內部執行了相同的代碼,並且我的一切都運行良好。但是,reducer仍然返回一個空數組。
更新#2:
一些進一步的疑難解答我想我可能會是什麼引起的狀態不當寫一個更好的想法後。我能夠讓擴散操作員工作,因此數據不可變性在這一點上不是什麼大問題。
但是,在排除故障時,我偶然發現了兩件事。當redux狀態改變時,保持我的redux狀態的組件道具不會被更新。爲了證實這一點,我使用了subscribe方法來給我狀態,每當一個動作被調度時。 rawdata
的字段填充了我在redux狀態下查找的數據,但是,數據未被推送到等效組件prop。
我注意到的第二件事是REMOVE_PROVIDER
操作不會調度,因爲訂閱方法不會在控制檯中報告任何內容。我不知道爲什麼會發生這種情況,但我認爲filter
也許可能是原因,因爲每當我嘗試調度動作時,redux狀態都保持不變。
在這一點上我相信我遇到的問題更多的是react-redux問題,而不是reducer本身的問題。我也冒着更新我的代碼片斷的反應,以反映我所看到的。
你不能改變狀態。需要創建一個'newState'然後返回它。 – Ryan27
那我該如何處理呢?我知道很多人建議使用傳播運算符來幫助實現這一目標,但由於某種原因,我無法讓它爲我工作。請注意,我對redux也很新。 – TechEmperor95
設置變量'let newState = state;'然後將過濾器應用於'newState',並返回'newState'。你在正確的軌道上。 – Ryan27