React 低代碼項目:組件設計

React 低代碼項目:組件設計

Date: February 6, 2025





React表單組件

**目標:**使用 Ant Design 表單組件,開發登錄、注冊、搜索功能

內容:

  • 使用 React 表單組件、受控組件
  • 使用 Ant Design 表單組件
  • 使用 表單組件的校驗和錯誤提示,幾種方案

注意事項:

  • 表單組件在 React 中比較特別,要單獨學習(在HTML也一樣)
  • 注意接受并理解“受控組件”,雖然看似繁瑣


受控組件 vs 非受控組件

**受控組件:**值同步到 state,使用 value 屬性

受控組件是指表單元素的值由 React 組件的狀態(state 完全控制的組件。也就是說,表單的輸入值存儲在組件的狀態中,任何用戶輸入都會觸發狀態更新,從而讓組件重新渲染。

特點:

  • 受控組件的值總是由 React 狀態(state)驅動
  • 表單控件(如 input, select, textarea)的值由 state 來管理,而不是通過 DOM 操作。
  • 用戶在表單中的輸入通過事件(如 onChange)更新組件的狀態,進而影響輸入框的值。

工作流程:

  1. 用戶在表單控件中輸入內容。
  2. onChange 事件觸發,更新組件的 state
  3. React 重新渲染組件,更新表單控件的值。

Case:

import React, { useState } from 'react';const ControlledInput = () => {// 使用 state 來控制輸入框的值const [inputValue, setInputValue] = useState('');// 處理輸入框的變化const handleChange = (e) => {setInputValue(e.target.value);  // 更新 state};return (<div><label>輸入框:<inputtype="text"value={inputValue}  // 受控組件的值來自 stateonChange={handleChange}  // 處理用戶輸入/></label><p>輸入的值: {inputValue}</p></div>);
};export default ControlledInput;

解釋:

  • value={inputValue}:輸入框的值與 state 綁定。
  • onChange={handleChange}:每次用戶輸入時,handleChange 會更新 inputValue 狀態,React 會觸發重新渲染。

**非受控組件:**值不同步 state,使用 defaultValue 屬性

概念:

在 React 中,非受控組件是指表單元素的值由 DOM 自身管理,而不是由 React 的 state 來控制。你可以使用 ref 來直接訪問和修改表單元素的值。與受控組件不同,非受控組件不需要綁定 valueonChange 來處理輸入數據。

與受控組件不同,非受控組件不需要將輸入框的值綁定到 state,它直接操作 DOM。

Case:

import React, { useRef } from 'react';const UncontrolledInput = () => {const inputRef = useRef(); // 創建引用來訪問輸入框const handleSubmit = (e) => {e.preventDefault();alert('輸入的內容:' + inputRef.current.value); // 使用 ref 獲取輸入的值};return (<form onSubmit={handleSubmit}><label>輸入框:<input type="text" ref={inputRef} /> {/* 沒有綁定 state */}</label><br /><button type="submit">提交</button></form>);
};export default UncontrolledInput;

受控組件與非受控組件的對比:

特性受控組件非受控組件
值來源值由組件的 state 控制值由 DOM 元素本身控制,通過 ref 獲取
更新方式通過 onChange 更新 state通過 ref 獲取 DOM 元素的當前值
優點- 組件狀態與視圖同步- 代碼簡單,適用于不需要實時控制的表單
- 可隨時訪問表單數據- 性能較好,避免了頻繁的狀態更新
缺點- 對于每個表單控件需要管理狀態,代碼較冗長- 不適合需要動態交互或表單驗證的場景
適用場景- 動態表單數據交互(如驗證、格式化等)- 簡單的表單,數據獲取僅在提交時才需要

總結:

React 推薦使用受控組件,看似繁瑣,但更加可控

  • 受控組件:值由 React 狀態控制,適合需要動態交互、驗證、格式化等場景。
  • 非受控組件:值由 DOM 控制,適合簡單表單或不需要頻繁更新組件狀態的場景。


搜索框開發

思考要點:

  • 搜索框的值應該傳遞到地址欄中。當其他組件需要使用時,可以通過該值來處理。

注意:不建議組件與組件之間直接傳值,來實現狀態切換。而是統一傳遞到地址欄,然后再獲取。

http://ocalhost:3000/manage/ist
http://localhost:3000/manage/list?keyword=hello
http://localhost:3000/manage/list?keyword=hello&page=2

image.png

設計要點:

  • 傳遞搜索參數到URL(useNavigate)
  • URL搜索參數同步到搜索框(useSearchParams)
import React, { FC, useEffect, useState } from 'react'
import type { ChangeEvent } from 'react'
import { Input } from 'antd'
import { useNavigate, useLocation, useSearchParams } from 'react-router-dom'
import { LIST_SEARCH_PLACEHOLDER } from '../constant'const { Search } = Inputconst ListSearch: FC = () => {const nav = useNavigate()const { pathname } = useLocation()const [value, setValue] = useState('')const [searchParams] = useSearchParams()useEffect(() => {const keyword = searchParams.get(LIST_SEARCH_PLACEHOLDER) || ''setValue(keyword)// 每當 searchParams 變化時,更新 value}, [searchParams])function handleSearch(value: string) {nav({pathname,search: `${LIST_SEARCH_PLACEHOLDER}=${value}`,})}function handleChange(e: ChangeEvent<HTMLInputElement>) {setValue(e.target.value)}return (<Searchplaceholder="搜索"allowClearenterButton="搜索"size="middle"value={value}onChange={handleChange}onSearch={handleSearch}style={{ width: '260px' }}/>)
}export default ListSearch


注冊登陸頁開發

注冊頁開發

效果:

image.png

要點:

  • 表單校驗實現
  • 細節:標簽框長度設計

參考:標簽框長度設計

Register.tsx

import React, { FC } from 'react'
import styles from './Register.module.scss'
import { Typography, Space, Form, Input, Button } from 'antd'
import { Link } from 'react-router-dom'
import { UserAddOutlined } from '@ant-design/icons'
import { LOGIN_PATHNAME } from '../router'const { Title } = Typographyconst Register: FC = () => {function onFinish(values: {username: stringpassword: stringconfirm: stringnickname: string}) {console.log('Success:', values)}return (<div className={styles.container}><div><Space><Title level={2}><UserAddOutlined /></Title><Title level={2}>注冊新用戶</Title></Space></div><div><FormlabelCol={{ span: 8 }}wrapperCol={{ span: 16 }}onFinish={onFinish}><Form.Itemlabel="用戶名"name="username"rules={[{ required: true, message: '請輸入你的用戶名!' },{ min: 4, max: 20, message: '用戶名長度在 4-20 之間' },{pattern: /^[a-zA-Z0-9_]+$/,message: '用戶名只能由字母、數字和下劃線組成',},]}><Input /></Form.Item><Form.Itemlabel="密碼"name="password"rules={[{ required: true, message: '請輸入你的密碼!' }]}><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()}return Promise.reject('兩次輸入的密碼不一致!')},}),]}><Input.Password /></Form.Item><Form.Itemlabel="昵稱"name="nickname"rules={[{ required: true, message: '請輸入你的昵稱!' }]}><Input /></Form.Item><Form.Item wrapperCol={{ offset: 8, span: 16 }}><Space><Button type="primary" htmlType="submit">注冊</Button><Link to={LOGIN_PATHNAME}>已有賬戶,請登陸</Link></Space></Form.Item></Form></div></div>)
}export default Register

