<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

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

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

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

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

        前言

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

        一、分割 render 函數(shù)

        當(dāng)一個(gè)組件渲染的內(nèi)容較多時(shí),有一個(gè)快速并且通用的方法是創(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 傳遞元素

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

        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} />;
         }
        }

        三、使用高階組件

        實(shí)現(xiàn)點(diǎ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)困難等問題

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

        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 個(gè) React 組件的解耦重構(gòu)方法都可以直接拿來運(yùn)用,最開始可能會(huì)覺得有點(diǎn)棘手,但是沒關(guān)系,只要堅(jiān)持下來,你就會(huì)寫出更強(qiáng)壯和可復(fù)用的代碼。

        好了,

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

        文檔

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

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 中字幕视频在线永久在线观看免费 | 手机看片国产免费永久| 国产一区视频在线免费观看| 亚洲人成色在线观看| 67194成是人免费无码| 亚洲一区二区三区在线观看网站 | 成年人视频在线观看免费| 亚洲欧洲精品久久| 国产成人福利免费视频| 亚洲xxxxxx| 免费高清在线影片一区| WWW国产亚洲精品久久麻豆| 免费中文字幕在线观看| 一个人看的www视频免费在线观看| 亚洲国产成人久久一区WWW| 春意影院午夜爽爽爽免费| 国产亚洲精品高清在线| 欧美男同gv免费网站观看| 亚洲国产韩国一区二区| 五月婷婷在线免费观看| 亚洲色偷偷色噜噜狠狠99| 在线观看亚洲免费视频| free哆拍拍免费永久视频| 久久精品国产亚洲av四虎| 久久不见久久见免费视频7| 亚洲日本成本人观看| 亚洲精品岛国片在线观看| 在线观看免费黄网站| 亚洲色偷偷偷网站色偷一区| 免费鲁丝片一级在线观看| 久久久免费观成人影院| 亚洲国产精品成人久久久| 国产国产人免费人成免费视频| 国产裸体美女永久免费无遮挡| 亚洲制服中文字幕第一区| 麻豆国产入口在线观看免费| 久久精品无码免费不卡| 亚洲综合偷自成人网第页色| 亚洲AⅤ视频一区二区三区| 99在线免费观看视频| 精品国产日韩亚洲一区91|