Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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 “是什么意思?”;非来自国家的数据将永远不会被起草”;在伊默尔_Javascript_Reactjs_Immer.js - Fatal编程技术网

Javascript “是什么意思?”;非来自国家的数据将永远不会被起草”;在伊默尔

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 } ]

我被immer文档的部分弄糊涂了。我创建了一个简单的示例来测试相同的原理,即向草稿数据结构添加一些新对象,然后对其进行修改。根据文档,还应修改原始数据结构:

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之外发生了变异