登陸頁開發

效果:

image.png

要點:

  • 用戶名、密碼記住存儲實現
  • useForm Hook 實現表單值同步

Login.tsx

import React, { FC, useEffect } from 'react'
import styles from './Register.module.scss'
import { Typography, Space, Form, Input, Button, Checkbox } from 'antd'
import { Link } from 'react-router-dom'
import { UserAddOutlined } from '@ant-design/icons'
import { REGISTER_PATHNAME } from '../router'const { Title } = Typographyconst USERNAME_KEY = 'USERNAME'
const PASSWORD_KEY = 'PASSWORD'function rememberUser(username: string, password: string) {localStorage.setItem(USERNAME_KEY, username)localStorage.setItem(PASSWORD_KEY, password)
}function deleteUserFromLocalStorage() {localStorage.removeItem(USERNAME_KEY)localStorage.removeItem(PASSWORD_KEY)
}function getUserFromLocalStorage() {return {username: localStorage.getItem(USERNAME_KEY),password: localStorage.getItem(PASSWORD_KEY),}
}const Login: FC = () => {const [form] = Form.useForm() // 第三方 hookuseEffect(() => {const { username, password } = getUserFromLocalStorage()form.setFieldsValue({ username, password })}, [])const onFinish = (values: {username: stringpassword: stringremember: boolean}) => {const { remember } = values || {}if (remember) {rememberUser(values.username, values.password)} else {deleteUserFromLocalStorage()}}return (<div className={styles.container}><div><Space><Title level={2}><UserAddOutlined /></Title><Title level={2}>登陸</Title></Space></div><div><FormlabelCol={{ span: 8 }}wrapperCol={{ span: 16 }}onFinish={onFinish}initialValues={{ remember: true }}form={form}><Form.Itemlabel="用戶名"name="username"rules={[{ required: true, message: '請輸入你的用戶名!' }]}><Input /></Form.Item><Form.Itemlabel="密碼"name="password"rules={[{ required: true, message: '請輸入你的密碼!' }]}><Input.Password /></Form.Item><Form.Itemname="remember"valuePropName="checked"wrapperCol={{ offset: 8, span: 16 }}><Checkbox>記住我</Checkbox></Form.Item><Form.Item wrapperCol={{ offset: 8, span: 16 }}><Space size="large"><Button type="primary" htmlType="submit">登陸</Button><Link to={REGISTER_PATHNAME}>注冊新用戶</Link></Space></Form.Item></Form></div></div>)
}export default Login


