React中的無狀態和有狀態組件

    組件的概念在Web中應用的場景已經相當廣泛了。愛掏網 - it200.com而React是專注于View層的,組件也是React核心理念之一,一個完整的應用將由一個個獨立的組件拼裝而成。愛掏網 - it200.com組件也是React最基礎的一部分,欲想征服React,那么了解和編寫組件就顯得尤為重要。愛掏網 - it200.com

    在上一篇文章,咱們就寫了一個最簡單的React組件,而且在文章末尾,咱們留了一個問題,怎么創建無狀態和有狀態的React組件?接下來,就一起來了解React中的無狀態和有狀態的組件。愛掏網 - it200.com

    在了解React中的無狀態和有狀態的組件之前,先來了解在React中創建組件的姿勢。愛掏網 - it200.com簡單的說,在React中創建組件有三種方式:

    • ES5寫法:React.createClass
    • ES6寫法:React.Component
    • 無狀態的函數寫法,又稱為純組件SFC

    React.createClass

    React.createClass是React剛開始推薦的創建組件的方式。愛掏網 - it200.com這是ES5的原生的JavaScript來實現的React組件。愛掏網 - it200.comReact.createClass這個方法構建一個組件“類”,它接受一個對象為參數,對象中必須聲明一個render()方法,render()方法將返回一個組件實例。愛掏網 - it200.com

    先來看一個React.createClass創建組件的形式:

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    const SwitchButton = React.createClass({
        getDefaultProp:function() {
            return { open: false }
        },
    
        getInitialState: function() {
            return { open: this.props.open };
        },
    
        handleClick: function(event) {
            this.setState({ open: !this.state.open });
        },
    
        render: function() {
            var open = this.state.open,
            className = open ? 'switch-button open' : 'btn-switch';
    
            return (
                
            );
        }
    });
    
    ReactDOM.render(
        ,
        document.getElementById('root')
    );
    

    React.createClass是用來創建有狀態的組件,這些組件是要被實例化的,并且可以訪問組件的生命周期方法。愛掏網 - it200.com不過React.createClass創建React組件有其自身的問題存在:

    • React.createClass會自動綁定函數方法,導致不必要的性能開銷,增加代發過時的可能性
    • React.createClassmixins不夠自然、直觀

    React.Component

    React.Component是以ES6的形式來創建React組件,也是現在React官方推薦的創建組件的方式,其和React.createClass創建的組件一樣,也是創建有狀態的組件。愛掏網 - it200.com而且React.Component最終會取代React.createClass愛掏網 - it200.com

    把上面的例子,用React.Component來修改:

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    class SwitchButton extends React.Component {
        constructor(props) {
            super(props)
            this.state = {
                open: this.props.open
            }
            this.handleClick = this.handleClick.bind(this)
        }
    
        handleClick(event) {
            this.setState({ open: !this.state.open })
        }
    
        render() {
            let open = this.state.open,
                className = open ? 'switch-button open' : 'btn-switch'
    
            return (
                
            )
        }
    }
    
    SwitchButton.defaultProps = {
        open: false
    }
    
    ReactDOM.render(
        ,
        document.getElementById('root')
    )
    

    React.ComponentReact.createClass創建組件有蠻多不同之處,有關于這兩者的區別,@toddmotto去年就寫過一篇《React.createClass versus extends React.Component》,文章對兩者之間做過詳細的闡述。愛掏網 - it200.com

    無狀態的函數寫法

    無狀態的函數創建的組件是無狀態組件,它是一種只負責展示的純組件:

    function HelloComponent(props) {
        return Hello {props.name}
    }
    ReactDOM.render(, mountNode)
    

    對于這種無狀態的組件,使用函數式的方式聲明,會使得代碼的可讀性更好,并能大大減少代碼量,箭頭函數則是函數式寫法的最佳搭檔:

    const Todo = (props) => (
        
  1. {props.text}
  2. )

    上面定義的 Todo 組件,輸入輸出數據完全由props決定,而且不會產生任何副作用。愛掏網 - it200.com對于propsObject 類型時,我們還可以使用 ES6 的解構賦值:

    const Todo = ({ onClick, complete, text, ...props }) => (
        
  3. {props.text}
  4. )

    無狀態組件一般會搭配高階組件(簡稱:HOC)一起使用,高階組件用來托管state,Redux 框架就是通過 store 管理數據源和所有狀態,其中所有負責展示的組件都使用無狀態函數式的寫法。愛掏網 - it200.com

    這種模式被鼓勵在大型項目中盡可能以簡單的寫法 來分割原本龐大的組件,而未來 React 也會面向這種無狀態的組件進行一些專門的優化,比如避免無意義的檢查或內存分配。愛掏網 - it200.com所以建議大家盡可能在項目中使用無狀態組件。愛掏網 - it200.com

    無狀態組件內部其實是可以使用ref功能的,雖然不能通過this.refs訪問到,但是可以通過將ref內容保存到無狀態組件內部的一個本地變量中獲取到。愛掏網 - it200.com

    例如下面這段代碼可以使用ref來獲取組件掛載到DOM中后所指向的DOM元素:

    function TestComp(props){
        let ref;
        return (
             ref = node}>
        )
    }
    

    如何選擇創建組件的方式

    Facebook 官方早就聲明 ES6 React.Component將取代React.createClass

    支付2.99元 已支付,使用閱讀碼 * 請輸入閱讀碼(忘記閱讀碼?)

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 韩国福利影视一区二区三区| 伊人精品视频一区二区三区| 奇米精品一区二区三区在线观看| 亚洲一区二区三区深夜天堂| 91久久精品午夜一区二区| 国产高清在线精品一区二区 | 人妻少妇一区二区三区| 一区二区三区AV高清免费波多| 国产一区二区三区日韩精品| 亚洲AV永久无码精品一区二区国产| a级午夜毛片免费一区二区| 污污内射在线观看一区二区少妇| 国产在线乱子伦一区二区| 在线观看国产一区二区三区| 夜夜添无码试看一区二区三区| 在线精品国产一区二区| 国内精品视频一区二区三区八戒| 亚洲中文字幕丝袜制服一区 | 亚洲av无码一区二区三区观看 | 午夜福利一区二区三区高清视频| 91精品福利一区二区| 男人的天堂亚洲一区二区三区| 熟女少妇丰满一区二区| 色综合视频一区二区三区44| 精品人体无码一区二区三区| 精品人妻一区二区三区浪潮在线| 国产在线无码视频一区| 香蕉久久一区二区不卡无毒影院 | 国产视频一区二区| 亚洲一区二区三区在线观看精品中文 | 亚洲国产一区在线| 日韩一区二区免费视频| 久久免费区一区二区三波多野| 免费看AV毛片一区二区三区| 亚洲日韩精品无码一区二区三区| 国精产品999一区二区三区有限| 国产成人无码精品一区在线观看| 在线播放偷拍一区精品| 亚洲熟妇av一区二区三区| 国产综合精品一区二区| 国产精品第一区揄拍|