成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

React中state和props分別是什么?

yedf / 2988人閱讀

摘要:整理一下中關(guān)于和的知識(shí)點(diǎn)。在任何應(yīng)用中,數(shù)據(jù)都是必不可少的。比如,這樣關(guān)于,可以聲明為以下幾種類型注意,和是簡(jiǎn)寫。是什么呢一個(gè)組件的顯示形態(tài)可以由數(shù)據(jù)狀態(tài)和外部參數(shù)所決定,外部參數(shù)也就是,而數(shù)據(jù)狀態(tài)就是。

整理一下React中關(guān)于state和props的知識(shí)點(diǎn)。

在任何應(yīng)用中,數(shù)據(jù)都是必不可少的。我們需要直接的改變頁(yè)面上一塊的區(qū)域來(lái)使得視圖的刷新,或者間接地改變其他地方的數(shù)據(jù)。React的數(shù)據(jù)是自頂向下單向流動(dòng)的,即從父組件到子組件中,組件的數(shù)據(jù)存儲(chǔ)在propsstate中,這兩個(gè)屬性有啥子區(qū)別呢?

props

React的核心思想就是組件化思想,頁(yè)面會(huì)被切分成一些獨(dú)立的、可復(fù)用的組件。

組件從概念上看就是一個(gè)函數(shù),可以接受一個(gè)參數(shù)作為輸入值,這個(gè)參數(shù)就是props,所以可以把props理解為從外部傳入組件內(nèi)部的數(shù)據(jù)。由于React是單向數(shù)據(jù)流,所以props基本上也就是從服父級(jí)組件向子組件傳遞的數(shù)據(jù)。

用法

假設(shè)我們現(xiàn)在需要實(shí)現(xiàn)一個(gè)列表,根據(jù)React組件化思想,我們可以把列表中的行當(dāng)做一個(gè)組件,也就是有這樣兩個(gè)組件:

先看看

import Item from "./item";
export default class ItemList extends React.Component{
  const itemList = data.map(item => );
  render(){
    return (
      {itemList}
    )
  }
}

列表的數(shù)據(jù)我們就暫時(shí)先假設(shè)是放在一個(gè)data變量中,然后通過(guò)map函數(shù)返回一個(gè)每一項(xiàng)都是的數(shù)組,也就是說(shuō)這里其實(shí)包含了data.length個(gè)組件,數(shù)據(jù)通過(guò)在組件上自定義一個(gè)參數(shù)傳遞。當(dāng)然,這里想傳遞幾個(gè)自定義參數(shù)都可以。

中是這樣的:

