在 onClick 中使用三元分配 apollo 突变?
Assigning apollo mutations with a ternary in an onClick?
我是 typescript 的新手,正在迁移一个 React 前端来学习。我目前在使用我的 login/registration 组件时遇到问题 - 一个三元运算符被分配给一个 onClick 处理程序,该处理程序指示是否执行登录或注册突变。我实施了一个解决方法,将突变包装在函数中,但它看起来很脏。
这是一个准系统示例,returns 类型分配错误,因为三元中的值不与 onClick 处理程序共享属性。如有必要,我可以提供更强大、可重现的示例。
const Auth = () => {
const history = useHistory();
const [formState, setFormState] = useState({
login: true,
firstName: '',
lastName: '',
username: '',
password: '',
email: ''
});
const [loginMutation] = useMutation(LOGIN_MUTATION, {
onCompleted: (response) => {
//...
}
});
const [signupMutation] = useMutation(SIGNUP_MUTATION, {
variables: {
//...
},
onCompleted: (response) => {
// ...
}
});
return (
<>
{!formState.login && (
display extra inputs for registration form
)}
username and password fields
<button onClick={formState.login ? login : signup}>
{formstate.login ? login: signup}
</button>
</>
)
}
如您所猜,onClick
具有签名 (e:MouseEvent<HTMLButtonElement, MouseEvent>) => void
,而突变具有不同的签名(类似于 (options?: MutationFunctionOptions<T>) => Promise<Result>
)。因此,当您说 onClick={login}
时,您实际上是在这样做:onClick={e => login(e)}
这是错误的。
解决它的一种方法是编写一个内联函数
<button onClick={() => formState.login ? login() : signup()}>
{formstate.login ? login: signup}
</button>
我是 typescript 的新手,正在迁移一个 React 前端来学习。我目前在使用我的 login/registration 组件时遇到问题 - 一个三元运算符被分配给一个 onClick 处理程序,该处理程序指示是否执行登录或注册突变。我实施了一个解决方法,将突变包装在函数中,但它看起来很脏。
这是一个准系统示例,returns 类型分配错误,因为三元中的值不与 onClick 处理程序共享属性。如有必要,我可以提供更强大、可重现的示例。
const Auth = () => {
const history = useHistory();
const [formState, setFormState] = useState({
login: true,
firstName: '',
lastName: '',
username: '',
password: '',
email: ''
});
const [loginMutation] = useMutation(LOGIN_MUTATION, {
onCompleted: (response) => {
//...
}
});
const [signupMutation] = useMutation(SIGNUP_MUTATION, {
variables: {
//...
},
onCompleted: (response) => {
// ...
}
});
return (
<>
{!formState.login && (
display extra inputs for registration form
)}
username and password fields
<button onClick={formState.login ? login : signup}>
{formstate.login ? login: signup}
</button>
</>
)
}
如您所猜,onClick
具有签名 (e:MouseEvent<HTMLButtonElement, MouseEvent>) => void
,而突变具有不同的签名(类似于 (options?: MutationFunctionOptions<T>) => Promise<Result>
)。因此,当您说 onClick={login}
时,您实际上是在这样做:onClick={e => login(e)}
这是错误的。
解决它的一种方法是编写一个内联函数
<button onClick={() => formState.login ? login() : signup()}>
{formstate.login ? login: signup}
</button>