理解Redux操作中的JSON.stringify()?
我试图重置数据,并想进入初始状态,我知道不变性在这一部分起着主要作用 下面是我的店铺数据(流程完成数据) 我想用以下数据替换它理解Redux操作中的JSON.stringify()?,redux,react-redux,immutability,Redux,React Redux,Immutability,我试图重置数据,并想进入初始状态,我知道不变性在这一部分起着主要作用 下面是我的店铺数据(流程完成数据) 我想用以下数据替换它 animalSense: { selectedVision: 'dayLight', selectedState: 'california', viewedVisions: ['dayLightcalifornia', 'dayLightsouthAfrica', 'nightVisioncalifornia'], viewedAni
animalSense: {
selectedVision: 'dayLight',
selectedState: 'california',
viewedVisions: ['dayLightcalifornia', 'dayLightsouthAfrica', 'nightVisioncalifornia'],
viewedAnimals: ['dog', 'cat']
},
animalSense: {
selectedVision: '',
selectedState: '',
viewedVisions: [''],
viewedAnimals: []
},
我知道下面的操作是添加初始数据的直接而正确的方法
export const RESET_ANIMAL_SENSES = 'actions/reset_animal_senses';
export default () => ({
type: RESET_ANIMAL_SENSES,
payload: {
selectedVision: '',
selectedState: '',
selectedAnimal: '',
viewedVisions: [''],
viewedAnimals: []
}
});
import { SELECT_VISION } from '../actions/select_vision_type';
import { CHANGE_ANIMAL_VIDEO_STATE } from '../actions/change_animal_video_state';
import { UPDATE_ANIMALS } from '../actions/update_animals';
import { RESET_ANIMAL_SENSES } from '../actions/reset_animal_senses';
export default (state = {}, action) => {
let newState = state;
switch (action.type) {
case SELECT_VISION:
newState = { ...state, ...action.payload };
break;
case CHANGE_ANIMAL_VIDEO_STATE:
newState = { ...state, ...action.payload };
break;
case UPDATE_ANIMALS:
newState = { ...state, ...action.payload };
break;
case RESET_ANIMAL_SENSES:
newState = { ...state, ...action.payload };
break;
default:
break;
}
return newState;
};
但上述动作保持相同状态e
下面的行动是有效的解决方案,但我不知道这是正确的方法
当我们使用stringify时,连接已经结束,新的状态已经添加,但是我不知道为什么没有JSON,这个功能就不能工作。stringify()?
减速器
export const RESET_ANIMAL_SENSES = 'actions/reset_animal_senses';
export default () => ({
type: RESET_ANIMAL_SENSES,
payload: {
selectedVision: '',
selectedState: '',
selectedAnimal: '',
viewedVisions: [''],
viewedAnimals: []
}
});
import { SELECT_VISION } from '../actions/select_vision_type';
import { CHANGE_ANIMAL_VIDEO_STATE } from '../actions/change_animal_video_state';
import { UPDATE_ANIMALS } from '../actions/update_animals';
import { RESET_ANIMAL_SENSES } from '../actions/reset_animal_senses';
export default (state = {}, action) => {
let newState = state;
switch (action.type) {
case SELECT_VISION:
newState = { ...state, ...action.payload };
break;
case CHANGE_ANIMAL_VIDEO_STATE:
newState = { ...state, ...action.payload };
break;
case UPDATE_ANIMALS:
newState = { ...state, ...action.payload };
break;
case RESET_ANIMAL_SENSES:
newState = { ...state, ...action.payload };
break;
default:
break;
}
return newState;
};
试试这个,我会对你的减速机进行大量的重构
import { SELECT_VISION } from '../actions/select_vision_type';
import { CHANGE_ANIMAL_VIDEO_STATE } from '../actions/change_animal_video_state';
import { UPDATE_ANIMALS } from '../actions/update_animals';
import { RESET_ANIMAL_SENSES } from '../actions/reset_animal_senses';
const initialState = {
selectedVision: '',
selectedState: '',
selectedAnimal: '',
viewedVisions: [''],
viewedAnimals: []
}
export default (state = initialState, action) => {
switch (action.type) {
// since all the cases have common code.
case SELECT_VISION:
case CHANGE_ANIMAL_VIDEO_STATE:
case UPDATE_ANIMALS: {
return { ...state, ...action.payload }
}
case RESET_ANIMAL_SENSES: {
return { ...initialState }
}
default: {
return state;
}
}
};
试试这个减速机。然而,目前我还不清楚为什么它会与stringify一起工作 有效载荷中的扩展运算符解决了此问题
export const RESET_ANIMAL_SENSES = 'actions/reset_animal_senses';
const data = {
selectedVision: '',
selectedState: '',
selectedAnimal: '',
viewedVisions: [''],
viewedAnimals: []
};
export default () => ({
type: RESET_ANIMAL_SENSES,
payload: { ...data } // here is the solution
});
所有商店更新都应该在减速机中完成。你能分享你的减速机来处理你的重置动作吗?是的,老兄,我的减速机工作得很好,我已经更新了我的问题你的所有属性都没有更新还是只是数组?从技术上讲,数组是通过引用传递的,这可能会起到一定的作用。使用JSON.stringify()技术(或者另一个例子是lodash的uz.deepClone)可以并且可能在这种情况下删除action对象中子数组之间的引用。刚刚在我的一个项目中处理了这个问题。只是想一想。不仅整个存储区的数组没有更新,在我的例子中,我在运行时添加了selectedAnimal以减少初始状态属性,但是当我重置时,我需要验证它吗?这有什么问题吗@约书亚·戴克