搜尋
首頁web前端前端問答react無狀態寫法是什麼

react無狀態寫法是什麼

Nov 26, 2021 am 11:51 AM
react

react無狀態寫入法是“{props.xxx}”,其無狀態元件主要用來定義模板,接收來自父元件props傳遞過來的數據,並使用“{props.xxx}”的表達式把props塞到模板裡面。

react無狀態寫法是什麼

本文操作環境:Windows7系統、react17.0.1、Dell G3。

react無狀態寫法是什麼?

React中無狀態元件和有狀態元件的寫法以及區別

React中的元件主要分為無狀態元件和有狀態元件兩類。

1,無狀態元件主要用來定義模板,接收來自父元件props傳遞過來的數據,使用{props.xxx}的表達式把props塞到模板裡面。無狀態組件應該保持模板的純粹性,以便於組件重複使用。建立無狀態元件如下:

var Header = (props) = (
    <p>{props.xxx}</p>
);
export default Header

2,有狀態元件主要用來定義互動邏輯和業務資料(如果用了Redux,可以把業務資料抽離出去統一管理),使用{this .state.xxx}的表達式把業務資料掛載到容器元件的實例上(有狀態元件也可以叫做容器元件,無狀態元件也可以叫做展示元件),然後傳遞props到展示元件,展示元件接收到props,把props塞到模板裡面。建立有狀態元件如下:

class Home extends React.Component {
    constructor(props) {
        super(props);
    };
    render() {
        return (
            <header></header>  //也可以写成<header></header>
        )
    }
}
export default Home
這個是官方預設的寫法,在建構函式裡面預設要傳遞一個參數進去,並且要呼叫super()方法,來取得子類別的實例。但是比較疑惑的地方是為什麼要傳遞這些參數,傳遞這些參數有什麼用呢?

因為從render()裡面的元件來看,建構子不傳遞參數也可以取得到元件實例上的props屬性。如下:

class Home extends React.Component {
    constructor() {
        super();
    };
    render (){
        return(
            <p>
                <header></header>
            </p>
        );
    };
};

class Header extends React.Component {
    constructor() {
        super();
    };
    render() {
        return (
            <p>{this.props.name}</p>  //构造函数中并没有传递props属性,这里通过{this.props.name}依然获取到了值
        );
    };
};

這個比較好理解,因為render()方法是子元件原型上的方法,取得實例屬性的時候要透過this來訪問,如果去掉this就取得不到了。

那問題來了,如果我們要在建構子中存取props改怎麼辦呢?此時,我們就要在constructor建構函式中傳遞一個props參數,這樣就可以存取到子元件實例上的props屬性了。如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.name = props.name;  //获取到子组件实例上的props.name属性,赋值给实例属性name
    };
    render() {
        return (
            <p>{this.name}</p>
        );
    };
};

還有一個問題,super(props)方法為什麼也要傳遞一個props屬性呢?看下面的範例:

class Header extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            nameOne: props.name,
            nameTwo: this.props.name  //super()方法中传递了props属性,this.props才可以获取到name属性
        }
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

其實,props.name和this.props.name的值都是一樣的,但它兩個還是有差別的,props.name中這個props就是子元件的屬性props ,但是this.props.name中的這個props卻不是子元件的屬性props,雖然值都是一樣的,這個props其實在呼叫super方法的時候被傳遞到了Component這個父類別中去了,所以this.props .name取得到的是Component父類別中的props屬性。看下React的原始碼:
react無狀態寫法是什麼
發現沒,子類別super方法把props參數傳遞給了父類別Component,Component把props參數掛載到它的實例屬性props上了。所以,你只有在super方法中傳遞props參數,在建構函式裡才能用this,props.xxx

#如果super方法中不傳遞props參數,取得this.props.name的值就會報錯。取得this.props顯示為undifined:如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.state = {
            nameOne: this.props.name, 
            nameTwo: this.props  
        };
        console.log(this.props.name);  //报错
        console.log(this.props);  //undifined
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

這種寫法本質是給子元件Header的實例屬性state.nameOne和state.nameTwo賦值了一個子元件Header的實例屬性props,簡單來說,就是Header子元件創建了一個state屬性,然後又把自己的props屬性賦值給了自己的state屬性。
為什麼this.props要印出undefined?因為props是呼叫子元件的時候傳入的參數,所以在建構函式內部是存取不到props的,那麼對於this.props.name來說,毫無疑問肯定報錯。