export default class Item extends React.Component{
  render(){
    return (
      
  • {this.props.item}
  • ) } }

    render函數(shù)中可以看出,組件內(nèi)部是使用this.props來(lái)獲取傳遞到該組件的所有數(shù)據(jù),它是一個(gè)對(duì)象,包含了所有你對(duì)這個(gè)組件的配置,現(xiàn)在只包含了一個(gè)item屬性,所以通過(guò)this.props.item來(lái)獲取即可。

    只讀性

    props經(jīng)常被用作渲染組件和初始化狀態(tài),當(dāng)一個(gè)組件被實(shí)例化之后,它的props是只讀的,不可改變的。如果props在渲染過(guò)程中可以被改變,會(huì)導(dǎo)致這個(gè)組件顯示的形態(tài)變得不可預(yù)測(cè)。只有通過(guò)父組件重新渲染的方式才可以把新的props傳入組件中。

    默認(rèn)參數(shù)

    在組件中,我們最好為props中的參數(shù)設(shè)置一個(gè)defaultProps,并且制定它的類型。比如,這樣:

    Item.defaultProps = {
      item: "Hello Props",
    };
    
    Item.propTypes = {
      item: PropTypes.string,
    };

    關(guān)于propTypes,可以聲明為以下幾種類型:

    optionalArray: PropTypes.array,
    optionalBool: PropTypes.bool,
    optionalFunc: PropTypes.func,
    optionalNumber: PropTypes.number,
    optionalObject: PropTypes.object,
    optionalString: PropTypes.string,
    optionalSymbol: PropTypes.symbol,

    注意,boolfunc是簡(jiǎn)寫。

    這些知識(shí)基礎(chǔ)數(shù)據(jù)類型,還有一些復(fù)雜的,附上鏈接:

    https://facebook.github.io/react/docs/typechecking-with-proptypes.html

    總結(jié)

    props是一個(gè)從外部傳進(jìn)組件的參數(shù),主要作為就是從父組件向子組件傳遞數(shù)據(jù),它具有可讀性和不變性,只能通過(guò)外部組件主動(dòng)傳入新的props來(lái)重新渲染子組件,否則子組件的props以及展現(xiàn)形式不會(huì)改變。

    state

    state是什么呢?

    State is similar to props, but it is private and fully controlled by the component.

    一個(gè)組件的顯示形態(tài)可以由數(shù)據(jù)狀態(tài)和外部參數(shù)所決定,外部參數(shù)也就是props,而數(shù)據(jù)狀態(tài)就是state。

    用法
    export default class ItemList extends React.Component{
      constructor(){
        super();
        this.state = {
          itemList:"一些數(shù)據(jù)",
        }
      }
      render(){
        return (
          {this.state.itemList}
        )
      }
    }

    首先,在組件初始化的時(shí)候,通過(guò)this.state給組件設(shè)定一個(gè)初始的state,在第一次render的時(shí)候就會(huì)用這個(gè)數(shù)據(jù)來(lái)渲染組件。

    setState

    state不同于props的一點(diǎn)是,state是可以被改變的。不過(guò),不可以直接通過(guò)this.state=的方式來(lái)修改,而需要通過(guò)this.setState()方法來(lái)修改state。

    比如,我們經(jīng)常會(huì)通過(guò)異步操作來(lái)獲取數(shù)據(jù),我們需要在didMount階段來(lái)執(zhí)行異步操作:

    componentDidMount(){
      fetch("url")
        .then(response => response.json())
        .then((data) => {
          this.setState({itemList:item});  
        }
    }

    當(dāng)數(shù)據(jù)獲取完成后,通過(guò)this.setState來(lái)修改數(shù)據(jù)狀態(tài)。

    當(dāng)我們調(diào)用this.setState方法時(shí),React會(huì)更新組件的數(shù)據(jù)狀態(tài)state,并且重新調(diào)用render方法,也就是會(huì)對(duì)組件進(jìn)行重新渲染。

    注意:通過(guò)this.state=來(lái)初始化state,使用this.setState來(lái)修改state,constructor是唯一能夠初始化的地方。

    setState接受一個(gè)對(duì)象或者函數(shù)作為第一個(gè)參數(shù),只需要傳入需要更新的部分即可,不需要傳入整個(gè)對(duì)象,比如:

    export default class ItemList extends React.Component{
      constructor(){
        super();
        this.state = {
          name:"axuebin",
          age:25,
        }
      }
      componentDidMount(){
        this.setState({age:18})  
      }
    }

    在執(zhí)行完setState之后的state應(yīng)該是{name:"axuebin",age:18}。

    setState還可以接受第二個(gè)參數(shù),它是一個(gè)函數(shù),會(huì)在setState調(diào)用完成并且組件開(kāi)始重新渲染時(shí)被調(diào)用,可以用來(lái)監(jiān)聽(tīng)渲染是否完成:

    this.setState({
      name:"xb"
    },()=>console.log("setState finished"))
    總結(jié)

    state的主要作用是用于組件保存、控制以及修改自己的狀態(tài),它只能在constructor中初始化,它算是組件的私有屬性,不可通過(guò)外部訪問(wèn)和修改,只能通過(guò)組件內(nèi)部的this.setState來(lái)修改,修改state屬性會(huì)導(dǎo)致組件的重新渲染。

    區(qū)別

    state是組件自己管理數(shù)據(jù),控制自己的狀態(tài),可變;

    props是外部傳入的數(shù)據(jù)參數(shù),不可變;

    沒(méi)有state的叫做無(wú)狀態(tài)組件,有state的叫做有狀態(tài)組件;

    多用props,少用state。也就是多寫無(wú)狀態(tài)組件。

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91832.html

    相關(guān)文章

    • [React技術(shù)內(nèi)幕] key帶來(lái)了什么

      摘要:?jiǎn)l(fā)式算法了解一下什么是啟發(fā)式算法啟發(fā)式算法指人在解決問(wèn)題時(shí)所采取的一種根據(jù)經(jīng)驗(yàn)規(guī)則進(jìn)行發(fā)現(xiàn)的方法。這將會(huì)造成極大的性能損失和組件內(nèi)的丟失。但這都是的內(nèi)部實(shí)現(xiàn)方式,可能在后序的版本中不斷細(xì)化啟發(fā)式算法,甚至采用別的啟發(fā)式算法。   首先歡迎大家關(guān)注我的掘金賬號(hào)和Github博客,也算是對(duì)我的一點(diǎn)鼓勵(lì),畢竟寫東西沒(méi)法獲得變現(xiàn),能堅(jiān)持下去也是靠的是自己的熱情和大家的鼓勵(lì)。   大家在使用R...

      cnTomato 評(píng)論0 收藏0
    • 談一談創(chuàng)建React Component的幾種方式

      摘要:用這種方式創(chuàng)建組件時(shí),并沒(méi)有對(duì)內(nèi)部的函數(shù),進(jìn)行綁定,所以如果你想讓函數(shù)在回調(diào)中保持正確的,就要手動(dòng)對(duì)需要的函數(shù)進(jìn)行綁定,如上面的,在構(gòu)造函數(shù)中對(duì)進(jìn)行了綁定。 當(dāng)我們談起React的時(shí)候,多半會(huì)將注意力集中在組件之上,思考如何將頁(yè)面劃分成一個(gè)個(gè)組件,以及如何編寫可復(fù)用的組件。但對(duì)于接觸React不久,還沒(méi)有真正用它做一個(gè)完整項(xiàng)目的人來(lái)說(shuō),理解如何創(chuàng)建一個(gè)組件也并不那么簡(jiǎn)單。在最開(kāi)始的時(shí)候...

      mylxsw 評(píng)論0 收藏0
    • 用好React,你必須要知道的事情

      摘要:屬性如何獲取,是容器性組件負(fù)責(zé)的事情。所以,不要依賴和的值計(jì)算下一個(gè)狀態(tài)。也可以使用帶用回調(diào)函數(shù)參數(shù)版本的,回調(diào)函數(shù)中的會(huì)保證是最新的。當(dāng)返回時(shí),組件本次的方法不會(huì)被觸發(fā)。 容器性組件(container component)和展示性組件(presentational component) 使用React編寫組件時(shí),我們需要有意識(shí)地將組件劃分為容器性組件(container compo...

      vvpvvp 評(píng)論0 收藏0
    • React 實(shí)踐心得:react-redux 之 connect 方法詳解

      摘要:但這并不是最佳的方式。最佳的方式是使用提供的和方法。也就是說(shuō),與的與完全無(wú)關(guān)。另外,如果使用對(duì)做屬性類型檢查,方法和方法為添加的屬性是存在的。注意,的變化不會(huì)引起上述過(guò)程,默認(rèn)在組件的生命周期中是固定的。 轉(zhuǎn)載注: 本文作者是淘寶前端團(tuán)隊(duì)的葉齋。筆者非常喜歡這篇文章,故重新排版并轉(zhuǎn)載到這里,同時(shí)也加入了一些自己的體會(huì)。 原文地址:http://taobaofed.org/blog/...

      張春雷 評(píng)論0 收藏0
    • React loves you —“洞悉Redux裝的逼”

      摘要:就是那個(gè)將要全權(quán)代管你所有組件的那家伙用的自述來(lái)說(shuō)就是是狀態(tài)容器,提供可預(yù)測(cè)化的狀態(tài)管理。 你若裝逼,請(qǐng)帶我飛! I love React ! 從前,從前,聽(tīng)說(shuō)React只負(fù)責(zé)UI,話說(shuō)寫Angular代碼就像寫后端,現(xiàn)在看來(lái),React贏在情懷上了; 我認(rèn)為沒(méi)必要老是拿React和Angular做比較,Angular是一套大而全的相對(duì)完備的框架;而React確實(shí)是只負(fù)責(zé)UI,只是多出...

      chaos_G 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <