【问题标题】:How to change state in recoil selector如何改变反冲选择器的状态
【发布时间】:2021-07-06 01:49:21
【问题描述】:

我正在尝试更改选择器中的状态,类似于正常状态更改,但我无法弄清楚我做错了什么。有人可以帮我吗?

这是我的原子:

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'。属性“__cTag”的类型不兼容。 类型 '(t: iBook[]) => void' 不可分配给类型 '(t: ({ title: string; id: number; } | undefined)[]) => void'。 参数“t”和“t”的类型不兼容。 类型 '({ title: string; id: number; } | undefined)[]' 不可分配给类型 'iBook[]'。 TS2345

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

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

【问题讨论】:

    标签: reactjs typescript recoiljs


    【解决方案1】:

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

    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",
              };
            }
            return book;
          })
        );
      },
    });
    

    【讨论】:

    • 谢谢,有帮助?‍?你知道这是否是一个好习惯吗?我的意思是传递应该更改的对象的 id。我问是因为我无法在选择器中为这个参数分配类型,例如({set,get},id:number)。
    • 这不是一个好习惯。你的选择器对我来说真的没有任何意义。我不明白你想要达到什么目的。但是选择器应该几乎总是只派生状态,这就是它被称为选择器的原因。
    • 那么当我在不同的组件中使用相同的代码来改变原子时,我该如何优化代码呢?
    • 只需编写一个带有被调用回调的自定义钩子。
    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2016-03-08
    • 2019-07-25
    • 1970-01-01
    • 2022-12-22
    • 2014-07-17
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多