当前位置: 首页 > news >正文

0701表单组件-react-仿低代码平台项目

文章目录

    • 1 react表单组件
      • 1.1 受控组件 (Controlled Components)
        • 示例代码:
      • 1.2 非受控组件 (Uncontrolled Components)
        • 示例代码:
    • 2 AntD表单组件实战
      • 2.1 开发搜索功能
      • 2.2 开发注册页
      • 2.3 开发登录页
      • 2.4 表单组件校验
    • 结语

1 react表单组件

input表单组件

import { ChangeEvent, useState } from "react";function App() {const [text, setText] = useState<string>("hello");function handleChange(e: ChangeEvent<HTMLInputElement>) {setText(e.target.value);}return (<><p>APP</p><div><input value={text} onChange={handleChange} /></div>);
}export default App;

1.1 受控组件 (Controlled Components)

通过 React 的 stateonChange 事件动态管理表单输入的值,表单数据由 React 组件控制。

示例代码:
import React, { useState } from 'react';function ControlledForm() {const [formData, setFormData] = useState({username: '',email: '',password: ''});const handleChange = (e) => {const { name, value } = e.target;setFormData(prev => ({...prev,[name]: value}));};const handleSubmit = (e) => {e.preventDefault();console.log('提交数据:', formData);// 发送到 API 或进一步处理};return (<form onSubmit={handleSubmit}><inputtype="text"name="username"value={formData.username}onChange={handleChange}placeholder="用户名"/><inputtype="email"name="email"value={formData.email}onChange={handleChange}placeholder="邮箱"/><inputtype="password"name="password"value={formData.password}onChange={handleChange}placeholder="密码"/><button type="submit">提交</button></form>);
}

1.2 非受控组件 (Uncontrolled Components)

使用 ref 直接访问 DOM 元素的值,适用于简单场景或需要手动操作 DOM 的情况。

示例代码:
import React, { useRef } from 'react';function UncontrolledForm() {const usernameRef = useRef();const emailRef = useRef();const passwordRef = useRef();const handleSubmit = (e) => {e.preventDefault();const data = {username: usernameRef.current.value,email: emailRef.current.value,password: passwordRef.current.value};console.log('提交数据:', data);};return (<form onSubmit={handleSubmit}><input type="text" ref={usernameRef} placeholder="用户名" /><input type="email" ref={emailRef} placeholder="邮箱" /><input type="password" ref={passwordRef} placeholder="密码" /><button type="submit">提交</button></form>);
}

2 AntD表单组件实战

2.1 开发搜索功能

基础ListSearch.tsx代码如下:

import { FC, useState } from "react";
import type { ChangeEvent } from "react";
import { Input } from "antd";const { Search } = Input;const ListSearch: FC = () => {const [value, setValue] = useState("");function handleChange(e: ChangeEvent<HTMLInputElement>) {setValue(e.target.value);}function handleSearch(value: string) {console.log(value);}return (<Searchsize="large"allowClearplaceholder="输入关键字"value={value}onChange={handleChange}onSearch={handleSearch}style={{ width: "60%" }}/>);
};export default ListSearch;

效果如下图所示:

在这里插入图片描述

搜索之后,如果刷新页面,我们希望展示内容和刷新之前一样,需要我们把搜索“参数值”放入URL,改造之后的代码如下:

import { FC, useEffect, useState } from "react";
import type { ChangeEvent } from "react";
import { useNavigate, useLocation, useSearchParams } from "react-router-dom";
import { Input } from "antd";import { LIST_SEARCH_PARAM_KEY } from "../constant";const { Search } = Input;const ListSearch: FC = () => {const nav = useNavigate();const { pathname } = useLocation();const [value, setValue] = useState("");function handleChange(e: ChangeEvent<HTMLInputElement>) {setValue(e.target.value);}// 获取url参数,并设置input valueconst [searchParams] = useSearchParams();useEffect(() => {const curVal = searchParams.get(LIST_SEARCH_PARAM_KEY) || "";setValue(curVal);}, [searchParams]);function handleSearch(value: string) {nav({pathname,search: `${LIST_SEARCH_PARAM_KEY}=${value}`,});}return (<Searchsize="large"allowClearplaceholder="输入关键字"value={value}onChange={handleChange}onSearch={handleSearch}style={{ width: "60%" }}/>);
};export default ListSearch;

效果如下图所示:

在这里插入图片描述

2.2 开发注册页

Register.tsx基础代码如下:

import { FC } from "react";
import { Link } from "react-router-dom";
import { Typography, Space, Form, Input, Button } from "antd";
import { UserAddOutlined } from "@ant-design/icons";import { LOGIN_PATHNAME } from "../router";import styles from "./Register.module.scss";const { Title } = Typography;const Register: FC = () => {function onFinish(values: any) {// todo 注册apiconsole.log(values);}return (<div className={styles.container}><div><Space><Title level={2}><UserAddOutlined /></Title><Title level={2}>注册新用户</Title></Space></div><div><FormlabelCol={{ span: 6 }}wrapperCol={{ span: 16 }}onFinish={onFinish}><Form.Item label="用户名" name="username"><Input /></Form.Item><Form.Item label="密码" name="password"><Input.Password /></Form.Item><Form.Item label="确认密码" name="confirm"><Input.Password /></Form.Item><Form.Item label="昵称" name="nickname"><Input /></Form.Item><Form.Item wrapperCol={{ offset: 6, span: 16 }}><Space><Button type="primary" htmlType="submit">注册</Button><Link to={LOGIN_PATHNAME}>已有账户,登录</Link></Space></Form.Item></Form></div></div>);
};
export default Register;

带完善功能:

  • 样式优化
  • 表单校验,比如用户名特殊字符校验,密码安全校验,确认密码一致校验等

2.3 开发登录页

页面和注册相似,表单组件变少,Login.tsx代码如下:

import { FC, useEffect } from "react";
import { Link } from "react-router-dom";
import { Typography, Space, Form, Input, Button, Checkbox } from "antd";
import { UserAddOutlined } from "@ant-design/icons";import { REGISTER_PATHNAME } from "../router";import styles from "./Register.module.scss";
import Password from "antd/es/input/Password";const { Title } = Typography;const USERNAME_KEY = "usename";
const PASSWORD_KEY = "password";/*** 浏览器本地存储用户信息* @param username 用户名* @param password 密码*/
function rememberUser(username: string, password: string) {localStorage.setItem(USERNAME_KEY, username);localStorage.setItem(PASSWORD_KEY, password);
}/*** 浏览器本地删除用户信息* @param username 用户名* @param password 密码*/
function deleteUserFromStorage(username: string, password: string) {localStorage.removeItem(USERNAME_KEY);localStorage.removeItem(PASSWORD_KEY);
}/*** 浏览器本地获取用户信息*/
function getUserInfoFromStorage() {return {username: localStorage.getItem(USERNAME_KEY),password: localStorage.getItem(PASSWORD_KEY),};
}const Login: FC = () => {// 表单组件初始化const [form] = Form.useForm();useEffect(() => {const { username, password } = getUserInfoFromStorage();form.setFieldsValue({ username, password });}, []);function onFinish(values: any) {// todo 注册apiconsole.log(values);const { username, password, remember } = values || {};if (remember) {rememberUser(username, password);} else {deleteUserFromStorage(username, password);}}return (<div className={styles.container}><div><Space><Title level={2}><UserAddOutlined /></Title><Title level={2}>用户登录</Title></Space></div><div><FormlabelCol={{ span: 6 }}wrapperCol={{ span: 16 }}onFinish={onFinish}initialValues={{ remember: true }}form={form}><Form.Item label="用户名" name="username"><Input /></Form.Item><Form.Item label="密码" name="password"><Input.Password /></Form.Item><Form.ItemwrapperCol={{ offset: 6, span: 16 }}name="remember"valuePropName="checked"><Checkbox>记住我</Checkbox></Form.Item><Form.Item wrapperCol={{ offset: 6, span: 16 }}><Space><Button type="primary" htmlType="submit">登录</Button><Link to={REGISTER_PATHNAME}>注册新用户</Link></Space></Form.Item></Form></div></div>);
};
export default Login;

解析:

  • Form.useForm():antd提供的第三方hooks
  • LocalStorage:浏览器本地存储对象
  • 记住我:勾选“记住我”,存储用户信息;不勾选,清理存储的用户信息;页面初始化时,回显用户信息

2.4 表单组件校验

antd表单校验详细参考下面链接1,这里以注册页表单校验为例,演示常见校验规则配置,Register.tsx代码如下:

...const Register: FC = () => {
...return (<div className={styles.container}>...<div><FormlabelCol={{ span: 6 }}wrapperCol={{ span: 16 }}onFinish={onFinish}><Form.Itemlabel="用户名"name="username"rules={[{ required: true, message: "请输入用户名" },{type: "string",min: 5,max: 20,message: "字符长度再5-20之间",},{pattern: /^\w$/,message: "只能是字母数字下划线",},]}><Input /></Form.Item><Form.Itemlabel="密码"name="password"rules={[{ required: true, message: "请输入用户名" },{min: 8,message: "密码长度最少8位",},]}><Input.Password /></Form.Item><Form.Itemlabel="确认密码"name="confirm"dependencies={["password"]}rules={[{required: true,message: "请输入确认密码",},({ getFieldValue }) => ({validator(_, value) {if (!value || getFieldValue("password") === value) {return Promise.resolve();} else {return Promise.reject(new Error("两次密码不一致"));}},}),]}><Input.Password /></Form.Item>...</Form></div></div>);
};
export default Register;

效果如下图所示:在这里插入图片描述

结语

❓QQ:806797785

⭐️仓库地址:https://gitee.com/gaogzhen

⭐️仓库地址:https://github.com/gaogzhen

[1]ant design 官网[CP/OL].

相关文章:

  • Abstract (抽象类)和 Interface (接口)的区别
  • PowerBi中Drillthrough功能怎么使用?
  • 多功能门禁系统的设计
  • Vue+Threejs项目性能优化
  • Linux驱动开发进阶(十)- I2C子系统BSP驱动
  • 请详细说明下面训练阶段的差别: Supervised Fine-Tuning、Reward Modeling、PPO、DPO、KTO、Pre-Training
  • 【MySQL】索引特性
  • OpenCV 图形API(37)图像滤波-----分离过滤器函数sepFilter()
  • SvelteKit 最新中文文档教程(20)—— 最佳实践之性能
  • 系统架构设计师:系统架构概述案例分析与简答题、详细解析与评分要点
  • 【Caddy】:现代化、自动 HTTPS 的 Web 服务器新星
  • 基础(测试用例:介绍,测试用例格式,案例)
  • 并发编程之可见性、原子性、有序性问题
  • npm install 版本过高引发错误,请添加 --legacy-peer-deps
  • 使用nvm install XXX 下载node版本时网络不好导致npm下载失败解决方案
  • 智能麻将出牌组件
  • 【更新完毕】2025泰迪杯数据挖掘竞赛A题数学建模思路代码文章教学:竞赛论文初步筛选系统
  • 2025年广东消防设施操作员(初级)考试练习题
  • Spark大数据分析与实战笔记(第四章 Spark SQL结构化数据文件处理-05)
  • 系统与网络安全------弹性交换网络(1)
  • 网站跳转到另外一个网站怎么做/好网站制作公司
  • 江苏建设监理协会网站/小红书关键词优化
  • 南昌优秀网站建设/保定网站建设方案优化
  • 扬州有做义工的地方或网站嘛/seo优化排名软件
  • 中企动力做的网站怎么样/现在广告行业好做吗
  • 知名网站建设/济南网站优化公司哪家好