我不知道为什么我要在我的还原器代码中得到Error: Immer drafts cannot have computed properties。我使用的是redux-starter-kit,它用Immer库包装了我所有的还原器代码。
我不太清楚Immer所说的“计算财产”指的是什么。它是指getter/setter吗?因为我没有显式地创建任何getter或setter。对象扩展操作符正在执行吗?
getters/setters是否以某种方式污染状态对象?
或者是参照计算的属性名称计算属性?https://tylermcginnis.com/computed-property-names/
我的减速机很简单:
import { createSlice } from 'redux-starter-kit'
const assets = createSlice({
slice: 'assets',
initialState: {byName: {}},
reducers: {
upload: (state, action) => {
const {name} = action.payload;
state.byName[name].status = 'uploading';
},
initialize: (state, action) => {
const {assets, id} = action.payload;
assets.forEach(({name, uri}) => {
state.byName[name] = {
uri,
name,
status: 'local',
id,
inProgress: true
};
});
},
}
})
export default assets;资产/初始化操作是首先触发的,没有错误,当资产/上传操作被触发时,就会发生immer错误。

我不知道所有这些获取名称/设置名称、get uri / set uri字段来自何处。这就是Immer所抱怨的吗?

我重写了上传还原器来创建一个新的对象,
upload: (state, action) => {
const {name} = action.payload;
state.byName[name] = {
...state.byName[name],
status: 'uploading',
};
},我现在所犯的错误同样令人困惑:

发布于 2019-08-26 02:52:16
我不知道所有这些获取名称/设置名称、get uri / set uri字段来自何处。这就是Immer所抱怨的吗?
这些“字段”来自于Redux,是的,这就是Immer所抱怨的。他们被称为“教授”--但大多被称为“Getter和Setter”--它们是在ES5中引入的。这是通过设计Redux使用状态的方法,即通过这些函数改变对象并跟踪更改--您的还原器变成了setter,选择器变成了getter。现在Immer的方法是提供一个不可变的状态树,为每个状态变化提供一个新的对象。
Immer抱怨这些授予者,因为无法100%可靠地克隆函数对象,因为这些函数可能通过闭包访问词汇作用域的私有变量,即这些函数体变量引用将指向以前的状态(关于“javascript闭包是如何工作的”的更多信息)。这并不是一个特定的问题,而是JavaScript结构化克隆算法工作方式的具体说明。根据MDN对结构化克隆算法的评论
结构化克隆算法是由HTML5规范定义的用于复制复杂JavaScript对象的算法。(...) 不适用于结构化cloneSection的事物
请注意,如果将Immer设置为“沉浸式”,则prototype计算的属性名可以与prototype[immerable] = true一起工作,但这里的情况并非如此。
https://stackoverflow.com/questions/57505319
复制相似问题