Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Reactjs 如何更改反冲选择器中的状态_Reactjs_Typescript_Recoiljs - Fatal编程技术网

Reactjs 如何更改反冲选择器中的状态

Reactjs 如何更改反冲选择器中的状态,reactjs,typescript,recoiljs,Reactjs,Typescript,Recoiljs,我试图改变选择器中的状态,类似于正常的状态改变,但我不知道我做错了什么。有人能帮我吗 这是我的原子: export interface iBook { id: number; title: string; } const initState: iBook[] = [{ id: 1, title: "a" }]; export const bookState = atom({ key: "bookState", default: init

我试图改变选择器中的状态,类似于正常的状态改变,但我不知道我做错了什么。有人能帮我吗

这是我的原子:

export interface iBook {
  id: number;
  title: string;
}

const initState: iBook[] = [{ id: 1, title: "a" }];

export const bookState = atom({
  key: "bookState",
  default: initState,
});
而现在,这个选择器不起作用了

export const onChange = selector({
  key: "onChange",
  get: ({ get }) => get(bookState),
  set: ({ set, get }, id) => {
    const books= get(bookState);
    set(
      bookState,
      books.map((book) => {
        if (book.id === id)
          return {
            ...book,
            title: "b",
          };
      })
    );
  },
});
它在“bookState”上显示错误

“RecoilState”类型的参数不可分配给 类型为“RecoilState”的参数。属性“\uuu cTag”的类型不兼容。 Type'(t:iBook[])=>void'不能分配给Type'(t:({title:string;id:number;}|未定义)[])=>void'。 参数“t”和“t”的类型不兼容。 类型“({title:string;id:number;}|未定义)[]”不能分配给类型“iBook[]”。TS2345

这是钩子,它在组件中工作,但我希望它在选择器中:

   setBooks(
      books.map((book) => {
        if (book.id === id)
          return {
            ...book,
            title: "b",
          };
        return book;
      })
    );

如果id不匹配,则不会返回book对象,因此返回undefined。返回图书对象:

export const onChange=选择器({
密钥:“onChange”,
get:({get})=>get(bookState),
set:({set,get},id)=>{
const books=get(bookState);
设置(
书州,
图书。地图((图书)=>{
如果(book.id==id){
返回{
…书,
标题:“b”,
};
}
还书;
})
);
},
});

谢谢,这很有帮助。这不是一个好的做法。你的选择器对我来说毫无意义。我不明白你想达到什么目的。但是选择器应该总是派生状态,这就是为什么它被称为选择器。那么,当在不同的组件中使用相同的代码来更改原子时,我如何优化代码呢?只需编写一个带有回调的自定义钩子就可以了。