Javascript “是什么意思?”;非来自国家的数据将永远不会被起草”;在伊默尔
我被immer文档的部分弄糊涂了。我创建了一个简单的示例来测试相同的原理,即向草稿数据结构添加一些新对象,然后对其进行修改。根据文档,还应修改原始数据结构:Javascript “是什么意思?”;非来自国家的数据将永远不会被起草”;在伊默尔,javascript,reactjs,immer.js,Javascript,Reactjs,Immer.js,我被immer文档的部分弄糊涂了。我创建了一个简单的示例来测试相同的原理,即向草稿数据结构添加一些新对象,然后对其进行修改。根据文档,还应修改原始数据结构: import { produce } from "immer"; function print(obj) { console.log(JSON.stringify(obj)); } var todos = [ { id: 0, done: false }, { id: 1, done: false } ]
import { produce } from "immer";
function print(obj) {
console.log(JSON.stringify(obj));
}
var todos = [
{ id: 0, done: false },
{ id: 1, done: false }
];
function onReceiveTodo(todo) {
return produce(todos, draft => {
draft[1] = todo;
draft[1].done = true;
});
}
let nextTodos = onReceiveTodo({ id: 3, done: false });
print(todos);
print(nextTodos);
// [{"id":0,"done":false},{"id":1,"done":false}] // todos
// [{"id":0,"done":false},{"id":3,"done":true}] // nextTodos
但这似乎奏效了
有人能更详细地解释一下这个陷阱吗
注意:我还尝试使用与文档中完全相同的示例,但对数据结构todos
应该是什么样子感到困惑。由于draft
绑定到todos
的原始版本,这一行:draft.todos[todo.id]=todo
表明我们有类似于todos={todos:{0:{done:false},1:{done:false},}
,但todo.id
表明todo
对象包含id它是关于“如果你在product中传递并变异一个对象,它实际上是变异的”
有人能更详细地解释一下这个陷阱吗
基本上,当您这样做时:
让nextTodos=onReceiveTodo({id:3,done:false});
<>原对象可以更改,考虑:
consttodo={id:3,done:false};
设nextTodos=onReceiveTodo(todo);
todo.done;//true,此对象在Immer之外发生了变异