基于React 的 AntD 庫進行前端開發過程中的問題匯總

背景

最近寫了半個月的 React 前端,三年沒寫過 React 前端了,有些生疏了,匯總一下 基于React 前端的 antD 庫編寫過程中的低級問題吧。

PS 一下,半個月沒有發布博客了,C站產品經理又悄默默地改了樣式,博客作為已經二十幾年的常用功能,動不動就改 UI ,產品經理怎么想的!

碰到的問題匯總如下:

  1. Form.Item 嵌套兩個表單,第一個表單是 Switch 時,初始值 checked 不生效問題。
  2. Tree 自定義節點后面的操作通過 titleRender 添加節點的編輯/刪除等按鈕時,自定義事件和節點本身的選中事件沖突問題。
  3. Tree 在初始化完成后 defaultExpandAll 不生效問題。
  4. TreeSelect 組件傳遞的數據結構不包含默認的 label 和 value值時,需要配置字段映射。
  5. 構造函數中設置了 state 某個屬性a,將該屬性傳遞給子組件后,又在 mounted 的 setState 改屬性后子組件獲取到仍然是最初綁定的值問題。
  6. 子組件是用 Function 方式定義的,父組件設置 ref 對象后,通過 refs 取到為空的問題。
  7. Form 表單設置 initialValues 初始化值后,調用 resetFields 不能清空表單的問題。

Switch 初始化不生效問題

出現一個問題,一個表單嵌套的表單中,第一個表單的 Switch 選中時顯示第二個表單。但是第一個表單初始化值總是不對。

<Form.Itemlabel="開關狀態"name="status"rules={[{ required: true, message: '請選擇!' }]}><Switch size="large" checked={this.state.checked} onChange={this.changeChecked}/>{this.state.checked ?<Form.Item name="refId" rules={[{ required: true, message: '請選擇數據!' }]}><SelectshowSearchallowClearoptionFilterProp="label"placeholder="請選擇"options={this.state.options}/></Form.Item>: null}

在第一個 Switch 的 Form.Item 上設置 valuePropName="checked" initialValue={true} 也無效,折中辦法是在 Switch 上設置 checked 屬性跟頁面某狀態綁定,繞過表單。

Tree defaultExpandAll 不生效問題

根據官方說法:在異步加載數據時為何不生效?default 前綴屬性只有在初始化時生效,因而異步加載數據時 defaultExpandAll 已經執行完成。

你可以通過受控 expandedKeys 或者在數據加載完成后渲染 Tree 來實現全部展開。

解決辦法,設置一個異步加載樹數據的標識 isInit,完成后再顯示樹組件:

{this.state.isInit ?<TreedefaultExpandAll={true}onSelect={this.handleClickTree}treeData={this.state.treeData}titleRender={nodeData => this.titleRender(nodeData)}/>: null
}

Tree 自定義 titleRender 操作事件和點擊事件沖突問題

上面的代碼中自定義了節點渲染函數,額外添加了節點后的幾個操作,如查看/編輯/刪除等。但是發現按鈕操作時,節點自身的 onSelect 事件也被觸發了。

解決辦法,渲染事件觸發時調用 e.stopPropagation() 阻止事件冒泡。

<Menu onClick={(e) => this.handleBatchClick(e, node)}><Menu.Item key="view" >查看</Menu.Item><Menu.Item key="edit" >編輯</Menu.Item><Popconfirm title={<p style={{lineHeight: '25px'}}>確定刪除嗎?</p>}onConfirm={(e) => this.delete(e,[node.key])}onCancel={(e) => { e.stopPropagation(); }}}okText="刪除"okType="danger" ><Menu.Item key="delete">刪除</Menu.Item></Popconfirm>       
</Menu>

TreeSelect 組件字段映射配置

Tree 組件的數據的格式「元素結構 {title: "xx", key: "xx", children:[], isLeaf: false} 的數組」和 TreeSelect 的默認數據格式「元素結構是 {label:'', value:'' } 的集合」,兩者不一致的,如果兩者共用相同的 URL請求,對 TreeSelect 來說存在獲取不到選中值的問題。

解決辦法,對 TreeSelect 設置 fieldNames 屬性完成 label 和 value 的映射。

<TreeSelect treeDefaultExpandAll placeholder={'請選擇 '}treeData={this.state.treeData}fieldNames={{label:'title',value:'key'}}/>

setState 修改屬性后,子組件 prop 屬性通知問題

setState 是異步函數,而子組件渲染時引用的應該是初始化設置的值,如果異步函數中修改了該屬性,子組件以及完成渲染了,它獲取到的 props 中該屬性的值就是最初的值,不能感知到最新的值。

