摘要:整理一下中關于和的知識點。在任何應用中,數據都是必不可少的。比如,這樣關于,可以聲明為以下幾種類型注意,和是簡寫。是什么呢一個組件的顯示形態可以由數據狀態和外部參數所決定,外部參數也就是,而數據狀態就是。
整理一下React中關于state和props的知識點。
在任何應用中,數據都是必不可少的。我們需要直接的改變頁面上一塊的區域來使得視圖的刷新,或者間接地改變其他地方的數據。React的數據是自頂向下單向流動的,即從父組件到子組件中,組件的數據存儲在props和state中,這兩個屬性有啥子區別呢?
propsReact的核心思想就是組件化思想,頁面會被切分成一些獨立的、可復用的組件。
組件從概念上看就是一個函數,可以接受一個參數作為輸入值,這個參數就是props,所以可以把props理解為從外部傳入組件內部的數據。由于React是單向數據流,所以props基本上也就是從服父級組件向子組件傳遞的數據。
用法假設我們現在需要實現一個列表,根據React組件化思想,我們可以把列表中的行當做一個組件,也就是有這樣兩個組件:
先看看
import Item from "./item"; export default class ItemList extends React.Component{ const itemList = data.map(item =>- ); render(){ return ( {itemList} ) } }
列表的數據我們就暫時先假設是放在一個data變量中,然后通過map函數返回一個每一項都是
在
export default class Item extends React.Component{ render(){ return (
在render函數中可以看出,組件內部是使用this.props來獲取傳遞到該組件的所有數據,它是一個對象,包含了所有你對這個組件的配置,現在只包含了一個item屬性,所以通過this.props.item來獲取即可。
只讀性props經常被用作渲染組件和初始化狀態,當一個組件被實例化之后,它的props是只讀的,不可改變的。如果props在渲染過程中可以被改變,會導致這個組件顯示的形態變得不可預測。只有通過父組件重新渲染的方式才可以把新的props傳入組件中。
默認參數在組件中,我們最好為props中的參數設置一個defaultProps,并且制定它的類型。比如,這樣:
Item.defaultProps = { item: "Hello Props", }; Item.propTypes = { item: PropTypes.string, };
關于propTypes,可以聲明為以下幾種類型:
optionalArray: PropTypes.array, optionalBool: PropTypes.bool, optionalFunc: PropTypes.func, optionalNumber: PropTypes.number, optionalObject: PropTypes.object, optionalString: PropTypes.string, optionalSymbol: PropTypes.symbol,
注意,bool和func是簡寫。
這些知識基礎數據類型,還有一些復雜的,附上鏈接:
https://facebook.github.io/react/docs/typechecking-with-proptypes.html
總結props是一個從外部傳進組件的參數,主要作為就是從父組件向子組件傳遞數據,它具有可讀性和不變性,只能通過外部組件主動傳入新的props來重新渲染子組件,否則子組件的props以及展現形式不會改變。
statestate是什么呢?
State is similar to props, but it is private and fully controlled by the component.
一個組件的顯示形態可以由數據狀態和外部參數所決定,外部參數也就是props,而數據狀態就是state。
用法export default class ItemList extends React.Component{ constructor(){ super(); this.state = { itemList:"一些數據", } } render(){ return ( {this.state.itemList} ) } }
首先,在組件初始化的時候,通過this.state給組件設定一個初始的state,在第一次render的時候就會用這個數據來渲染組件。
setStatestate不同于props的一點是,state是可以被改變的。不過,不可以直接通過this.state=的方式來修改,而需要通過this.setState()方法來修改state。
比如,我們經常會通過異步操作來獲取數據,我們需要在didMount階段來執行異步操作:
componentDidMount(){ fetch("url") .then(response => response.json()) .then((data) => { this.setState({itemList:item}); } }
當數據獲取完成后,通過this.setState來修改數據狀態。
當我們調用this.setState方法時,React會更新組件的數據狀態state,并且重新調用render方法,也就是會對組件進行重新渲染。
注意:通過this.state=來初始化state,使用this.setState來修改state,constructor是唯一能夠初始化的地方。
setState接受一個對象或者函數作為第一個參數,只需要傳入需要更新的部分即可,不需要傳入整個對象,比如:
export default class ItemList extends React.Component{ constructor(){ super(); this.state = { name:"axuebin", age:25, } } componentDidMount(){ this.setState({age:18}) } }
在執行完setState之后的state應該是{name:"axuebin",age:18}。
setState還可以接受第二個參數,它是一個函數,會在setState調用完成并且組件開始重新渲染時被調用,可以用來監聽渲染是否完成:
this.setState({ name:"xb" },()=>console.log("setState finished"))總結
state的主要作用是用于組件保存、控制以及修改自己的狀態,它只能在constructor中初始化,它算是組件的私有屬性,不可通過外部訪問和修改,只能通過組件內部的this.setState來修改,修改state屬性會導致組件的重新渲染。
區別state是組件自己管理數據,控制自己的狀態,可變;
props是外部傳入的數據參數,不可變;
沒有state的叫做無狀態組件,有state的叫做有狀態組件;
多用props,少用state。也就是多寫無狀態組件。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91832.html
摘要:啟發式算法了解一下什么是啟發式算法啟發式算法指人在解決問題時所采取的一種根據經驗規則進行發現的方法。這將會造成極大的性能損失和組件內的丟失。但這都是的內部實現方式,可能在后序的版本中不斷細化啟發式算法,甚至采用別的啟發式算法。 首先歡迎大家關注我的掘金賬號和Github博客,也算是對我的一點鼓勵,畢竟寫東西沒法獲得變現,能堅持下去也是靠的是自己的熱情和大家的鼓勵。 大家在使用R...
摘要:用這種方式創建組件時,并沒有對內部的函數,進行綁定,所以如果你想讓函數在回調中保持正確的,就要手動對需要的函數進行綁定,如上面的,在構造函數中對進行了綁定。 當我們談起React的時候,多半會將注意力集中在組件之上,思考如何將頁面劃分成一個個組件,以及如何編寫可復用的組件。但對于接觸React不久,還沒有真正用它做一個完整項目的人來說,理解如何創建一個組件也并不那么簡單。在最開始的時候...
摘要:屬性如何獲取,是容器性組件負責的事情。所以,不要依賴和的值計算下一個狀態。也可以使用帶用回調函數參數版本的,回調函數中的會保證是最新的。當返回時,組件本次的方法不會被觸發。 容器性組件(container component)和展示性組件(presentational component) 使用React編寫組件時,我們需要有意識地將組件劃分為容器性組件(container compo...
摘要:但這并不是最佳的方式。最佳的方式是使用提供的和方法。也就是說,與的與完全無關。另外,如果使用對做屬性類型檢查,方法和方法為添加的屬性是存在的。注意,的變化不會引起上述過程,默認在組件的生命周期中是固定的。 轉載注: 本文作者是淘寶前端團隊的葉齋。筆者非常喜歡這篇文章,故重新排版并轉載到這里,同時也加入了一些自己的體會。 原文地址:http://taobaofed.org/blog/...
摘要:就是那個將要全權代管你所有組件的那家伙用的自述來說就是是狀態容器,提供可預測化的狀態管理。 你若裝逼,請帶我飛! I love React ! 從前,從前,聽說React只負責UI,話說寫Angular代碼就像寫后端,現在看來,React贏在情懷上了; 我認為沒必要老是拿React和Angular做比較,Angular是一套大而全的相對完備的框架;而React確實是只負責UI,只是多出...
閱讀 1597·2023-04-25 14:12
閱讀 1070·2021-08-27 16:24
閱讀 2533·2019-08-30 15:44
閱讀 2912·2019-08-30 13:16
閱讀 1665·2019-08-29 14:10
閱讀 966·2019-08-29 13:54
閱讀 1296·2019-08-29 13:09
閱讀 1803·2019-08-26 18:37