React三大屬性之props的使用詳解
上期講了state,接下來講講props。props功能在于組件間通信(父子組件),首先說說在各種組件中的用法:
類組件
//父組件傳值 class Father extends React.PureComponent{ render(){ return ( <Son value={"son"} /> ) } } class Son extends React.PureComponent{ render(){ return ( <div>this data is {this.props.value}</div> ) } }
函數(shù)組件
function Fa(){ return ( <Son value={"son"} /> ) } function Son(props){ return ( <div>this data is {props.value}</div> ) }
在函數(shù)組件中,props只需要傳一個(gè)值就好了,非常方便 在React文檔中,對(duì)props的解釋是
當(dāng) React 元素為用戶自定義組件時(shí),它會(huì)將 JSX 所接收的屬性(attributes)以及子組件(children)轉(zhuǎn)換為單個(gè)對(duì)象傳遞給組件,這個(gè)對(duì)象被稱之為 “props”
所以,我們通過props能得到父類組件上傳的值,也能通過props.children
直接得到j(luò)sx寫成的子組件
props是只讀的
React在文檔中強(qiáng)調(diào)
所有 React 組件都必須像純函數(shù)一樣保護(hù)它們的 props 不被更改。
純函數(shù)的概念我們已經(jīng)在redux中解釋過了,總而言之,我們不能改變props的值。
組件間通信
現(xiàn)在來總結(jié)一下組件間通信:
- props 首先上一個(gè)類組件的寫法:
//父組件給子組件傳值以及說過了,現(xiàn)在總結(jié)子組件給父組件傳值,此時(shí)往往需要父組件給子組件先傳一個(gè)props函數(shù),子組件通過調(diào)用傳入的函數(shù)傳值改變父組件的值 export default class Fa extends Component { state = {faValue:'Fa1'} changeFa = (value)=>{ this.setState(()=>{ return {faValue:value} }) } render() { return ( <> <h1>Fa's value is {this.state.faValue}</h1> <Son changeFa={this.changeFa}/> </> ) } } export default class Son extends React.PureComponent{ changeValue = ()=>{ this.props.changeFa(this.inputRef.value) } render() { return ( <> <input type="text" placeholder={"請(qǐng)輸入您的值"} ref={(el)=>{this.inputRef = el}}/> <button onClick={this.changeValue}>change</button> </> ) } }
然后寫一個(gè)函數(shù)組件的寫法:
function Fa(){ const [faValue,setFaValue] = useState("Fa1") const changeFa = (value)=>{ setFaValue(value) } return ( <div> <h1>Fa's value is {faValue}</h1> <Son changeFa={changeFa} /> </div> ) } function Son(props){ const inputValue = useRef("") //定義改變fa組件的值的函數(shù) const changeFaValue = ()=>{ props.changeFa(inputValue.current.value) } return ( <> <input type="text" placeholder={"請(qǐng)輸入您要改變的值"} ref={inputValue}/> <button onClick={changeFaValue}>change value</button> </> ) }
- eventbus(訂閱-發(fā)布機(jī)制)
這個(gè)可以理解為弱化的redux。這邊我們用庫(kù)pubsub-js來寫。寫法如下:
//比如針對(duì)之前的輸入案例,我需要給兄弟組件傳一個(gè)值value,如果不用props,我們?cè)撛趺磳? Bro: export default class Bro extends Component { componentDidMount() { this.sonData = PubSub.subscribe("brother",(msg,data)=>{ console.log("Bro Component have recived the msg",data); }) } componentWillUnmount() { PubSub.unsubscribe(this.sonData) } render() { return ( <> <div>brother</div> </> ) } } Son: export default class Son extends React.PureComponent{ changeValue = ()=>{ PubSub.publish("brother",this.inputRef.value) } render() { return ( <> <input type="text" placeholder={"請(qǐng)輸入您的值"} ref={(el)=>{this.inputRef = el}}/> <button onClick={this.changeValue}>change</button> </> ) } }
這個(gè)方法常用的就是三個(gè)api,第一個(gè)subscribe,發(fā)布的相應(yīng)的事件,并且定義事件要做什么事。第二個(gè)是publish,訂閱發(fā)布的事情,并且傳入相應(yīng)要改變的值。第三個(gè)是unsubscribe用來取消發(fā)布的事情,做內(nèi)存的優(yōu)化
以上就是React三大屬性之props的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于React三大屬性之props的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于React Native使用axios進(jìn)行網(wǎng)絡(luò)請(qǐng)求的方法
axios是一個(gè)基于Promise的Http網(wǎng)絡(luò)庫(kù),可運(yùn)行在瀏覽器端和Node.js中,Vue應(yīng)用的網(wǎng)絡(luò)請(qǐng)求基本都是使用它完成的。這篇文章主要介紹了React Native使用axios進(jìn)行網(wǎng)絡(luò)請(qǐng)求,需要的朋友可以參考下2021-08-08forwardRef?中React父組件控制子組件的實(shí)現(xiàn)代碼
forwardRef 用于拿到父組件傳入的 ref 屬性,這樣在父組件便能通過 ref 控制子組件,這篇文章主要介紹了forwardRef?-?React父組件控制子組件的實(shí)現(xiàn)代碼,需要的朋友可以參考下2024-01-01React實(shí)現(xiàn)雙滑塊交叉滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)雙滑塊交叉滑動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09React?Native?Modal?的封裝與使用實(shí)例詳解
這篇文章主要介紹了React?Native?Modal?的封裝與使用,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09React實(shí)現(xiàn)生成和導(dǎo)出Word文檔的方法詳解
React是一個(gè)流行的JavaScript庫(kù),用于構(gòu)建現(xiàn)代前端應(yīng)用程序,本文將深入探討如何在React中生成和導(dǎo)出Word文檔,感興趣的小伙伴可以學(xué)習(xí)一下2023-09-09