react項(xiàng)目中,想實(shí)現(xiàn)一個(gè)根據(jù)左邊點(diǎn)擊元素,右邊顯示不同的內(nèi)容,這個(gè)要如何實(shí)現(xiàn)?
左邊的區(qū)域是子組件,右邊的內(nèi)容是放在很多的子組件中,因?yàn)橛疫叺膬?nèi)容是不同的,所以就分成幾個(gè)組件
【我的思路】:點(diǎn)擊左邊區(qū)域里面的不同節(jié)點(diǎn),左邊的子組件會(huì)返回一個(gè)type給父級(jí),在父級(jí)中根據(jù)type來加載右側(cè)區(qū)域的不同組件
【方法一】:將左側(cè)子組件中返回的type存放在父組件中的state中,然后在右側(cè)中來判斷這個(gè)type,根據(jù)type的不同,顯示不同的子組件。
【方法二】:在父組件中寫一個(gè)點(diǎn)擊事件的function,在子組件中調(diào)用,當(dāng)左側(cè)子組件中點(diǎn)擊的時(shí)候,調(diào)用父級(jí)中定義的這個(gè)function,然后在父級(jí)的function中,根據(jù)this.refs.xxx來顯示對(duì)應(yīng)的子組件。但是這里遇到一個(gè)問題,要如何動(dòng)態(tài)獲取這個(gè)refs中的xxx?我在右側(cè)組件中給每個(gè)組件的ref的值其實(shí)是等于子組件返回的這個(gè)type的。但是在function中用this.refs.type是undefined的?!締枴浚耗且绾尾拍芨鶕?jù)這個(gè)type來動(dòng)態(tài)獲取這個(gè)this.refs的節(jié)點(diǎn)?
方法一:
父組件:
class Container extends Component {
constructor() {
super(...arguments);
this.state = {
type: '',
}
}
let getType = (type) => {
this.setState({type: type})
}
render() {
return (
<div className="wrapper">
<div className="app-left">
<ChileLeft getType={this.getType} />
</div>
<div className="app-right">
<RightOne style={this.state.type=='type1'? {display:'block'}:{}} />
<RightTwo style={this.state.type=='type2'? {display:'block'}:{}} />
<RightThree style={this.state.type=='type3'? {display:'block'}:{}} />
...
</div>
</div>
)
}
}
方法二:
父組件:
class Container extends Component {
let getType = (type) => {
this.refs.type.style.display = "block" //在此處想根據(jù)這個(gè)type動(dòng)態(tài)來獲取this.refs要如何寫?我目前的這個(gè)寫法是錯(cuò)誤的,只是示例展示下我的想法
}
render () {
return (
<div className="wrapper">
<div className="app-left">
<ChileLeft getType={this.getType} />
</div>
<div className="app-right">
<RightOne ref="type1" />
<RightTwo ref="type2" />
<RightThree ref="type3" />
...
</div>
</div>
)
}
}
以上的兩個(gè)方法,個(gè)人感覺方法一太麻煩了,想用方法二,但是方法二就是不知道如何動(dòng)態(tài)獲取this.refs?
React都是自學(xué)的,沒React項(xiàng)目開發(fā)的經(jīng)驗(yàn),所以在思維邏輯上還存在很大的問題,還請(qǐng)各位大神指點(diǎn)一二,謝謝了~
如果哪位大神有更好的思路,也請(qǐng)指點(diǎn)下,本人不勝感激
記住 react 的一個(gè)思想,那就是:
jsx 也是 jsjsx 也是 jsjsx 也是 js什么意思呢?
就是你可以吧一個(gè)組件當(dāng)做js一樣調(diào)用,當(dāng)做變量之類的...
栗子:
let one=<RightOne/>
let two=<RightTwo/>
let three=<RightTwo/>
也可以
let right=[
<RightOne/>,<RightTwo/>,<RightTwo/>
]
所以你可以點(diǎn)擊左邊的改變 type
右邊直接
{right[type]}
或者
{
this.state.type == 0
? <p>0</p>
: this.state.type == 1
? <p>1</p>
: <p>2</p>
}
完整栗子:
class App extends Component {
constructor() {
super()
this.state = {
type: 0
}
this.right = [
<p>0</p>,
<p>1</p>,
<p>2</p>,
]
}
componentDidMount() {
}
render() {
return (
<div>
<div>
<button onClick={() => this.setState({type: 0})}>0</button>
<button onClick={() => this.setState({type: 1})}>1</button>
<button onClick={() => this.setState({type: 2})}>2</button>
</div>
// 方式1
<div>
{
this.right[this.state.type]
}
</div>
// 方式2
<div>
{
this.state.type == 0
? <p>0</p>
: this.state.type == 1
? <p>1</p>
: <p>2</p>
}
</div>
</div>
);
}
}
export default App;
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。