微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反应 - 反冲异步请求

如何解决反应 - 反冲异步请求

我开始玩后坐力,但我在异步请求方面遇到了问题。我或多或少地解决了它,但只是想确定我的方法是否正确,基本上我希望使用给定的参数执行获取请求,

我有我的原子文件,我在其中存储我的两个原子,一个存储我获取的 json“commentState”,一个存储我的参数“commentId”,以及从原子获取参数并在 ID 更高时执行获取请求的选择器大于 0。

const getComment = selector({
  key: "getComment",get: async ({ get }) => {
    const id = get(commentId);
    if (id) {
      try {
        const response = await fetchComment(id);
        return response;
      } catch (e) {
        return null;
      }
    } else {
      return null;
    }
  },});

export const commentsstate = atom<amountOfCommentsType | null>({
  key: "commentState",default: getComment,});

export const commentId = atom<number>({
  key: "commentId",default: 0,});

然后在我的反应组件中,我通过 useRecoilValue 获取数据,并使用触发 atom 重新获取数据的 useRecoilState 更改参数。

export function Comments() {
  const commentDate = useRecoilValue(commentsstate);
  const [_,setCommentDataId] = useRecoilState(commentId);

  const [commentNumber,setCommentNumber] = useState(0);


  return (
    <div className={styles.row}>
...
    </div>
  );
}

我想问一下这种方法是否正确,是否可以更改:

const commentDate = useRecoilValue(commentsstate);

const [commentDate,setCommentDate] = useRecoilStateLoadable(commentsstate(param));

然后在选择器中以某种方式传递这个参数而不需要创建额外的原子?我试图寻找一些解决方案,但找不到。

像这样:

const getComment = selector({
  key: "getComment",get: async ({ get,someparam }) => {

    if (id) {
      try {
        const response = await fetchComment(someparam);
        return response;
      } catch (e) {
        return null;
      }
    } else {
      return null;
    }
  },});

解决方法

selectorFamily 是您正在寻找的模式。 selectorFamily(options)

selectorFamily 是一种强大的模式,类似于选择器,但允许您将参数传递给选择器的 get 和 set 回调。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。