首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不动图,计算性质

不动图,计算性质
EN

Stack Overflow用户
提问于 2019-08-15 05:46:33
回答 1查看 1.4K关注 0票数 2

我不知道为什么我要在我的还原器代码中得到Error: Immer drafts cannot have computed properties。我使用的是redux-starter-kit,它用Immer库包装了我所有的还原器代码。

我不太清楚Immer所说的“计算财产”指的是什么。它是指getter/setter吗?因为我没有显式地创建任何getter或setter。对象扩展操作符正在执行吗?

getters/setters是否以某种方式污染状态对象?

或者是参照计算的属性名称计算属性?https://tylermcginnis.com/computed-property-names/

我的减速机很简单:

代码语言:javascript
复制
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所抱怨的吗?

我重写了上传还原器来创建一个新的对象,

代码语言:javascript
复制
upload: (state, action) => {
    const {name} = action.payload;
    state.byName[name] = {
        ...state.byName[name],
        status: 'uploading',
    };
},

我现在所犯的错误同样令人困惑:

EN

回答 1

Stack Overflow用户

发布于 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的事物

  • 错误和函数对象不能被结构化克隆算法复制;尝试这样做会引发DATA_CLONE_ERR异常。
  • 尝试克隆DOM节点同样会引发DATA_CLONE_ERR异常。
  • 对象的某些参数没有保留:
    • 没有保留lastIndex对象的RegExp字段。
    • 属性描述符、设置器和getter(以及类似的元数据类功能)不会被复制。例如,如果一个对象使用属性描述符标记为只读,那么它将被读-写在副本中,因为这是默认条件。
    • 原型链不被步行和复制。

请注意,如果将Immer设置为“沉浸式”,则prototype计算的属性名可以与prototype[immerable] = true一起工作,但这里的情况并非如此。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57505319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档