解決辦法,各自組件中在 state中維護自身的屬性,然后通過父子組件通信完成屬性的更新。

  1. 子組件定義時引用的 props 盡量是已經確定的數據,比如在父類構造函數中定義屬性時能直接確定的值,就不要再 componentDidMount 中再通過 setState 設置一次了;否則當狀態變更時考慮通知子組件。
  2. 父組件通過 ref 調用子組件的方法。
  3. 子組件通過 props 傳遞的回調函數調用父組件的方法。

基于函數定義的子組件無法通過 Ref對象引用問題

在 React 中,函數組件不能直接接收 ref,因為它們沒有實例對象。因此,父組件無法直接通過 ref 獲取函數組件的引用。但可以通過以下方式實現類似功能:

? 方法一:使用 React.forwardRef 和 useImperativeHandle
這是最推薦的方式,可以確保父組件能夠訪問子組件的 DOM 元素或方法。
? 方法二:使用 ref 回調函數
如果不需要暴露子組件的方法,也可以通過 ref 回調函數間接獲取子組件的引用。
? 方法三:統一定義為基于Component的組件。

Form 表單初始化和重置問題

Form 表單可以通過 initialValues 初始值,同時表單的 resetFields 是重置為這個初始值的,所以它不能清空表單。

對于返回操作帶來的搜索條件,先通過該屬性設置初始化值,然后在重置按鈕中需要逐個對搜索表單設置為空

