• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    React進階學(xué)習(xí)之組件的解耦之道

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:33:17
    文檔

    React進階學(xué)習(xí)之組件的解耦之道

    React進階學(xué)習(xí)之組件的解耦之道:前言 眾所周知,React中的組件非常的靈活可擴展,不過隨著業(yè)務(wù)復(fù)雜度的增加和許多外部工具庫的引入,組件往往也會顯得浮腫,接下來我們就一起來看看常見的幾種,遵循單一職責(zé)原則的,組件分割與解耦的方法,話不多說了,來一起看看詳細的介紹: 一、分割 r
    推薦度:
    導(dǎo)讀React進階學(xué)習(xí)之組件的解耦之道:前言 眾所周知,React中的組件非常的靈活可擴展,不過隨著業(yè)務(wù)復(fù)雜度的增加和許多外部工具庫的引入,組件往往也會顯得浮腫,接下來我們就一起來看看常見的幾種,遵循單一職責(zé)原則的,組件分割與解耦的方法,話不多說了,來一起看看詳細的介紹: 一、分割 r

    前言

    眾所周知,React中的組件非常的靈活可擴展,不過隨著業(yè)務(wù)復(fù)雜度的增加和許多外部工具庫的引入,組件往往也會顯得浮腫,接下來我們就一起來看看常見的幾種,遵循單一職責(zé)原則的,組件分割與解耦的方法,話不多說了,來一起看看詳細的介紹:

    一、分割 render 函數(shù)

    當(dāng)一個組件渲染的內(nèi)容較多時,有一個快速并且通用的方法是創(chuàng)建sub-render函數(shù)來簡化原來龐大的 render

    class Panel extends React.Component {
     renderHeading() {
     // ...
     }
    
     renderBody() {
     // ...
     }
    
     render() {
     return (
     <div>
     {this.renderHeading()}
     {this.renderBody()}
     </div>
     );
     }
    }

    為了再次簡化sub-render函數(shù),我們還可以采用Functional Components寫法,這種方式生成了更小的處理單元,且更有利于測試

    const PanelHeader = (props) => (
     // ...
    );
    
    const PanelBody = (props) => (
     // ...
    );
    
    class Panel extends React.Component {
     render() {
     return (
     <div>
     // Nice and explicit about which props are used
     <PanelHeader title={this.props.title}/>
     <PanelBody content={this.props.content}/>
     </div>
     );
     }
    }

    二、用 props 傳遞元素

    如果一個組件的狀態(tài)或配置較多,我們可以運用props傳遞元素而不僅是數(shù)據(jù),比如再聲明一個組件,使其中的父組件只專注于配置

    class CommentTemplate extends React.Component {
     static propTypes = {
     // Declare slots as type node
     metadata: PropTypes.node,
     actions: PropTypes.node,
     };
    
     render() {
     return (
     <div>
     <CommentHeading>
     <Avatar user={...}/>
    
     // Slot for metadata
     <span>{this.props.metadata}</span>
    
     </CommentHeading>
     <CommentBody/>
     <CommentFooter>
     <Timestamp time={...}/>
    
     // Slot for actions
     <span>{this.props.actions}</span>
    
     </CommentFooter>
     </div>
     );
     }
    }

    父組件

    class Comment extends React.Component {
     render() {
     const metadata = this.props.publishTime ?
     <PublishTime time={this.props.publishTime} /> :
     <span>Saving...</span>;
    
     const actions = [];
     if (this.props.isSignedIn) {
     actions.push(<LikeAction />);
     actions.push(<ReplyAction />);
     }
     if (this.props.isAuthor) {
     actions.push(<DeleteAction />);
     }
    
     return <CommentTemplate metadata={metadata} actions={actions} />;
     }
    }

    三、使用高階組件

    實現(xiàn)點擊某組件的超鏈接,發(fā)送該組件的 ID,我們大多的解決方法可能如下

    class Document extends React.Component {
     componentDidMount() {
     ReactDOM.findDOMNode(this).addEventListener('click', this.onClick);
     }
    
     componentWillUnmount() {
     ReactDOM.findDOMNode(this).removeEventListener('click', this.onClick);
     }
    
     onClick = (e) => {
     if (e.target.tagName === 'A') { // Naive check for <a> elements
     sendAnalytics('link clicked', {
     documentId: this.props.documentId // Specific information to be sent
     });
     }
     };
    
     render() {
     // ...
     }
    }

    然而它卻存在代碼不能復(fù)用,組件重構(gòu)困難等問題

    我們可以使用高階組件來解決這些問題,顧名思義,高階組件就是一個函數(shù),傳給它一個組件,它返回一個新的組件

    function withLinkAnalytics(mapPropsToData, WrappedComponent) {
     class LinkAnalyticsWrapper extends React.Component {
     componentDidMount() {
     ReactDOM.findDOMNode(this).addEventListener('click', this.onClick);
     }
    
     componentWillUnmount() {
     ReactDOM.findDOMNode(this).removeEventListener('click', this.onClick);
     }
    
     onClick = (e) => {
     if (e.target.tagName === 'A') { // Naive check for <a> elements
     const data = mapPropsToData ? mapPropsToData(this.props) : {};
     sendAnalytics('link clicked', data);
     }
     };
    
     render() {
     // Simply render the WrappedComponent with all props
     return <WrappedComponent {...this.props} />;
     }
     }
    
     return LinkAnalyticsWrapper;
    }

    簡化代碼如下

    class Document extends React.Component {
     render() {
     // ...
     }
    }
    
    export default withLinkAnalytics((props) => ({
     documentId: props.documentId
    }), Document);

    總結(jié)

    以上 3 個 React 組件的解耦重構(gòu)方法都可以直接拿來運用,最開始可能會覺得有點棘手,但是沒關(guān)系,只要堅持下來,你就會寫出更強壯和可復(fù)用的代碼。

    好了,

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    React進階學(xué)習(xí)之組件的解耦之道

    React進階學(xué)習(xí)之組件的解耦之道:前言 眾所周知,React中的組件非常的靈活可擴展,不過隨著業(yè)務(wù)復(fù)雜度的增加和許多外部工具庫的引入,組件往往也會顯得浮腫,接下來我們就一起來看看常見的幾種,遵循單一職責(zé)原則的,組件分割與解耦的方法,話不多說了,來一起看看詳細的介紹: 一、分割 r
    推薦度:
    標(biāo)簽: 學(xué)習(xí) 組件 React
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产日韩久久久精品影院首页| 无码精品A∨在线观看中文| 精品亚洲一区二区三区在线观看| 精品国产三级a∨在线| 精品无码三级在线观看视频| 精品国内片67194| 国产精品无码无片在线观看| 亚洲精品色婷婷在线影院| 精品国产91久久久久久久a| 亚洲色图国产精品| 国产AV国片精品| 日韩欧精品无码视频无删节| 亚洲AV永久无码精品一区二区国产 | 韩国三级中文字幕hd久久精品| 久久精品免费一区二区三区| 精品一区二区三区无码免费视频| 最新欧美性爱精品一区二区三区| 欧美激情精品久久久久久久九九九| 精品久久久久中文字幕一区| 国产内地精品毛片视频| 国产福利精品视频自拍 | 精品欧美激情在线看| 国产精品久久久久乳精品爆| 91精品国产麻豆国产自产在线| 国产91精品在线| 国产成人精品高清在线观看99| 97热久久免费频精品99| 久久99精品久久只有精品| 久久影院综合精品| 精品熟女少妇av免费久久| 久久国产热精品波多野结衣AV| 人妻熟妇乱又伦精品视频| 熟妇无码乱子成人精品| 蜜芽亚洲av无码精品色午夜| 人妻精品久久久久中文字幕69| 久久久久人妻一区精品色| 狼色精品人妻在线视频| 国产福利精品一区二区| 国产精品v欧美精品v日韩精品| 久久精品国产精品亚洲精品| 四虎影视884a精品国产四虎|