<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)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        React Component存在的幾種形式詳解

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

        React Component存在的幾種形式詳解

        React Component存在的幾種形式詳解:前言 最近項(xiàng)目基本都是用 React,今天總結(jié)分享 React Component 常見的幾種形式,如果你在寫 React 時(shí)經(jīng)常不知道怎么拆分代碼,這篇文章或許對(duì)你有所幫助。 React.Component是一個(gè)抽象基類。這意味著直接引用React.Component是毫無意義的。你
        推薦度:
        導(dǎo)讀React Component存在的幾種形式詳解:前言 最近項(xiàng)目基本都是用 React,今天總結(jié)分享 React Component 常見的幾種形式,如果你在寫 React 時(shí)經(jīng)常不知道怎么拆分代碼,這篇文章或許對(duì)你有所幫助。 React.Component是一個(gè)抽象基類。這意味著直接引用React.Component是毫無意義的。你

        前言

        最近項(xiàng)目基本都是用 React,今天總結(jié)分享 React Component 常見的幾種形式,如果你在寫 React 時(shí)經(jīng)常不知道怎么拆分代碼,這篇文章或許對(duì)你有所幫助。

        React.Component是一個(gè)抽象基類。這意味著直接引用React.Component是毫無意義的。你可以實(shí)現(xiàn)一個(gè)它的子類,并且至少定義一個(gè)render()方法即可使用。

        為了更充分理解 React,先搞懂平時(shí)寫的 JSX 是什么。初學(xué)的時(shí)候有比較大困惑,這是一門新語(yǔ)言嗎?大部分人是匆匆掃過文檔就開始開發(fā)。通過 babel-presets-react 處理能看到,其實(shí) JSX 只是語(yǔ)法糖,最終在瀏覽器跑的還是 JS。React Component 最終都通過 React.createElement 創(chuàng)建。 總之,寫 React 其實(shí)就是在寫 JS 。


        SFC (Stateless Functional Component)

        React 可以使用 Function 來創(chuàng)建 Component,這類 Component 沒有 lifecycle, 內(nèi)部不維護(hù) state,只要傳入的 props 有變化則進(jìn)行重新渲染。

        function Welcome(props) {
        return <h1>Hello, {props.name}</h1>;
        }

        用箭頭函數(shù)的寫法還更加簡(jiǎn)潔。

        const Welcome = props => <h1>Hello, {props.name}</h1>;

        上面兩種形式生成 es5 代碼都是一樣的。

        var Welcome = function Welcome(props) {
        return _react2.default.createElement(
        "h1",
        null,
        "Hello, ",
        props.name
        );
        };

        SFC 的特點(diǎn)是純粹只做 render,代碼簡(jiǎn)短沒有其他條件分支,并且相比 class Component 編譯后的代碼量會(huì)少一些。

        尷尬的是,在 React 16.7 react hooks 出來之后,SFC 這個(gè)名字有歧義了,因?yàn)橛蒙?useState,SFC 也可以有 local state, 同樣可以擁有 lifecycle。再稱之為 Stateless Components 就很尷尬,改名叫 FC ?

        HOC (Higher-Order Components)

        高階組件對(duì)于 Vue 開發(fā)者來說應(yīng)該是個(gè)陌生的概念(不知道,我用 Vue 的時(shí)候沒見過類似的用法)。從代碼上看,高階組件就是一個(gè)方法,傳入一個(gè)組件,返回另一個(gè)組件。

        function logProps(WrappedComponent) {
        return class extends React.Component {
        componentWillReceiveProps(nextProps) {
        console.log('Current props: ', this.props);
        console.log('Next props: ', nextProps);
        }
        render() {
        return <WrappedComponent {...this.props} />;
        }
        }
        }

        最常見的高階組件是 react-redux 里面的 connect 方法,通過傳入 組件和 map*ToProps 方法,讓組件和 store 連接。組件內(nèi)部就可以直接通過 props 獲得 connect 之后的值。

        exprot default connect(
        mapStateToProps,
        mapDispatchToProps,
        )(Component);

        高階組件適合用來擴(kuò)展功能,把這部分功能從業(yè)務(wù)組件中抽離出來,需要的套上,不需要的時(shí)候移除,對(duì)被包裹組件侵入性非常小。

        Dynamic Component

        有些業(yè)務(wù)場(chǎng)景下,在執(zhí)行時(shí)才能確定具體的標(biāo)簽或者組件是什么。在 React 的世界里面,以大寫字母開頭會(huì)被當(dāng)成動(dòng)態(tài)組件加載,而小寫字母開頭會(huì)被認(rèn)為是 HTML DOM tag。

        // Heading.js
        render() {
        const { tag: Tag, children } = this.props;
        return <Tag>{ children }</Tag>
        }

        根據(jù)萬物皆為 JS 理論,只要傳入不同的 tag 標(biāo)簽,就會(huì)渲染出不同的 heading 標(biāo)簽。


        我們常用這種方式,在后端配置組件和數(shù)據(jù),前端讀取配置之后渲染出對(duì)應(yīng)的內(nèi)容。

        FaCC(Functions as Child Components)

        React children 還可以是 Function 類型,如果直接調(diào)用它會(huì)什么寫法?

        比如封裝一個(gè) Loading 組件,會(huì)給 children 提供 loading 參數(shù),業(yè)務(wù)組件再根據(jù) loading 判斷需要 render 什么內(nèi)容。

        class LoadArea extends Component {
        state = {
        loading: true,
        };
        
        componentDidMount() {
        asyncFunc()
        .then(() => {
        this.setState({
        loading: false,
        })
        })
        .catch(() => {
        this.setState({
        loading: false,
        })
        })
        }
        
        render() {
        return (
        <React.Fragment>
        {this.props.children({
        ...this.props,
        ...this.state,
        })}
        </React.Fragment>
        );
        }
        }

        用法

        render() {
        <LoadingArea>
        ({ loading }) => {
        loading
        ? <Wating />
        : <Main />
        }
        </LoadingArea>
        }

        同樣的,最終執(zhí)行時(shí)都是 JS,沒有什么好奇怪的。

        React 16.* 新版本的 Conext.Consumer 就是采用了這種寫法。

        render() {
        <ThemeContext.Provider value={this.state.theme}>
        ...
        <ThemeContext.Consumer>
        {({theme}) => (
        <button
        style={{backgroundColor: theme.background}}>
        Toggle Theme
        </button>
        )}
        </ThemeContext.Consumer>
        ...
        </ThemeContext.Provider> 
        }

        再以最近開發(fā)的例子,分享組件拆分的好處。

        需求:開發(fā)倒計(jì)時(shí)組件,運(yùn)營(yíng)配置倒計(jì)時(shí)結(jié)束時(shí)間,倒計(jì)時(shí)初始化時(shí)間從服務(wù)端獲取,結(jié)束之前顯示倒計(jì)時(shí),倒計(jì)時(shí)結(jié)束之后做對(duì)應(yīng)的操作,比如切換倒計(jì)時(shí)為其他組件。

        組件拆分:

      1. 一個(gè)業(yè)務(wù)層容器組件,負(fù)責(zé)統(tǒng)籌,處理業(yè)務(wù)邏輯。
      2. 一個(gè)通用‘倒計(jì)時(shí)'的組件,向服務(wù)端輪詢系統(tǒng)時(shí)間,計(jì)算當(dāng)前剩余時(shí)間,F(xiàn)aCC 的形式提供給 children。
      3. 一個(gè)倒計(jì)時(shí)UI組件,對(duì)剩余時(shí)間格式化以及 UI 展示。
      4. 偽代碼:

        // CountDownContainer.js
        render() {
        const {
        endTime,
        renderSomethingAfterCountDown,
        } = this.props;
        
        return (
        <TimeLeftProvider endTime={endTime} >
        {seconds => (
        seconds > 0
        ? <CountDown {...this.props} remainingSeconds={seconds} />
        : renderSomethingAfterCountDown()
        )}
        </TimeLeftProvider>
        );
        }
        // TimeLeftProvider.js
        export default class TimeLeftProvider extends PureComponent {
        static propTypes = {
        children: PropTypes.func,
        endTime: PropTypes.number,
        }
        
        // ...
        
        componentDidMount() {
        this.poll();
        }
        
        poll() {
        queryServerTime();
        this.pollTimer = setInterval(() => {
        queryServerTime();
        }, pollInterval * 1000);
        }
        
        countDown() {
        setInterval(() => {
        this.setState(prevState => ({
        remainingSeconds: prevState.remainingSeconds - 1,
        }));
        }, 1000);
        }
        
        render() {
        const { remainingSeconds, reliable } = this.state;
        return this.props.children(remainingSeconds, reliable);
        }
        }
        // CountDown.js
        
        function CountDown(props) {
        const {
        remainingSeconds,
        } = props;
        const numbers = formatSeconds(remainingSeconds);
        const inputs = ['days', 'hours', 'minutes', 'seconds'];
        
        return (
        <div styleName={cls}>
        {
        inputs.map(key => ({
        label: key,
        number: numbers[key],
        })).map(
        //...
        )
        }
        </div>
        );
        }

        最終得到的結(jié)果是:


        與此同時(shí)

      5. 代碼結(jié)構(gòu)清晰,組件之間各司其職。
      6. 組件可復(fù)用性強(qiáng)。
      7. 單元測(cè)試簡(jiǎn)單,每個(gè)組件都只測(cè)試自身的邏輯。
      8. 總結(jié)

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

        文檔

        React Component存在的幾種形式詳解

        React Component存在的幾種形式詳解:前言 最近項(xiàng)目基本都是用 React,今天總結(jié)分享 React Component 常見的幾種形式,如果你在寫 React 時(shí)經(jīng)常不知道怎么拆分代碼,這篇文章或許對(duì)你有所幫助。 React.Component是一個(gè)抽象基類。這意味著直接引用React.Component是毫無意義的。你
        推薦度:
        標(biāo)簽: React component compo
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产成人精品女人久久久 | 国产免费av一区二区三区| 亚洲毛片一级带毛片基地| 精品视频在线免费观看| 在线亚洲午夜理论AV大片| 4hu四虎免费影院www| 亚洲一区二区三区免费| 午夜肉伦伦影院久久精品免费看国产一区二区三区| 西西大胆无码视频免费| 亚洲人片在线观看天堂无码| 女人18毛片水真多免费播放| 亚洲中文字幕无码一去台湾| 歪歪漫画在线观看官网免费阅读| 亚洲a级成人片在线观看| 最近免费中文字幕大全视频| 亚洲熟妇AV乱码在线观看| 浮力影院第一页小视频国产在线观看免费 | 亚洲男人的天堂久久精品| 成人最新午夜免费视频| 亚洲成在人线在线播放无码 | 亚洲国产精品第一区二区| 2022久久国产精品免费热麻豆| 亚洲精品国产啊女成拍色拍| a拍拍男女免费看全片| 亚洲一区在线视频| 国产无遮挡色视频免费视频| 国产久爱免费精品视频| 亚洲黄色网址在线观看| 日韩一级在线播放免费观看| 特黄特色大片免费| 亚洲成A人片在线观看无码不卡| 四虎影视在线影院在线观看免费视频 | 久久精品国产亚洲AV麻豆王友容| 免费观看亚洲人成网站| 在线观看无码的免费网站| 偷自拍亚洲视频在线观看99| 免费大黄网站在线观| 亚洲国产精品一区二区第一页免| 日韩免费一区二区三区在线播放| 色拍自拍亚洲综合图区| 一级毛片免费毛片一级毛片免费|