所以,對於與建構函式中的props參數和super中的props參數來說,如果你不在建構函式中用this.props和props,完全可以不用傳參。反之就要傳參。但是對於this.props和props來說取得到的值都是一樣的,所以寫哪個都可以。但是官方文檔上是兩個參數都有寫。所以為了嚴謹,還是都寫上吧。

但是,我個人還是喜歡這樣的寫法。

constructor(props) {
    super(props);
    this.state = {
        name: props.name
    }
};

不加this的是value,加了this的是key。

React中的元件主要分為無狀態元件和有狀態元件兩類。

1,無狀態元件主要用來定義模板,接收來自父元件props傳遞過來的數據,使用{props.xxx}的表達式把props塞到模板裡面。無狀態組件應該保持模板的純粹性,以便於組件重複使用。建立無狀態元件如下:

var Header = (props) = (
    <p>{props.xxx}</p>
);
export default Header

2,有狀態元件主要用來定義互動邏輯和業務資料(如果用了Redux,可以把業務資料抽離出去統一管理),使用{this .state.xxx}的表達式把業務資料掛載到容器元件的實例上(有狀態元件也可以叫做容器元件,無狀態元件也可以叫做展示元件),然後傳遞props到展示元件,展示元件接收到props,把props塞到模板裡面。建立有狀態元件如下:

class Home extends React.Component {
    constructor(props) {
        super(props);
    };
    render() {
        return (
            <header></header>  //也可以写成<header></header>
        )
    }
}
export default Home
這個是官方預設的寫法,在建構函式裡面預設要傳遞一個參數進去,並且要呼叫super()方法,來取得子類別的實例。但是比較疑惑的地方是為什麼要傳遞這些參數,傳遞這些參數有什麼用呢?

因為從render()裡面的元件來看,建構子不傳遞參數也可以取得到元件實例上的props屬性。如下:

class Home extends React.Component {
    constructor() {
        super();
    };
    render (){
        return(
            <p>
                <header></header>
            </p>
        );
    };
};

class Header extends React.Component {
    constructor() {
        super();
    };
    render() {
        return (
            <p>{this.props.name}</p>  //构造函数中并没有传递props属性,这里通过{this.props.name}依然获取到了值
        );
    };
};

這個比較好理解,因為render()方法是子元件原型上的方法,取得實例屬性的時候要透過this來訪問,如果去掉this就取得不到了。

那問題來了,如果我們要在建構子中存取props改怎麼辦呢?此時,我們就要在constructor建構函式中傳遞一個props參數,這樣就可以存取到子元件實例上的props屬性了。如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.name = props.name;  //获取到子组件实例上的props.name属性,赋值给实例属性name
    };
    render() {
        return (
            <p>{this.name}</p>
        );
    };
};

還有一個問題,super(props)方法為什麼也要傳遞一個props屬性呢?看下面的範例:

class Header extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            nameOne: props.name,
            nameTwo: this.props.name  //super()方法中传递了props属性,this.props才可以获取到name属性
        }
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

其實,props.name和this.props.name的值都是一樣的,但它兩個還是有差別的,props.name中這個props就是子元件的屬性props ,但是this.props.name中的這個props卻不是子元件的屬性props,雖然值都是一樣的,這個props其實在呼叫super方法的時候被傳遞到了Component這個父類別中去了,所以this.props .name取得到的是Component父類別中的props屬性。看下React的原始碼:
react無狀態寫法是什麼
發現沒,子類別super方法把props參數傳遞給了父類別Component,Component把props參數掛載到它的實例屬性props上了。所以,你只有在super方法中傳遞props參數,在建構函式裡才能用this,props.xxx

#如果super方法中不傳遞props參數,取得this.props.name的值就會報錯。取得this.props顯示為undifined:如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.state = {
            nameOne: this.props.name, 
            nameTwo: this.props  
        };
        console.log(this.props.name);  //报错
        console.log(this.props);  //undifined
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

