網站首頁 編程語言 正文
引言
今天將之前的內容做個系統整理,結合 React Form 案例, 來了解下為何React推薦單向數據流,如果采用雙向管理,可能的問題 (關于React Form案例,可參考相關文章 - 學習React的特征(二) - React Form
集中狀態管理
首先來看之前的React Form, 若采用單向數據流
import * as React from 'react'; const Useremail = props => <input type="email" {...props} /> const Userpassword = props => <input type="password" {...props} /> const SubmitButton = props => <button type="submit" {...props} /> const LoginForm = () => { // LoginForm狀態變化 => Useremail/Userpassword組件 const [email, setEmail] = React.useState(''); const [password, setPassword] = React.useState(''); const handleEmail = (e) => { setEmail(e.target.value); }; const handlePassword = (e) => { setPassword(e.target.value); }; const handleSubmit = (e) => { e.preventDefault(); alert(email + ' ' + password); }; return ( <form onSubmit={handleSubmit}> <div> <label htmlFor="email">Email</label> <Useremail id="email" type="text" value={email} onChange={handleEmail} /> </div> <div> <label htmlFor="password">Password</label> <Userpassword id="password" type="password" value={password} onChange={handlePassword} /> </div> <SubmitButton type="submit">Submit</SubmitButton> </form> ); }; export { LoginForm };
可以看到, 每次Useremail
or Password
輸入發生改變時,LoginForm
中的email
與password
狀態動態產生改變
雙向數據流
import * as React from 'react'; // Useremail/Userpassword組件狀態變化 => LoginForm父組件 const Useremail = ({updateUseremail, ...props}) => <input type="email" onChange={e => updateUseremail(e.target.value)} {...props} /> const Userpassword = ({updateUserpassword, ...props}) => <input type="password" onChange={e => updateUserpassword(e.target.value)} {...props} /> const SubmitButton = props => <button type="submit" {...props} /> const LoginForm = () => { // LoginForm狀態變化 => Useremail/Userpassword組件 const [email, setEmail] = React.useState(''); const [password, setPassword] = React.useState(''); const handleSubmit = (e) => { e.preventDefault(); alert(email + ' ' + password); }; return ( <form onSubmit={handleSubmit}> <div> <label htmlFor="email">Email</label> <Useremail id="email" type="text" value={email} updateUseremail={setEmail} /> </div> <div> <label htmlFor="password">Password</label> <Userpassword id="password" type="password" value={password} updateUserpassword={setPassword} /> </div> <SubmitButton type="submit">Submit</SubmitButton> </form> ); }; export { LoginForm };
實際執行這兩個程序,得到的結果是一致,看起來兩者沒有什么區別
那為何不選擇雙向數據流
- 代碼維護
以上代碼可以發現,一旦LoginForm發生問題,雙向數據流需要在多個子組件和父組件中同時尋找狀態異常的原因,當程序逐漸趨于復雜化,后期維護會變得異常困難
- 組件復用
每次用戶狀態需求發生新的變化,每個子組件都要相應調整,造成組件在實際使用中難以復用
- 應用升級
另外,當程序需要做整體升級,因為狀態分散在各個組件,將會導致難以實行
小結
組件設計成響應式,從長遠看,更符合React推薦的設計模式
原文鏈接:https://juejin.cn/post/7144227935996608549
相關推薦
- 2022-03-21 詳解c++優先隊列priority_queue的用法_C 語言
- 2023-03-18 python中統計相同字符的個數方法實例_python
- 2022-06-27 ASP.net?Core微信平臺開發配置Token_實用技巧
- 2022-06-14 C#通過cmd調用7z軟件實現壓縮和解壓文件_C#教程
- 2023-05-22 PyTorch小功能之TensorDataset解讀_python
- 2022-05-25 <C++>詳解類對象作為類成員時調用構造和析構的時機及靜態成員解釋
- 2023-11-20 用python對數據進行擬合求函數表達式的方法
- 2022-02-02 ionic 禁止橫屏處理
- 最近更新
-
- 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同步修改后的遠程分支