【发布时间】:2022-01-06 09:05:46
【问题描述】:
我有用于翻译的组件语言
const Language = (props: IOwnProps) => {
// error is in next line for useSelector
const language = useSelector(
(state: IState) => state.currentLang
);
return getTranslations(
props.languageString
);
};
在表单中我使用 formik 进行验证
const validationSchema = () => {
const requiredFirstName = Language({
languageString: firstNameRequired,
});
return yup.object({
firstName: yup
.string()
.required(requiredFirstName)
});
};
这里是表单组件
const UserForm = ({
userData: userData
setErrorIndex,
}: UserFormProps) => {
const formik = useFormik({
initialValues: {
userData: userData.firstName,
},
validationSchema,
onSubmit: (values) => {
const playerDataLocal = {
firstName: values.firstName,
};
handleSubmit(playerDataLocal);
},
});
return (
<form onSubmit={formik.handleSubmit}>
<TextField
id="firstName"
name="firstName"
label="First Name *"
defaultValue={formik.values.firstName}
onChange={formik.handleChange}
error={formik.touched.firstName && Boolean(formik.errors.firstName)}
helperText={formik.touched.firstName && formik.errors.firstName}
fullWidth
/>
</form>
);
};
export default UserForm;
在带有语言的验证模式行中给出错误: 无效的挂钩调用。 Hooks 只能在函数组件内部调用。
Language 的调用来自validationSchema,这是一个功能组件
错误的调用堆栈位于useSelector 的行中,来自Language
validationSchema 的调用在“useFormik”内部可能是这个问题吗?
有什么想法吗?
【问题讨论】:
-
你必须用前缀
use命名你的钩子,例如useLanguage和useValidationSchema. -
看起来像
eslint-plugin-react-hooks认为你违反了钩子规则,因为validationSchema不以大写字母或use前缀开头。 -
或在父组件
UserForm中调用useSelector并将其作为道具转发 - 您不必使用use重命名 -
Language看起来不像组件?
标签: javascript reactjs formik