參考工具:表單校驗

  • Ant Design rules
  • React-hook-form
  • Formik

封裝細節

縮短請求參數

封裝 useLoadQuestionListData 時,對于 opt 參數,可以不填寫默認值,從而縮短請求參數。

**對比:**填寫默認參數

image.png

不填寫默認參數

image.png

**請求對比:**左邊為填寫默認參數,右邊為不填寫

image.png


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入剖析 Vue 的響應式原理:構建高效 Web 應用的基石

深入剖析 Vue 的響應式原理&#xff1a;構建高效 Web 應用的基石 在前端開發的廣闊天地里&#xff0c;Vue.js 憑借其簡潔易用的特性和強大的功能&#xff0c;成為眾多開發者的心頭好。其中&#xff0c;響應式原理作為 Vue 的核心亮點之一&#xff0c;讓數據與視圖之間實現了高…

QCustomplot庫運用

最近需要用到這個庫顯示數據&#xff0c;需要在一個曲線圖4個Y軸共用一個X軸&#xff0c;并且做游標&#xff0c;跟隨鼠標移動&#xff0c;并且實時反饋數據到表格中。記錄一下程序。 customPlot new QCustomPlot(this); customPlot->setBackground(QBrush(QColor(204,204,…

STM32 串口 (DMA + 空閑中斷 + 環形緩沖區)

STM32 串口 &#xff08;DMA 空閑中斷 環形緩沖區&#xff09; 1. 基本概念 UART 空閑中斷&#xff08;IDLE&#xff09;&#xff1a; 當串口 RX 線上 連續一段時間沒有數據接收&#xff0c;USART 外設觸發 空閑中斷。空閑中斷的主要作用是通知數據傳輸完成或當前幀結束。 D…

股指期貨是什么?股指期貨日內拐點有什么特征?

股指期貨是一種金融衍生品&#xff0c;股指期貨日內拐點就是在一天交易過程中&#xff0c;市場走勢發生顯著改變的那個點。 股指期貨是什么&#xff1f; 股指是一個指數&#xff0c;比如上證50指數、滬深300指數、中證500指數以及中證1000指數&#xff0c;這是一堆股票的一個整…

Opensearch/ElasticSearch-ctx查詢內容不全的問題

問題 在OpenSearch中&#xff0c;我希望在action中把一整條log作為報警內容發送出來&#xff0c;但是根據文檔&#xff0c;配置為ctx.results.0.hits.hits.0._source.log&#xff0c;但是發現根本找不到這個值 經過查詢&#xff0c;我發現在返回的ctx中僅存在如下的值 resul…

vue2和vue3插槽slot最通俗易懂的區別理解

在 Vue 的組件通信中&#xff0c;slot&#xff08;插槽&#xff09;的編譯優化是一個重要的性能提升點。以下是 Vue2 和 Vue3 在 slot 處理上的差異及優化原理&#xff0c;用更直觀的方式解釋&#xff1a; Vue2 的 Slot 更新機制 想象一個父子組件場景&#xff1a; 父組件&am…

【16屆藍橋杯寒假刷題營】第1期DAY4

1.披薩和西藍花 - 藍橋云課 1. 披薩和西藍花 問題描述 在接下來的 N 天里&#xff08;編號從 1 到 N&#xff09;&#xff0c;坤坤計劃烹飪披薩或西蘭花。他寫下一個長度為 N 的字符串 A&#xff0c;對于每個有效的 i&#xff0c;如果字符 Ai 是 1&#xff0c;那么他將在第 i…

你需要了解的遠程登錄協議——Telnet

你需要了解的遠程登錄協議——Telnet 一. 什么是Telnet&#xff1f;二. Telnet的優缺點三. Telnet vs SSH&#xff1a;哪一個更適合&#xff1f;四. Telnet的應用場景 前言 點個免費的贊和關注&#xff0c;有錯誤的地方請指出&#xff0c;看個人主頁有驚喜。 作者&#xff1a;神…

