【发布时间】:2020-06-18 18:06:03
【问题描述】:
用户创建个人资料后,他们会在电子邮件中收到一个链接,该链接会将他们发送回网站,网址中包含 verifyToken。如果令牌与存储在数据库中的令牌匹配,则它们的isVerified 状态将存储在数据库中,值为true。
new-profile.js
import VerifyEMail from '../components/VerifyEmail';
const NewProfilePage = props => (
<div>
<VerifyEMail verifyToken={props.query.verifyToken} />
</div>
);
export default NewProfilePage;
目前,我已经实现并使用带有“验证”按钮的表单工作,用户必须单击该按钮才能调用 graphQL 突变,verifyEmail。由于这会将数据库中的 isVerified 值设置为 true,因此我知道一切正常。
../components/VerifyEmail.js
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Mutation } from 'react-apollo';
import gql from 'graphql-tag';
const VERIFY_EMAIL_MUTATION = gql`
mutation VERIFY_EMAIL_MUTATION($verifyToken: String!) {
verifyEmail(verifyToken: $verifyToken) {
isVerified
}
}
`;
class VerifyEmail extends Component {
render() {
const { verifyToken } = this.props;
return (
<Mutation mutation={VERIFY_EMAIL_MUTATION} variables={{ verifyToken }}>
{verifyEmail => (
<form
onSubmit={async () => {
await verifyEmail(verifyToken);
}}
>
<button type="submit">Verify</button>
</form>
)}
</Mutation>
);
}
}
VerifyEmail.propTypes = {
verifyToken: PropTypes.string.isRequired,
};
export default VerifyEmail;
但是,我真的不想强迫我的用户必须单击按钮才能触发突变。我希望在组件加载后调用它。我已经为此绞尽脑汁了一天半,尝试了很多东西,但似乎找不到任何有效的方法。
我已经看到了一些使用React hooks、Apollo hooks、componentDidMount 等的解决方案。我的大脑只是很难再看到它。这个链接有一些迄今为止我发现的最好的解决方案,但我不知道如何实现它们...... [Feature idea] Execute a mutation on mount #1939
非常感谢任何能帮助我指明正确方向的人。谢谢。
【问题讨论】:
标签: reactjs graphql apollo react-apollo