reactjs - 使用 RecoilJS 通过 API 发布数据

标签 reactjs react-state-management recoiljs

RecoilJS 文档中,有一个如何处理异步数据查询的example,但它只是关于获取数据。

假设我有一个简单的状态:

const accountState = atom({
  key: "accountState",
  default: {
    id: "",
    name: "",
  }
});

还有一个作为注册表单的组件:

const RegisterForm = () => {
  return (
    <form>
      <input type="text" name="username" />
      <button type="submit">Register</button>
    </form>
  )
}

发布的数据在 FormData 中。成功创建新帐户后,服务器将发送一个包含帐户的idname的响应。

{
  "id": "abcdef123456",
  "name": "example"
}

此响应数据将被设置为 accountState 的新状态。

如何在 RecoilJS 中处理这个过程?

最佳答案

您可以只处理 http 请求并将响应设置为状态。

const RegisterForm = () => {
  const [account, setAccount] = useRecoilState(accountState);

  const handleSubmit = async e => {
    e.preventDefault();

    const response = await fetch(url, {
      method: 'POST',
      body: data,
    });

    const responseJson = await response.json();
    setAccount(responseJson);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" name="username" />
      <button type="submit">Register</button>
    </form>
  );
}

编辑

为了有一个可重用的方法,我建议构建自定义钩子(Hook)以供频繁使用

const useRegister = () => {
  const setAccount = useSetRecoilState(accountState);

  const register = useCallback(async (username)=> {
    const response = await fetch(url, {
      method: 'POST',
      body: { username },
    });

    const responseJson = await response.json();
    setAccount(responseJson);
  }, [setAccount]);

  return register;

}

const RegisterForm = () => {
  const register = useRegister();

  const handleSubmit = async e => {
    e.preventDefault();

    await register(username);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" name="username" />
      <button type="submit">Register</button>
    </form>
  );
}

关于reactjs - 使用 RecoilJS 通过 API 发布数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62832167/

相关文章:

javascript - 将获取的数据作为 Prop (JSON)传递给状态以呈现数据

unit-testing - 当组件是无状态功能时,使用 Enzyme 按显示名称查找组件

reactjs - 是否有行之有效的方法来管理 Recoil 中的原子集合?

reactjs - MUI TextField 不接受模式

node.js - 在 next.js 应用程序上管理用户的全局状态

reactjs - 如何将反冲库与 native 集成?

reactjs - 使用Recoil时如何处理useEffect警告?

reactjs - 在 react 中使用recoil.js,在类组件中不使用钩子(Hook)

reactjs - react onClick 事件

reactjs - 如何在 python 中使用 selenium webdriver 将内容设置到 mui-rte 中?