摘要:劃分標準根據稿,不同的展示模塊分為不同的組件。比如頂部底部導航列表等容器組件業務組件與數據源后臺本地存儲進行數據傳輸操作不止是劃分標準根據業務功能劃分。最常見的是列表組件。
為什么要拆分組件
提高可讀性、可維護性
如果不拆分代碼量大,所有內容集中在一起
相同組件無法復用
業務開發分工不明確,開發人員要關心非業務的代碼
改代碼時,可能會影響其他業務,牽一發動全身(耦合)
任何一個操作都導致整個應用重新render
目標架構清晰
相同組件能夠復用
業務分工明確,開發人員僅專注與自己的業務
每個組件負責獨立的功能,與其他組件解耦合
可使用SCU、memo減少不必要渲染
如何拆分組件把相關聯的東西放一起(按功能、業務)
橫向(按業務、功能模塊劃分)
縱向(應用、系統層級劃分)
一個React組件的功能維護局部數據: state、ref、后臺返回等
獲取、修改全局數據
事件處理、數據監聽處理(useEffect/componentDidUpdate等)
IO: 網絡請求/本地讀寫
數據處理
render
組件分類 展示組件只有render方法、簡單的交互事件處理和state管理。比如Input/CheckBox等。
劃分標準: 根據UI稿,不同的展示模塊分為不同的組件。比如頂部、底部、導航、列表等
容器組件 業務組件與數據源(redux/后臺/本地存儲)進行數據傳輸操作(不止是IO)
劃分標準: 根據業務功能劃分。比如登錄、登出、支付、表單校驗等
連接組件連接業務組件和展示組件, 主要用于處理數據后傳給展示組件。
組件樹結構展示組件內可以有容器組件,容器組件內也可以有展示組件
案例 邏輯、展示分離把渲染和功能拆分成不同組件,提高復用性
不拆分登錄組件處理了2件事情:
渲染登錄表單
記錄用戶輸入和登錄狀態,向后臺發送登錄請求
class Login extends Component { constructor(props) { super(props) this.state = { account: "", password: "", status: "init", } } handleAccountChange(e) { this.setState({account: e.target.value}) } handlePasswordChange(e) { this.setState({password: e.target.value}) } handleLoginClick() { this.setState({ status: "ing" }) request("/login", { params: { account: this.state.account, password: this.state.password, } }).then(() => { this.setState({status: "succ"}) }).catch(() => { this.setState({status: "fail"}) }) } render() { return (拆分后this.handleAccountChange(...args)} /> this.handlePasswordChange(...args)} />) } }
容器組件負責實現登錄功能,展示組件負責渲染內容。
如果要實現另一套登陸組件時,可直接復用容器組件,只需要實現新的展示組件即可。
// 業務組件 可復用性比較高 function withLogin(config) { const { mapStateToProps, mapDispatchToProps } = config return (Comp) => { class Container extends Component { constructor(props) { super(props) this.state = { account: "", password: "", status: "init", } } handleAccountChange = (e) => { this.setState({account: e.target.value}) } handlePasswordChange = (e) => { this.setState({password: e.target.value}) } handleLoginClick = () => { this.setState({ status: "ing" }) request("/login", { params: { account: this.state.account, password: this.state.password, } }).then(() => { this.setState({status: "succ"}) }).catch(() => { this.setState({status: "fail"}) }) } render() { const propsFromState = mapStateToProps(this.state, this.props) const propsFromDispatch = mapDispatchToProps({ onAccountChange: this.handleAccountChange, onPasswordChange: this.handlePasswordChange, onSubmit: this.handleLoginClick, }, this.props) return (渲染優化) } } return LoginContainer } } // 展示組件 class Login extends Component { render() { const { account, password, onAccountChange, onPasswordChange, onSubmit } return ( onAccountChange(...args)} /> onPasswordChange(...args)} />) } } // 連接組件 const LoginContainer = withLogin({ mapStateToProps: (state, props) => { return { account: state.account, password: state.password, } }, mapDispatchToProps: (dispatch, props) => { return { onAccountChange: dispatch.onAccountChange, onPasswordChange: dispatch.onPasswordChange, onSubmit: dispatch.Submit, } } })
把UI上相互獨立的部分,劃分成不同組件,防止渲染時相互影響。最常見的是列表組件。
拆分前點擊一個li, 其他li全都重新渲染
class List extends Component { state = { selected: null } handleClick(id) { this.setState({selected: id}) } render() { const { items } = this.props return (
子組件使用PureComponent或memo,并且click事件回調函數直接使用this.handleClick,而不是每次都創建新函數。
點擊li,最多只會有2個子組件渲染。
// onClick時需要的參數,要傳進來 class Item extends PureComponent { render() { const { id, text, selected, onClick } = this.props return (
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105142.html
摘要:右側展現對應產品。我們使用命名為的對象表示過濾條件信息,如下此數據需要在組件中進行維護。因為組件的子組件和都將依賴這項數據狀態?;瘧迷倩氐街暗膱鼍?,我們設計化函數,進一步可以簡化為對于的偏應用即上面提到的相信大家已經理解了這么做的好處。 showImg(https://segmentfault.com/img/remote/1460000014458612?w=1240&h=663...
摘要:右側展現對應產品。我們使用命名為的對象表示過濾條件信息,如下此數據需要在組件中進行維護。因為組件的子組件和都將依賴這項數據狀態?;瘧迷倩氐街暗膱鼍埃覀冊O計化函數,進一步可以簡化為對于的偏應用即上面提到的相信大家已經理解了這么做的好處。 showImg(https://segmentfault.com/img/remote/1460000014458612?w=1240&h=663...
摘要:感謝王下邀月熊分享的前端每周清單,為方便大家閱讀,特整理一份索引。王下邀月熊大大也于年月日整理了自己的前端每周清單系列,并以年月為單位進行分類,具體內容看這里前端每周清單年度總結與盤點。 感謝 王下邀月熊_Chevalier 分享的前端每周清單,為方便大家閱讀,特整理一份索引。 王下邀月熊大大也于 2018 年 3 月 31 日整理了自己的前端每周清單系列,并以年/月為單位進行分類,具...
閱讀 2432·2021-11-22 13:53
閱讀 1126·2021-09-22 16:06
閱讀 1370·2021-09-02 15:21
閱讀 1895·2019-08-30 15:55
閱讀 3116·2019-08-29 11:19
閱讀 1911·2019-08-26 13:23
閱讀 931·2019-08-23 18:23
閱讀 1747·2019-08-23 16:06