前端小练习


用了react的useState钩子,不过总感觉有很多赘余的部分,比如四个输入框的信息分别维护,而不是统一由一个四个元素组成的变量控制。

接下来可以尝试做一个贪吃蛇。

(已经失败了。。)

主要代码如下:

import { useState } from "react"
import "./App.css"

const InputItem = ({ handleInput, title, placeholder, error, isError }) => {
    return (
        <>
            <p className="entry-name">{title}</p>
            <input
                className="input"
                type="text"
                placeholder={placeholder}
                onBlur={(e) => {
                    handleInput(e.target.value, title)
                }}
            />
            <p className="error">{isError && error}</p>
        </>
    )
}

export default function App() {
    const [username, setUsername] = useState("")
    const [email, setEmail] = useState("")
    const [password, setPassword] = useState("")
    const [confirm, setConfirm] = useState("")

    const [usernameError, setUsernameError] = useState(false)
    const [emailError, setEmailError] = useState(false)
    const [passwordError, setPasswordError] = useState(false)
    const [confirmError, setConfirmError] = useState(false)

    const handleInput = (value, title) => {
        if (title === "Username") {
            if (value && value.length >= 3) {
                setUsernameError(false)
                setUsername(value)
            } else setUsernameError(true)
        } else if (title === "Email") {
            const emailReg =
                /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
            if (value && emailReg.test(value)) {
                setEmailError(false)
                setEmail(value)
            } else setEmailError(true)
        } else if (title === "Password") {
            if (value && value.length >= 6) {
                setPasswordError(false)
                setPassword(value)
            } else setPasswordError(true)
        } else {
            if (value && value === password) setConfirmError(false)
            else {
                setConfirmError(true)
                setConfirm(true)
            }
        }
    }
    const handleClick = () => {
        if (username === "") setUsernameError(true)
        if (email === "") setEmailError(true)
        if (password === "") setPasswordError(true)
        if (confirm === "") setConfirmError(true)

        if (
            username !== "" &&
            !usernameError &&
            !emailError &&
            !passwordError &&
            !confirmError
        ) {
            alert("Register succeeded.")
        }
    }

    return (
        <div className="App">
            <h2 className="title">Register With Us</h2>
            <InputItem
                handleInput={handleInput}
                title="Username"
                placeholder="Enter username"
                isError={usernameError}
                error="Username must be at least 3 characters"
            />
            <InputItem
                handleInput={handleInput}
                title="Email"
                placeholder="Enter email"
                isError={emailError}
                error="Email is not valid"
            />
            <InputItem
                handleInput={handleInput}
                title="Password"
                placeholder="Enter password"
                isError={passwordError}
                error="Password must be at least 6 characters"
            />
            <InputItem
                handleInput={handleInput}
                title="Confirm Password"
                placeholder="Enter password again"
                isError={confirmError}
                error="Passwords are not the same"
            />
            <button className="submit" onClick={handleClick}>
                Submit
            </button>
        </div>
    )
}

目前暂时没想好怎么把这四个输入框统一管理起来。