本地部署【LLM-deepseek】大模型 ollama+deepseek/conda(python)+openwebui/docker+openwebui

通過ollama本地部署deepseek 總共兩步 1.模型部署 2.[web頁面] 參考官網 ollama:模型部署 https://ollama.com/ open-webui:web頁面 https://github.com/open-webui/open-webui 設備參考 Mac M 芯片 windows未知 蒸餾模型版本:deepseek-r1:14b 運行情況macminim2 24256 本地…

PHP在線題庫小程序

&#x1f4da; 在線題庫小程序&#xff1a;學習提分新神器&#xff0c;輕松躍升學霸行列 這是一款專為追夢學子精心策劃、基于ThinkPHPUniApp框架匠心打造的在線題庫類微信小程序系統。它宛如一把?智慧鑰匙?&#xff0c;為追求高效學習的你解鎖&#x1f513;知識寶庫的大門。…

Java開發中的連接池技術介紹

連接池技術是Java開發中用于管理數據庫連接的重要技術&#xff0c;尤其在SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;架構中&#xff0c;連接池能夠顯著提升數據庫操作的性能和資源利用率。下面我們將詳細介紹連接池技術解決的問題、配置方案以及代碼實現。 1. 連…

Unity-Mirror網絡框架-從入門到精通之Pong示例

文章目錄 前言示例介紹NetworkManagerPongBallPlayer總結前言 在現代游戲開發中,網絡功能日益成為提升游戲體驗的關鍵組成部分。本系列文章將為讀者提供對Mirror網絡框架的深入了解,涵蓋從基礎到高級的多個主題。Mirror是一個用于Unity的開源網絡框架,專為多人游戲開發設計…

布隆過濾器到底是什么東西?它有什么用

布隆過濾器&#xff1a;用概率換空間的奇妙數據結構 引言&#xff1a;當空間成為奢侈品 在互聯網每天產生2.5萬億字節數據的時代&#xff0c;Google每秒處理超過9萬次搜索請求&#xff0c;Redis緩存系統支撐著百萬級QPS的訪問。面對如此海量的數據處理需求&#xff0c;傳統的…

任務1 將單表中的單個rfid增加為多個rfid

方案 使用連表查詢解決 單獨創建一個rfid的表 讓tool_id對應多個rfid 需要優化的表 1&#xff1a;tool_materials_stock 庫存管理 已完成 數據遷移完成 原庫rfid字段未刪除 2&#xff1a;tool_borrow_return 借出借還管理 已完成 3&#xff1a;too…

OutSystems Platform Tools Platform Services

概述&#xff08;Overview&#xff09; outsystems是一整套低代碼的企業級應用&#xff08;WEB 和 移動端&#xff09;的開發環境。 本文主要講解outsystems的Platform Tools與Platform Services 平臺工具&#xff08;Platform Tools&#xff09; 集成開發環境IDE&#xff0…

【深度解析】ETERM指令:離港系統的核心技術

在民航離港系統中&#xff0c;ETERM&#xff08;中航信終端模擬系統&#xff09;是廣泛使用的指令操作系統&#xff0c;主要用于航班控制、旅客值機、登機等操作。以下是一些核心的ETERM指令及其功能分類&#xff1a; 1. 航班信息查詢與操作 FLR&#xff1a;顯示航班列表&…

ES的java操作

ES的java操作 一、添加依賴 在pom文件中添加依賴包 <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elastic…

DeepSeek 從入門到精通學習指南,2025清華大學《DeepSeek從入門到精通》正式發布104頁pdf版超全解析

DeepSeek 是一款強大的 AI 搜索引擎&#xff0c;廣泛應用于企業級數據檢索和分析。無論您是初學者還是有經驗的用戶&#xff0c;掌握 DeepSeek 的使用都能為您的工作帶來極大的便利。本文將從入門到精通&#xff0c;詳細介紹如何學習和使用 DeepSeek。 鏈接: https://pan.baid…

飛書專欄-TEE文檔

CSDN學院課程連接&#xff1a;https://edu.csdn.net/course/detail/39573

2025.2.11——一、[極客大挑戰 2019]PHP wakeup繞過|備份文件|代碼審計

題目來源&#xff1a;BUUCTF [極客大挑戰 2019]PHP 目錄 一、打開靶機&#xff0c;整理信息 二、解題思路 step 1&#xff1a;目錄掃描、爆破 step 2&#xff1a;代碼審計 1.index.php 2.class.php 3.flag.php step 3&#xff1a;繞過__wakeup重置 ?編輯 三、小結…