Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.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
Javascript 对我在redux中不可序列化的内容感到困惑(redux错误)_Javascript_Reactjs_React Native_Redux_Expo - Fatal编程技术网

Javascript 对我在redux中不可序列化的内容感到困惑(redux错误)

Javascript 对我在redux中不可序列化的内容感到困惑(redux错误),javascript,reactjs,react-native,redux,expo,Javascript,Reactjs,React Native,Redux,Expo,我的react native正在工作,此页面(屏幕)已经完成并完全工作,但由于某种奇怪的原因,现在它开始失败,出现了一个错误,即不可序列化保存剩余时间\u秒输入。我试图理解代码中什么是不可序列化的 错误: A non-serializable value was detected in the state, in the path: `intervalTimer.timer`. Value:, Timer { // code Take a look at the reducer(s) handl

我的react native正在工作,此页面(屏幕)已经完成并完全工作,但由于某种奇怪的原因,现在它开始失败,出现了一个错误,即
不可序列化
保存剩余时间\u秒输入。我试图理解代码中什么是不可序列化的

错误:

A non-serializable value was detected in the state, in the path: `intervalTimer.timer`. Value:, Timer {
// code
Take a look at the reducer(s) handling this action type: TIMER/SAVE_REST_SECONDS_INPUT.
**处理
SAVE\u REST\u SECONDS\u输入的减速机**

import { TIMER } from '../types.js';

const defaultState = {
  timer: null,
  active: true,
  updated: false,
  numberOfSets: 1,
  currentSet: 1,
  minutesInput: '',
  secondsInput: '',
  restMinutesInput: '',
  restSecondsInput: '',
  view: TIMER.INPUTS_VIEW,
  paused: false,
  rest_time: 0,
  rest_exercise: null
};

const intervalTimer = (state = defaultState, action) => {
  switch (action.type) {
// code
    case TIMER.SAVE_REST_SECONDS_INPUT: {
      return {
        ...state,
        restSecondsInput: action.payload,
      };
    }
//code
  }
};

export default intervalTimer;
下面的另一个错误:

A non-serializable value was detected in the state, in the path: `intervalTimer.timer`. Value:, Timer {
// code
Take a look at the reducer(s) handling this action type: TIMER/SAVE_REST_SECONDS_INPUT.
错误:不变量失败:在路径“intervalTimer.timer.\u startTime”的调度之间检测到状态突变。

在我的间隔计时器屏幕中,这是我唯一使用的
startTime

        const optionsActive = {
            startTime: parseInt(minutesInput || '0') * 60 * 1000 + parseInt(secondsInput || '1') * 1000, //how long the timer will be set to
            updateFrequency: 100,
            selfAdjust: true,
            countdown: true,
        };

        const optionsRest = {
            startTime: parseInt(restMinutesInput || '0') * 60 * 1000 + parseInt(restSecondsInput || '1') * 1000,
            updateFrequency: 100,
            selfAdjust: true,
            countdown: true,
        };
redux商店

const persistConfig = {
  key: 'root',
  storage: AsyncStorage,
  stateReconciler: autoMergeLevel2,
  blacklist: ['intervalTimer', 'creatingWorkout', 'creatingWorkoutPlan']
}

const persistedReducer = persistReducer(persistConfig, rootReducer)
export const store = configureStore({
  reducer: persistedReducer,
  enhancers: [Reactotron.createEnhancer()],
  middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(expoLogger),
    devTools: process.env.NODE_ENV !== 'production'
})
export const persistor = persistStore(store);
对不起,如果问题是noob。我试图理解为什么这是失败的,因为我认为一切都是可序列化的

编辑:这是它打印出来的
计时器的值

A non-serializable value was detected in the state, in the path: `intervalTimer.timer`. Value:, Timer {
  "_currentTime": 0,
  "_drift": 0,
  "_eventEmitter": EventEmitter {
    "_events": Object {
      "end": [Function anonymous],
      "update": [Function anonymous],
    },
    "_eventsCount": 2,
    "_maxListeners": undefined,
  },
  "_expected": 0,
  "_isPaused": false,
  "_isRunning": false,
  "_startTime": 0,
  "_timeAtStart": 0,
  "animationFrame": false,
  "countdown": true,
  "endTime": null,
  "off": [Function removeEventListener],
  "on": [Function addEventListener],
  "selfAdjust": true,
  "startTime": 5000,
  "updateFrequency": 100,
}, 

第一条错误消息表示
state.intervalTimer.timer
不可序列化。作为“可序列化”,我们考虑所有的地方:<代码> JSON.PARSE(JSON.SerialItValue(value))< /C> >将返回原始值,如字符串和数字等基本内容,以及数组和正常对象-但不是类实例。众所周知,这些值会导致中间件出现问题,如
redux persist
和devtools,我们对此提出警告

还可以看到

第二条错误消息是关于在减速机之外更改状态的内容,即更改值
state.intervalTimer.timer.\u startTime

这可能是由以下代码引起的

const obj={u startTime:0}
派遣(行动(obj))
//减速器现在将对象存储为状态
//现在您更改了相同的对象-在reducer之外,但更改了存储中的引用
对象开始时间=5
或者通过类似代码

const obj=useSelector(state=>state.\u startTime)
//现在您更改了相同的对象-在reducer之外,但更改了存储中的引用
对象开始时间=5

第一条错误消息表示
state.intervalTimer.timer
不可序列化。作为“可序列化”,我们考虑所有的地方:<代码> JSON.PARSE(JSON.SerialItValue(value))< /C> >将返回原始值,如字符串和数字等基本内容,以及数组和正常对象-但不是类实例。众所周知,这些值会导致中间件出现问题,如
redux persist
和devtools,我们对此提出警告

还可以看到

第二条错误消息是关于在减速机之外更改状态的内容,即更改值
state.intervalTimer.timer.\u startTime

这可能是由以下代码引起的

const obj={u startTime:0}
派遣(行动(obj))
//减速器现在将对象存储为状态
//现在您更改了相同的对象-在reducer之外,但更改了存储中的引用
对象开始时间=5
或者通过类似代码

const obj=useSelector(state=>state.\u startTime)
//现在您更改了相同的对象-在reducer之外,但更改了存储中的引用
对象开始时间=5

我不敢问这个问题,但我如何才能找到这个不可序列化的值的位置?我进入了
intervalTimer
的内部,其中必须有一个
计时器(我根据它的命名方式进行假设)。我还使用react本机调试器和redux调试设置。谢谢你的回答,它确实帮助我理解了什么是Serialable finally,我知道我的第二个问题很难回答,但我不知道怎么问,我不知道,因为你把所有可能设置
计时器的代码都放在那里了?你说得对。我更新了我的问题并加入了代码。我的道歉您显然在Redux中存储了一个计时器(来自我不知道的任何库,但您可能知道)对象。这不属于Redux,因为计时器不是数据,Redux存储是用于存储数据,而不是其他。“数据”是关于计时器何时启动、何时结束或计时器id的信息。但不是计时器本身,有一个“开始”方法和一个“暂停”方法——触发这些方法中的任何一个都会修改计时器,这反过来又是对reducer之外的redux状态的修改——在redux中是严格禁止的。我不敢问这个问题,但我如何才能知道这个不可序列化的值在哪里?我进入了
intervalTimer
的内部,其中必须有一个
计时器(我根据它的命名方式进行假设)。我还使用react本机调试器和redux调试设置。谢谢你的回答,它确实帮助我理解了什么是Serialable finally,我知道我的第二个问题很难回答,但我不知道怎么问,我不知道,因为你把所有可能设置
计时器的代码都放在那里了?你说得对。我更新了我的问题并加入了代码。我的道歉您显然在Redux中存储了一个计时器(来自我不知道的任何库,但您可能知道)对象。这不属于Redux,因为计时器不是数据,Redux存储是用于存储数据,而不是其他。“数据”是关于计时器何时启动、何时结束或计时器id的信息。但不是计时器本身,有一个“启动”方法和一个“暂停”方法——触发这些方法中的任何一个都会修改计时器,这反过来又是在reducer之外修改redux状态——严格禁止在redux中使用。