Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Redux操作中的JSON.stringify()?_Redux_React Redux_Immutability - Fatal编程技术网

理解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以减少初始状态属性,但是当我重置时,我需要验证它吗?这有什么问题吗@约书亚·戴克