Javascript 对我在redux中不可序列化的内容感到困惑(redux错误)
我的react native正在工作,此页面(屏幕)已经完成并完全工作,但由于某种奇怪的原因,现在它开始失败,出现了一个错误,即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
不可序列化
保存剩余时间\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中使用。