我目前正在使用带有 react-hooks 的 react-js 编写一个注册页面,我仍在学习,所以如果这是一个非常简单的问题,请原谅。
我有一个用带有钩子的功能组件编写的 signup.js。signup.js 导入 'EmailTextField', 'PasswordTextField', 'NameTextField', 'CellPhoneTextField' ... 的组件也用钩子编写在功能组件中。
我将所有这些文本字段作为单独的组件来简化代码,因为我需要对每个文本字段进行许多不同的检查。(并且在 signup.js 页面中包含所有这些字段会产生很长的代码)
在 signup.js 中的过程结束时,我想获得它所有子组件(所有这些文本字段)的状态(用户是否适合登录。)但我不知道如何通过从这些文本字段到 signup.js 的状态(或变量)。
我知道 redux 可以管理状态,但是有没有办法在没有 redux 的情况下实现这一点?
谢谢你。
我用最少的示例代码创建了一个CodeSandbox 示例。
在这里,我EmailTextfield在apptest.js. 我想从中获取isValid状态EmailTextfield,apptest.js以便我可以确保在用户注册之前验证所有字段。
'./components/UI/Textfield/EmailTextField.js'
import React, { useState } from "react";
import TextField from "@material-ui/core/TextField";
import Grid from "@material-ui/core/Grid";
export const EmailTextField = props => {
const [value, setValue] = useState("");
const [helperText, setHelperText] = useState(
"Email address will be used as your username."
);
const [isValid, setIsValid] = useState("true");
const handleOnChangeEmailAddress = event => {
// Email Validation logic
if (true) {
setIsValid(true);
} else {
setIsValid(false);
}
};
return (
<Grid item xs={12}>
<TextField
variant="outlined"
required
fullWidth
id="email"
label="email address"
error={!isValid}
helperText={helperText}
name="email"
autoComplete="email"
margin="dense"
onBlur={handleOnChangeEmailAddress}
/>
</Grid>
);
};
export default EmailTextField;
'aptest.js'
import React from "react";
import CssBaseline from "@material-ui/core/CssBaseline";
import Grid from "@material-ui/core/Grid";
import { makeStyles } from "@material-ui/core/styles";
import Container from "@material-ui/core/Container";
import { EmailTextField } from "./components/UI/Textfield/EmailTextField";
const useStyles = makeStyles(theme => ({
"@global": {
body: {
backgroundColor: theme.palette.common.white
}
},
paper: {
marginTop: theme.spacing(8),
display: "flex",
flexDirection: "column",
alignItems: "center"
},
mainBox: {
// margin: '200px',
width: "550px",
textAlign: "left",
boxShadow: "0 2px 3px #ccc",
border: "1px solid #eee",
padding: "40px 70px 50px 70px",
boxSizing: "border-box"
},
form: {
width: "100%", // Fix IE 11 issue.
marginTop: theme.spacing(3)
}
}));
const Apptest = props => {
const classes = useStyles();
return (
<Container component="main" maxWidth="xs">
<CssBaseline />
<div className={classes.paper}>
<div className={classes.mainBox}>
<form className={classes.form} noValidate>
<Grid container spacing={2}>
<EmailTextField />
</Grid>
</form>
</div>
</div>
</Container>
);
};
export default Apptest;