handleReset = () => {// 重置操作,是清空整個搜索表單,而 resetFields 是重置為 initialValues 所以需要用 setFieldsValue 逐個重置this.searchFromRef.current.setFieldsValue({c1: '',c2: '',c3: ''});const formData = this.searchFromRef.current.getFieldsValue();this.onFinish(formData);}

啟示錄

前端編寫正反饋還是挺快的,一個增刪改查功能的頁面能寫一周,各種搜索,時間過得也挺快的。除了組件問題外,函數事件,組件定義寫寫就熟悉了。

有一個感覺就是,mounted 事件動不動就觸發了,render 函數不停地被調用。難道一個屬性變化,都會觸發一次組件重新掛載嗎?感覺跟 vue 的不一樣呢。

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

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

相關文章

Spring @Scheduled vs XXL-JOB vs DolphinScheduler vs Airflow:任務調度框架全景對比

引言 從單機定時任務到分布式工作流調度&#xff0c;不同場景需要選擇匹配的調度框架。 本文對比 Spring Scheduled、XXL-JOB、DolphinScheduler &#xff08;海豚調度器&#xff09;和 Apache Airflow 的核心差異&#xff0c;助你避免過度設計或功能不足。 一、核心定位與適用…

springMVC-10驗證及國際化

驗證 概述 ● 概述 1. 對輸入的數據(比如表單數據)&#xff0c;進行必要的驗證&#xff0c;并給出相應的提示信息。 2. 對于驗證表單數據&#xff0c;springMVC提供了很多實用的注解, 這些注解由JSR303 驗證框架提供. ●JSR 303 驗證框架 1. JSR 303 的含義 JSR&#xff0…

OpenCV 滑動條調整圖像對比度和亮度

一、知識點 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、創建一個滑動條并將其附在指定窗口上。 (2)、參數說明: trackbarname: 創建的…

ReadWriteLock(讀寫鎖)和 StampedLock

1. ReadWriteLock&#xff08;讀寫鎖&#xff09;&#xff1a;實現高性能緩存 總結&#xff1a; 要點 內容 適用場景 讀多寫少、高并發讀取場景&#xff08;如緩存&#xff09; 鎖類型 ReadWriteLock接口&#xff0c;ReentrantReadWriteLock實現 讀鎖 vs 寫鎖 多線程可…

【決勝公務員考試】求職OMG——見面課測驗1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答題&#xff0c;大家注意呀&#xff01; 博主碼字不易點個關注吧,祝期末順利~~ 1.單選題(2分) 下列說法錯誤的是:&#xff08; B &#xff09; A.選調生屬于公務員系統 B.公務員屬于事業編 C.選調生有基層鍛煉的要求 D…

vue3 el-button 自定義本地圖標

設置不生效的原因可能有&#xff1a;1.style標簽里沒加scoped <style scoped></style>2.本地圖片路徑指向錯誤3.自定義圖片長寬沒設置4.deep深度選擇器使用錯誤&#xff0c;vue3用:deep() <el-tooltip content"重新匹配" placement"top"&g…

如何在最短時間內提升打ctf(web)的水平?

剛剛刷完2遍 bugku 的 web 題&#xff0c;前來答題。 每個人對刷題理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟著writeup做了一遍就等于刷了&#xff0c;還有的人是獨立思考做了一遍就等于刷了。…

6.8 note

paxos算法_初步感知 Paxos算法保證一致性主要通過以下幾個關鍵步驟和機制&#xff1a; 準備階段 - 提議者向所有接受者發送準備請求&#xff0c;請求中包含一個唯一的編號。 - 接受者收到請求后&#xff0c;會檢查編號&#xff0c;如果編號比它之前見過的都大&#xff0c;就會承…

c++ openssl 使用 DES(數據加密標準)進行加密和解密的基本操作

使用 DES&#xff08;數據加密標準&#xff09;進行加密和解密的基本操作&#xff0c;重點展示了 ECB 和 CBC 模式&#xff0c;并且通過篡改密文的方式來進行攻擊。下面是對每個部分的詳細解析。 1. 結構體 Slip struct Slip {char from[16] { 0 }; // 交易的發起者&#x…

OpenWrt:使用ALSA實現邊錄邊播

ALSA是Linux系統中的高級音頻架構&#xff08;Advanced Linux Sound Architecture&#xff09;。目前已經成為了linux的主流音頻體系結構&#xff0c;想了解更多的關于ALSA的知識&#xff0c;詳見&#xff1a;http://www.alsa-project.org 在內核設備驅動層&#xff0c;ALSA提供…

【.net core】天地圖坐標轉換為高德地圖坐標(WGS84 坐標轉 GCJ02 坐標)

類文件 public static class WGS84ToGCJ02Helper {// 定義一些常量private const double PI 3.14159265358979324;private const double A 6378245.0;private const double EE 0.00669342162296594323;// 判斷坐標是否在中國范圍內&#xff08;不在國內則不進行轉換&#x…

Matlab自學筆記五十七:符號運算、可變精度運算、雙精度浮點型運算,三種運算精度的概念、比較、選擇和應用

1.可變精度算術的概念 默認的&#xff0c;Matlab雙精度浮點數使用16位數字精度&#xff0c;而符號數學工具箱的vpa函數&#xff0c;提供了無限大的可變精度&#xff0c;它默認使用32位數字精度&#xff0c;32位指的是有效數字的位數&#xff1b; 2.具體用法 程序示例&#x…

由匯編代碼確定switch語句

int switch2(int x) {int result0;switch(x){/* switch語句主體缺失 */}return result; }在編譯函數時&#xff0c;GCC為程序的初始部分以及跳轉表生成了如下匯編代碼。 1 MOVL 8(%ebp), %eax ;x位于相對于寄存器%ebp偏移量為8的地方。 2 ADDL $2, %eax …

java 使用HanLP 入門教程

1. 安裝 HanLP Maven 依賴 <dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version> <!-- 最新版本請查看官網 --> </dependency>注意&#xff1a;portable 版本…

vm虛擬機添加虛擬機無反應,獲取所有權

問題描述 虛擬機忘記關機&#xff0c;就把電腦關了&#xff0c;早上打開用不了了&#xff0c;重新添加&#xff0c;也沒反應&#xff0c;獲取所有權后就沒了 問題解決 將虛擬機文件目錄下的.lck文件夾&#xff0c;刪除&#xff0c;或者改個名&#xff0c;我是改為了.backup方…

為何選擇Spring框架學習設計模式與編碼技巧?

&#x1f4cc; 結論先行 推薦項目&#xff1a;Spring Framework 推薦理由&#xff1a;設計模式覆蓋全面 編碼技巧教科書級實現 Java 生態基石地位 &#x1f3c6; 三維度對比分析 維度SpringMyBatisXXL-JOB設計模式??????????代碼抽象??????????生態價…

MySQL 索引:聚集索引與二級索引

在數據庫性能優化的征途中&#xff0c;索引無疑扮演著至關重要的角色。正確理解和使用索引&#xff0c;能夠顯著提升查詢效率&#xff0c;為應用帶來絲滑般的操作體驗。今天&#xff0c;我們將深入 MySQL 的心臟&#xff0c;重點探討 InnoDB 存儲引擎中兩種核心的索引類型&…

【Elasticsearch】映射:詳解 _source store 字段

映射&#xff1a;詳解 _source & store 字段 1._source 字段1.1 特點1.2 示例 2.store 字段2.1 特點2.2 示例 3.兩者對比3.1 使用建議3.2 實際應用示例 1._source 字段 _source 是 Elasticsearch 中一個特殊的元字段&#xff0c;它存儲了文檔在索引時的原始 JSON 內容。 …

新建網站部署流程

1. 新建 Node 服務&#xff0c;指定端口并代理前端靜態資源 操作步驟&#xff1a; 初始化 Node 項目mkdir my-website && cd my-website npm init -y npm install express創建 app.js&#xff08;示例代碼&#xff09;const express require(express); const app e…

時序數據庫IoTDB結合SeaTunnel實現高效數據同步

益、基本概念介紹 1.1 Apache IoTDB Apache IoTDB是一款專為工業物聯網設計的時序數據庫管理系統&#xff0c;集數據收集、存儲、管理與分析于一體&#xff0c;滿足海量數據存儲、高速讀取及復雜數據分析需求。其架構包括時序文件&#xff08;TsFile&#xff09;、數據庫引擎…