reactjs - 新手问题:如何在带有 React 和 Apollo 客户端的简单表单处理程序中正确分解代码
问题描述
问题:关于下面描述的 React+ApolloClient 表单处理,任何人都可以告诉我处理这种情况的“正确”方法或指向一个好的教程。即使在这种简单的情况下,代码的模块化和组织也让我感到困惑。
代码详细信息:我有一个带有子功能组件 SignUp(props) 的 react App() 组件,它呈现注册页面和表单。(我坚持只对功能组件 RFC 和钩子做出反应 - 没有类组件 - 以避免不知所措)
fields
SignUp() 组件根据其状态管理对象中的表单字段。SignUp() 表单中的 onSubmit 事件调用 handleSubmit(),然后调用 e.preventdefault,然后调用非 rfc函数 handleSignUp(fields),我已在其 props 上将其传递给 Login()。
我能够成功地将表单数据提升到父 App()。
从那里,我希望使用 useMutation() 在我的 graphql 服务器上创建一个新用户。但是,我不能调用 useMutation() 因为 handleSignUp 不是反应功能组件。
什么是正确的设计模式?我应该在 SignUp() 组件中运行突变吗?
非常感谢
// ----- App.js:
function handleSignUp(fields) {
console.log("App SignUp data:", fields);
//const [signup, { data }] = useMutation(SIGN_UP);
// !! CANNOT USE HOOK IN A NON-RFC FUNCTION
}
function App() {
...
<Route path="/SignUp">
<SignUp onSignUp={handleSignUp} />
</Route>
...
// ----- SignUp.js:
function SignUp(props) {
const [fields, setFields] = useState({
email: "",
password: "",
organization: "",
});
...
function handleSubmit(e) {
e.preventDefault();
props.onSignUp(fields);
}
return (
...
<div id="sign-up-page">
<h1>Sign Up</h1>
<form
className="sign-up-form"
noValidate
autoComplete="off"
onSubmit={handleSubmit}
...
}
解决方案
查看 hooks 的第一条规则——只在顶层调用 hooks
更改SignUp
为箭头函数组件,然后在内部Signup
使用useMutation
钩子,然后在下面定义您的handleSignUp
函数 -
const SignUp = () => {
const [signup, { data }] = useMutation(SIGN_UP);
const [fields, setFields] = useState({
email: "",
password: "",
organization: "",
});
const handleSubmit(e) {
e.preventDefault();
signup(fields);
// or possibly something like this to pass your fields as variables properly
// signup({ variables: { ...fields } });
}
return (
...
);
}
如果您App
出于某种原因在您的问题中没有明确说明,您也可以这样做。
推荐阅读
- sql - H2 限制和偏移量,订购有保证吗?
- sql - 具有级联删除的两个表
- javascript - 当附加的 DOM 节点被移除时,MutationObservers 是否应该被移除/断开,比如事件的 removeEventListener?
- python - 如何将 SQLAlchemy 声明式模型拆分为模块?
- youtube-dl - Youtube-dl 错误:以 10 为基数的 int() 的无效文字:'7766645.83333'
- python-3.x - 在 Jupyterlab 中更改 IOPub 数据速率
- c# - 使用存储库 MVC 添加/插入数据
- swift - 我需要检测蒙面精灵中的触摸而不是(矩形蒙面但 alpha 蒙版)
- r - 仅提取末尾没有句点的行
- c# - EnableSwagger routeTemplate 参数的用途是什么?