網站首頁 編程語言 正文
一、組件是什么
組件就是把圖形、非圖形的各種邏輯均抽象為一個統一的概念(組件)來實現開發的模式
在React
中,一個類、一個函數都可以視為一個組件
組件所存在的優勢:
- 降低整個系統的耦合度,在保持接口不變的情況下,我們可以替換不同的組件快速完成需求,例如輸入框,可以替換為日歷、時間、范圍等組件作具體的實現
- 調試方便,由于整個系統是通過組件組合起來的,在出現問題的時候,可以用排除法直接移除組件,或者根據報錯的組件快速定位問題,之所以能夠快速定位,是因為每個組件之間低耦合,職責單一,所以邏輯會比分析整個系統要簡單
- 提高可維護性,由于每個組件的職責單一,并且組件在系統中是被復用的,所以對代碼進行優化可獲得系統的整體升級
二、如何構建
在React
目前來講,組件的創建主要分成了三種方式:
- 函數式創建
- 通過 React.createClass 方法創建
- 繼承 React.Component 創建
函數式創建
在React Hooks
出來之前,函數式組件可以視為無狀態組件,只負責根據傳入的props
來展示視圖,不涉及對state
狀態的操作
大多數組件可以寫為無狀態組件,通過簡單組合構建其他組件
在React
中,通過函數簡單創建組件的示例如下:
function HelloComponent(props, /* context */) { return <div>Hello {props.name}</div> }
通過 React.createClass 方法創建
React.createClass
是react剛開始推薦的創建組件的方式,目前這種創建方式已經不怎么用了
像上述通過函數式創建的組件的方式,最終會通過babel
轉化成React.createClass
這種形式,
轉化成如下:
function HelloComponent(props) /* context */{ return React.createElement( "div", null, "Hello ", props.name ); }
由于上述的編寫方式過于冗雜,目前基本上不使用上
繼承 React.Component 創建
同樣在react hooks
出來之前,有狀態的組件只能通過繼承React.Component
這種形式進行創建
有狀態的組件也就是組件內部存在維護的數據,在類創建的方式中通過this.state
進行訪問
當調用this.setState
修改組件的狀態時,組價會再次會調用render()
方法進行重新渲染
通過繼承React.Component
創建一個時鐘示例如下:
class Timer extends React.Component { constructor(props) { super(props); this.state = { seconds: 0 }; } tick() { this.setState(state => ({ seconds: state.seconds + 1 })); } componentDidMount() { this.interval = setInterval(() => this.tick(), 1000); } componentWillUnmount() { clearInterval(this.interval); } render() { return ( <div> Seconds: {this.state.seconds} </div> ); } }
三、區別
由于React.createClass
創建的方式過于冗雜,并不建議使用
而像函數式創建和類組件創建的區別主要在于需要創建的組件是否需要為有狀態組件:
- 對于一些無狀態的組件創建,建議使用函數式創建的方式
- 由于
react hooks
的出現,函數式組件創建的組件通過使用hooks
方法也能使之成為有狀態組件,再加上目前推崇函數式編程,所以這里建議都使用函數式的方式來創建組件
在考慮組件的選擇原則上,能用無狀態組件則用無狀態組件
原文鏈接:https://juejin.cn/post/7129062232821858312
相關推薦
- 2022-03-22 .NET?6開發TodoList實現請求日志組件HttpLogging_實用技巧
- 2022-05-03 python單例模式之selenium?driver實現單例_python
- 2022-06-07 ASP.NET?Core服務生命周期_基礎應用
- 2022-04-21 Mybatis - tk.mybatis deleteByPrimaryKey無法正確識別主鍵
- 2022-03-20 .NET?6開發TodoList應用之實現接口請求驗證_實用技巧
- 2022-04-22 VSCode中git上傳遇到 “在簽出前,請清理存儲庫工作樹。”問題解決
- 2022-06-01 Apache?Tomcat如何高并發處理請求_Tomcat
- 2022-07-06 Nginx的mirror指令示例配置_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支