首頁  >  文章  >  web前端  >  react元件幾種聲明方式是什麼

react元件幾種聲明方式是什麼

coldplay.xixi
coldplay.xixi原創
2020-11-20 09:33:012698瀏覽

react元件的宣告方式:1、函數式定義的無狀態元件;2、es5原生方式【React.createClass】定義的元件;3、es6形式的【extends React.Component】定義的元件。

react元件幾種聲明方式是什麼

react元件的宣告方式:

1、無狀態函數式元件

建立無狀態函數式元件形式是從React 0.14版本開始出現的。它是為了創建純展示組件,這種組件只負責根據傳入的props來展示,不涉及到要state狀態的操作。特定的無狀態函數式元件,其官方指出:

在大部分React程式碼中,大多數元件被寫成無狀態的元件,透過簡單組合可以建構成其他的元件等;  

這種透過多個簡單然後合併成一個大應用的設計模式被提倡。

無狀態函數式元件形式上表現為一個只帶有一個render方法的元件類,透過函數形式或ES6 箭頭 function的形式在創建,而該元件是無state狀態的。具體的創建形式如下:

function HelloComponent(props, /* context */) {
  return <div>Hello {props.name}</div>
}
ReactDOM.render(<HelloComponent name="Sebastian" />, mountNode)

無狀態組件的創建形式使程式碼的可讀性更好,並且減少了大量冗餘的程式碼,精簡至只有一個render方法,大大的增強了編寫一個元件的便利,除此之外無狀態元件還有以下幾個顯著的特點:

  • 元件不會被實例化,整體渲染效能提升

    因為組件被精簡成一個render方法的函數來實現的,由於是無狀態組件,所以無狀態組件就不會在有組件實例化的過程,無實例化過程也就不需要分配多餘的內存,從而性能得到一定的提升。

  • 元件不能存取this物件

    無狀態元件由於沒有實例化過程,所以無法存取元件this中的對象,例如:this.ref、this.state等均不能訪問。若想存取就不能使用這種形式來建立元件

  • 元件無法存取生命週期的方法

    因為無狀態元件是不需要元件生命週期管理和狀態管理,所以底層實現這種形式的元件時是不會實現元件的生命週期方法。所以無狀態組件是不能參與組件的各個生命週期管理的。

  • 無狀態元件只能存取輸入的props,同樣的props會得到同樣的渲染結果,不會有副作用

    無狀態元件被鼓勵在大型項目中盡可能以簡單的寫法來分割原本龐大的元件,未來React也會這種面向無狀態元件在譬如無意義的檢查和記憶體分配領域進行一系列優化,所以只要有可能,盡量使用無狀態元件。

<strong>2、React.createClass</strong>

#React.createClass是react剛開始推薦的建立元件的方式,這是ES5的原生的JavaScript來實現的React元件,其形式如下:

var InputControlES5 = React.createClass({
    propTypes: {//定义传入props中的属性各种类型
        initialValue: React.PropTypes.string
    },
    defaultProps: { //组件默认的props对象
        initialValue: &#39;&#39;
    },
    // 设置 initial state
    getInitialState: function() {//组件相关的状态对象
        return {
            text: this.props.initialValue || &#39;placeholder&#39;
        };
    },
    handleChange: function(event) {
        this.setState({ //this represents react component instance
            text: event.target.value
        });
    },
    render: function() {
        return (
            <div>
                Type something:
                <input onChange={this.handleChange} value={this.state.text} />
            </div>
        );
    }
});
InputControlES6.propTypes = {
    initialValue: React.PropTypes.string
};
InputControlES6.defaultProps = {
    initialValue: &#39;&#39;
};

與無狀態元件相比,React.createClass和後面要描述的React.Component都是創建有狀態的組件,這些組件是要被實例化的,並且可以存取組件的生命週期方法。但隨著React的發展,React.createClass形式本身的問題暴露出來:

React.createClass會自綁定函數方法(不像React.Component只綁定需要關心的函數)導致不必要的效能開銷,增加程式碼過時的可能性。

React.createClass的mixins不夠自然、直觀;React.Component形式非常適合高階元件(Higher Order Components--HOC),它以更直觀的形式展示了比mixins更強大的功能,並且HOC是純淨的JavaScript,不用擔心他們會被廢棄。 HOC可以參考《無狀態組件(Stateless Component) 與高階組件》。

<strong>3、React.Component</strong>

#React.Component是以ES6的形式來創建react的元件的,是React目前極為推薦的建立有狀態元件的方式,最終會取代React.createClass形式;相對於React.createClass可以更好實現程式碼重複使用。將上面React.createClass的形式改為React.Component形式如下:

class InputControlES6 extends React.Component {
    constructor(props) {
        super(props);
        // 设置 initial state
        this.state = {
            text: props.initialValue || &#39;placeholder&#39;
        };
        // ES6 类中函数必须手动绑定
        this.handleChange = this.handleChange.bind(this);
    }
    handleChange(event) {
        this.setState({
            text: event.target.value
        });
    }
    render() {
        return (
            <div>
                Type something:
                <input onChange={this.handleChange}
               value={this.state.text} />
            </div>
        );
    }
}
InputControlES6.propTypes = {
    initialValue: React.PropTypes.string
};
InputControlES6.defaultProps = {
    initialValue: &#39;&#39;
};

相關學習推薦:javascript影片教學

以上是react元件幾種聲明方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn