1. 程式人生 > >React建立元件的三種方法

React建立元件的三種方法

無狀態函式式元件

建立純展示元件,只負責根據傳入的props 來展示,不涉及到要state 狀態的操作,是一個只帶有一個render 方法的元件類
建立形式如下:

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

特點:
1,元件不會被例項化,整體渲染效能得到提升。
2,元件不能訪問this物件。
3,元件無法訪問生命週期的方法。
4,無狀態元件只能訪問輸入的props ,同樣的props會得到同樣的渲染結果,不會有副作用。

無狀態元件使得程式碼結構更加清晰,減少程式碼冗餘,在開發過程中,儘量使用無狀態元件。

React.createClass

是ES5 的原生的javascript 來實現的react 元件
該栗子實現了一個互動列表,使用者輸入資訊,按回車後觸發鍵盤事件將獲取到的輸入值渲染生成列表,輸入資訊的數量可以是任意多個
在這裡插入圖片描述
具體形式如下

var Greeting = React.createClass({
    getInitialState: function () {
        return {
            work_list: []
        };
    },
    render: function () {
        return (
            <div>
                <input type="text" ref="myWork" placeholder="What need to be done?" onKeyUp={this.Enter}/>
                <ul>
                    {
                        this.state.work_list.map(function (textValue) {
                            return <li key={textValue}>{textValue}</li>;
                        })
                    }
                </ul>
            </div>
        );
    },
    Enter: function (event) {
        var works = this.state.work_list;
        var work = this.refs.myWork.value;
        if (event.keyCode == 13) {
            works.push(work);
            this.setState({work_list: works});
            this.refs.myWork.value = "";
        }
    }
});

給文字框增加onKeyUp 監聽鍵盤事件

元件在插入頁面前其實是在虛擬DOM 中的表示,因此,在渲染成最終實際的DOM 前,不能通過直接訪問元件內的元素來獲取他的屬性。文字輸入框用於獲取使用者的輸入。這時就必須獲取真實的DOM節點,虛擬DOM是拿不到使用者輸入的。為了做到這一點,我們在文字輸入框添加了一個ref 屬性 myWork ,然後通過this.refs.myWork 就指向了這個虛擬DOM 的子節點,這樣就可以通過this.refs.myWork.value 獲取到他的值

特點:
1,React.createClass 會自動繫結函式方法導致不必要的效能開銷。
2,React.createClass 的

mixins 不夠自然,直觀。

**

React.Component

**
React.Component 是以ES6 的形式來建立React 的元件的,是React目前最為推薦的建立有狀態元件的方式,相對於React.createClass 可以更好實現程式碼服用。將上邊React.createClass 的形式改為React.Component 形式如下:

class Greeting extends React.Component{
   constructor (props) {
       super(props);
       this.state={
            work_list: []
        }

        this.Enter=this.Enter.bind(this); //繫結this
    }
    render() {
        return (
            <div>
                <input type="text" ref="myWork" placeholder="What need to be done?" onKeyUp={this.Enter}/>
                <ul>
                    {
                        this.state.work_list.map(function (textValue) {
                            return <li key={textValue}>{textValue}</li>;
                        })
                    }
                </ul>
            </div>
        );
    }
    Enter(event) {
        var works = this.state.work_list;
        var work = this.refs.myWork.value;
        if (event.keyCode == 13) {
            works.push(work);
            this.setState({work_list: works});
            this.refs.myWork.value = "";
        }
    }
}

關於this
React.createClass 建立的元件,其每一個成員函式的this 都有React 自動繫結,任何時候使用,直接使用this.method即可,函式中的this會被正確設定

React.Component 建立的元件,其成員函式不會自動繫結this, 需要手動繫結,否則this 不能獲取當前元件例項物件

React.Component 三種手動繫結this 的方法
1,在建構函式中繫結

constructor(props) {
       super(props);
       this.Enter = this.Enter.bind(this);
  }

2,使用bind繫結

    <div onKeyUp={this.Enter.bind(this)}></div> 

3,使用arrow function 繫結

    <div onKeyUp={(event)=>this.Enter(event)}></div> 

我們在實際應用中應該選擇哪種方法來建立元件呢?
1,只要有可能,儘量使用無狀態元件建立形式。
2,否則(如需要state,生命週期方法等),使用React.Component 這種es6 形式建立元件