搜尋
首頁web前端前端問答聲明react組件的方式有幾種

宣告react元件的方式有3種:1、利用函數式定義無狀態元件;2、利用“React.createClass()”方法定義元件;3、利用“React.Component()”方法以ES6的形式來定義組件。

聲明react組件的方式有幾種

本教學操作環境:Windows7系統、react17.0.1版、Dell G3電腦。

react宣告(建立)元件的方式:

#React推出後,出於不同的原因先後出現三種定義react元件的方式,殊途同歸;

具體的三種方式:

  • 函數式定義無狀態元件

  • React.createClass( )定義元件

  • React.Component()定義元件

雖然有三種方式可以定義react的元件,那麼這三種定義元件方式有什麼不同呢?或者說為什麼會出現對應的定義方式呢?下面就簡單介紹一下。

無狀態函數式元件

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

在大部分React程式碼中,大多數元件被寫成無狀態的元件,透過簡單組合可以建構成其他的元件等;這種透過多個簡單然後合併成一個大應用的設計模式被提倡。

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

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

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

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

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

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

  • 元件不能存取this物件

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

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

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

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

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

React.createClass

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) 與高階組件》。

React.Component

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

推荐学习:《react视频教程

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
react中canvas的用法是什么react中canvas的用法是什么Apr 27, 2022 pm 03:12 PM

在react中,canvas用于绘制各种图表、动画等;可以利用“react-konva”插件使用canvas,该插件是一个canvas第三方库,用于使用React操作canvas绘制复杂的画布图形,并提供了元素的事件机制和拖放操作的支持。

react中antd和dva是什么意思react中antd和dva是什么意思Apr 21, 2022 pm 03:25 PM

在react中,antd是基于Ant Design的React UI组件库,主要用于研发企业级中后台产品;dva是一个基于redux和“redux-saga”的数据流方案,内置了“react-router”和fetch,可理解为应用框架。

React是双向数据流吗React是双向数据流吗Apr 21, 2022 am 11:18 AM

React不是双向数据流,而是单向数据流。单向数据流是指数据在某个节点被改动后,只会影响一个方向上的其他节点;React中的表现就是数据主要通过props从父节点传递到子节点,若父级的某个props改变了,React会重渲染所有子节点。

react中为什么使用nodereact中为什么使用nodeApr 21, 2022 am 10:34 AM

因为在react中需要利用到webpack,而webpack依赖nodejs;webpack是一个模块打包机,在执行打包压缩的时候是依赖nodejs的,没有nodejs就不能使用webpack,所以react需要使用nodejs。

react是组件化开发吗react是组件化开发吗Apr 22, 2022 am 10:44 AM

react是组件化开发;组件化是React的核心思想,可以开发出一个个独立可复用的小组件来构造应用,任何的应用都会被抽象成一颗组件树,组件化开发也就是将一个页面拆分成一个个小的功能模块,每个功能完成自己这部分独立功能。

react和reactdom有什么区别react和reactdom有什么区别Apr 27, 2022 am 10:26 AM

react和reactdom的区别是:ReactDom只做和浏览器或DOM相关的操作,例如“ReactDOM.findDOMNode()”操作;而react负责除浏览器和DOM以外的相关操作,ReactDom是React的一部分。

react中forceupdate的用法是什么react中forceupdate的用法是什么Apr 19, 2022 pm 12:03 PM

在react中,forceupdate()用于强制使组件跳过shouldComponentUpdate(),直接调用render(),可以触发组件的正常生命周期方法,语法为“component.forceUpdate(callback)”。

react有没有双向绑定react有没有双向绑定Apr 21, 2022 am 10:24 AM

react中没有双向绑定;react的设计思想就是单向数据流,没有双向绑定的概念;react是view层,单项数据流只能由父组件通过props将数据传递给子组件,满足了view层渲染的要求并且更易测试与控制,所以在react中没有双向绑定。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),