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文檔中,對props的解釋是
當(dāng) React 元素為用戶自定義組件時(shí),它會(huì)將 JSX 所接收的屬性(attributes)以及子組件(children)轉(zhuǎn)換為單個(gè)對象傳遞給組件,這個(gè)對象被稱之為 “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={"請輸入您的值"} 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={"請輸入您要改變的值"} ref={inputValue}/>
<button onClick={changeFaValue}>change value</button>
</>
)
}
- eventbus(訂閱-發(fā)布機(jī)制)
這個(gè)可以理解為弱化的redux。這邊我們用庫pubsub-js來寫。寫法如下:
//比如針對之前的輸入案例,我需要給兄弟組件傳一個(gè)值value,如果不用props,我們該怎么寫
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={"請輸入您的值"} 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的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用React?Router?v6?添加身份驗(yàn)證的方法
這篇文章主要介紹了使用React?Router?v6?進(jìn)行身份驗(yàn)證完全指南,本文將演示如何使用React?Router?v6創(chuàng)建受保護(hù)的路由以及如何添加身份驗(yàn)證,需要的朋友可以參考下2022-05-05
一文詳解React中如何實(shí)現(xiàn)組件懶加載
懶加載是一種優(yōu)化技術(shù),旨在延遲加載不必要的資源,直到它們真正需要時(shí)再進(jìn)行加載,那么React的懶加載是如何實(shí)現(xiàn)的呢,下面小編就來和大家詳細(xì)講講吧2025-03-03
React使用useEffect解決setState副作用詳解
這篇文章主要為大家介紹了React使用useEffect解決setState副作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
React中使用async validator進(jìn)行表單驗(yàn)證的實(shí)例代碼
react上進(jìn)行表單驗(yàn)證是很繁瑣的,在這里使用async-validator處理起來就變的很方便了,接下來通過本文給大家介紹React中使用async validator進(jìn)行表單驗(yàn)證的方法,需要的朋友可以參考下2018-08-08
詳解React項(xiàng)目的服務(wù)端渲染改造(koa2+webpack3.11)
本篇文章主要介紹了詳解React項(xiàng)目的服務(wù)端渲染改造(koa2+webpack3.11),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
React 項(xiàng)目中動(dòng)態(tài)設(shè)置環(huán)境變量
本文主要介紹了React 項(xiàng)目中動(dòng)態(tài)設(shè)置環(huán)境變量,本文將介紹兩種常用的方法,使用 dotenv 庫和通過命令行參數(shù)傳遞環(huán)境變量,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
使用react+redux實(shí)現(xiàn)計(jì)數(shù)器功能及遇到問題
使用redux管理數(shù)據(jù),由于Store獨(dú)立于組件,使得數(shù)據(jù)管理獨(dú)立于組件,解決了組件之間傳遞數(shù)據(jù)困難的問題,非常好用,今天重點(diǎn)給大家介紹使用react+redux實(shí)現(xiàn)計(jì)數(shù)器功能及遇到問題,感興趣的朋友參考下吧2021-06-06
React?Native?中限制導(dǎo)入某些組件和模塊的方法
這篇文章主要介紹了React?Native?中限制導(dǎo)入某些組件和模塊的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
react項(xiàng)目如何運(yùn)行在微信公眾號(hào)
這篇文章主要介紹了react項(xiàng)目如何運(yùn)行在微信公眾號(hào),幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下2021-04-04