這種寫法本質是給子元件Header的實例屬性state.nameOne和state.nameTwo賦值了一個子元件Header的實例屬性props,簡單來說,就是Header子元件創建了一個state屬性,然後又把自己的props屬性賦值給了自己的state屬性。
為什麼this.props要印出undefined?因為props是呼叫子元件的時候傳入的參數,所以在建構函式內部是存取不到props的,那麼對於this.props.name來說,毫無疑問肯定報錯。

所以,對於與建構函式中的props參數和super中的props參數來說,如果你不在建構函式中用this.props和props,完全可以不用傳參。反之就要傳參。但是對於this.props和props來說取得到的值都是一樣的,所以寫哪個都可以。但是官方文檔上是兩個參數都有寫。所以為了嚴謹,還是都寫上吧。

但是,我個人還是喜歡這樣的寫法。

constructor(props) {
    super(props);
    this.state = {
        name: props.name
    }
};

不加this的是value,加了this的是key。

推薦學習:《react影片教學

以上是react無狀態寫法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
了解usestate():綜合反應國家管理指南了解usestate():綜合反應國家管理指南Apr 25, 2025 am 12:21 AM

useState()isaReacthookusedtomanagestateinfunctionalcomponents.1)Itinitializesandupdatesstate,2)shouldbecalledatthetoplevelofcomponents,3)canleadto'stalestate'ifnotusedcorrectly,and4)performancecanbeoptimizedusinguseCallbackandproperstateupdates.

使用React的優點是什麼?使用React的優點是什麼?Apr 25, 2025 am 12:16 AM

ReactispupularduetoItsOmpontement,基於虛擬,虛擬詞,Richecosystem和declarativedation.1)基於組件的harchitectureallowslowsforreusableuipieces。

在React中調試:識別和解決共同問題在React中調試:識別和解決共同問題Apr 25, 2025 am 12:09 AM

todebugreactapplicationsefectefectionfection,usethestertate:1)proppropdrillingwithcontextapiorredux.2)使用babortControllerToptopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRaceeDitions.3)intleleassynChronOusOperations.3)

反應中的usestate()是什麼?反應中的usestate()是什麼?Apr 25, 2025 am 12:08 AM

usestate()inrectallowsStateMagementionInfunctionalComponents.1)ITSIMPLIFIESSTATEMAGEMENT,MACHECODEMORECONCONCISE.2)usetheprevcountfunctionToupdateStateBasedonitspReviousViousViousvalue,deveingingStaleStateissues.3)

usestate()與用戶ducer():為您的狀態需求選擇正確的掛鉤usestate()與用戶ducer():為您的狀態需求選擇正確的掛鉤Apr 24, 2025 pm 05:13 PM

selectUsestate()forsimple,獨立的variables; useusereducer()forcomplexstateLogicorWhenStatedIppedsonPreviousState.1)usestate()isidealForsImpleupDatesLikeToggGlikGlingaBglingAboolAboolAupDatingacount.2

使用usestate()管理狀態:實用教程使用usestate()管理狀態:實用教程Apr 24, 2025 pm 05:05 PM

useState優於類組件和其它狀態管理方案,因為它簡化了狀態管理,使代碼更清晰、更易讀,並與React的聲明性本質一致。 1)useState允許在函數組件中直接聲明狀態變量,2)它通過鉤子機制在重新渲染間記住狀態,3)使用useState可以利用React的優化如備忘錄化,提升性能,4)但需注意只能在組件頂層或自定義鉤子中調用,避免在循環、條件或嵌套函數中使用。

何時使用usestate()以及何時考慮替代狀態管理解決方案何時使用usestate()以及何時考慮替代狀態管理解決方案Apr 24, 2025 pm 04:49 PM

useUsestate()forlocalComponentStateMangementighatighation; 1)usestate()isidealforsimple,localforsimple.2)useglobalstate.2)useglobalstateSolutionsLikErcontExtforsharedState.3)

React的可重複使用的組件:增強代碼可維護性和效率React的可重複使用的組件:增強代碼可維護性和效率Apr 24, 2025 pm 04:45 PM

ReusableComponentsInrectenHanceCodainainability and效率byallowingDevelostEsteSeTheseTheseThesAmeCompOntionActActRossDifferentPartSofanApplicationorprojects.1)heSredunceRedUndenceNandSimplifyUpdates.2)yensureconsistencyInuserexperience.3)

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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