[英]Reactjs: Accessing 'this' of a sibling component
我有3個組成部分的情況; <View>
<Content>
和<Footer>
。
<View>
是<Content>
和<Footer>
父級。 現在有一個按鈕<Footer>
並單擊時,我想渲染的Overlay
在<Content>
組件,所以我必須能夠訪問this
了的<Content>
我的內部組件<Footer>
組件。 我沒有實現該目標。
View.js
class View extends Component {
render() {
return (
<div>
<Content messages={this.props.messages}/>
<Footer />
</div>
)
}
}
Content.js
class Content extends Component {
render() {
return (
<div>
{this.props.messages}
</div>
)
}
}
Footer.js
class Footer extends Component {
constructor(props,context){
super(props,context);
this.state = {
showEmojiPicker: false,
}
}
handleToggleEmojiPicker() {
this.setState({
showEmojiPicker: !this.state.showEmojiPicker,
});
}
render() {
return (
<div>
<div>
<div>
<bootstrap.Button ref="targetEmojiPicker" bsSize="xsmall" onClick={this.handleToggleEmojiPicker.bind(this)}>
<bootstrap.Glyphicon glyph="heart" />
</bootstrap.Button>
<bootstrap.Overlay
show={this.state.showEmojiPicker}
onHide={this.handleClose.bind(this)}
container={content.this} //Need this of Content component
target={() => ReactDOM.findDOMNode(this.refs.targetEmojiPicker)}
>
<EmojiModalCategories actions={this.props.actions}/>
</bootstrap.Overlay>
</div>
</div>
</div>
)
}
}
您應該在官方的React文檔的“ 在組件之間通信”頁面上閱讀。
如果要從Footer
訪問Content
組件中的功能,則必須從View
提供該功能作為對Footer
的prop
。
假設您要運行Content
組件中的showOverlay()
函數,可以執行以下操作:
displayOverlay = () => {
this.refs.content.showOverlay();
}
render() {
//some code
<Content ref="content" />
//some code
<Footer overlayButtonClick={this.displayOverlay} />
}
btnClick = () => {
this.props.overlayButtonClick();
}
render() {
//some code
<button onClick={this.btnClick}>Click</button>
//some code
}
編輯2017年8月
請注意,現在不建議使用字符串文字作為ref
值。 有關更多信息,您可以在這里查看我之前的答案。
如果您使用的是Redux或Flux,則最好分配一些操作“ DISPLAY_OVERLAY”。 將一些reducer或store值更改為true,例如reducer.displayOverlay=true
; 然后在Content組件的render方法中使用該reducer值。
render:function(){
return <div>
{reducer.displayOverLay? this.showOverlay():this.hideOverlay()}
</div>
}
如果您不使用flux或redux,請使用視圖組件狀態。 在視圖組件狀態中設置狀態變量showOverlay:false
。 然后將showOverlay
傳遞給Content
組件
<Content showOverlay={this.state.showOverlay}/>
然后
視圖
toggleOverLay(){
this.setState({
showOverlay:!this.state.showOverlay
})
}
render() {
//some code
<Content showOverlay={this.state.showOverlay}/>
//some code
<Footer toggleOverlay={this.toggleOverlay} />
}
頁腳
btnClick = () => {
this.props.toggleOverlay();
}
render() {
//some code
<button onClick={this.btnClick}>Click</button>
//some code
}
這樣,我就可以訪問<Footer>
組件中<Content>
“ this”。 現在我不確定在道德上我是否做錯了事,損害了單向綁定的Reactjs動機。 我也正在使用redux,但是如何在store的幫助下解決這個問題。 建議是非常可觀的,因為我真的很困惑
View.js
class View extends Component {
constructor(props,context){
super(props,context);
this.state = {
thisOfContent: false
}
}
handleUpdateValue(newThisOfContent) {
this.setState({
thisOfContent: newThisOfContent
})
}
render() {
return (
<div>
<Content handleUpdateValue={this.handleUpdateValue.bind(this)}/>
<Footer stateValue={this.state.thisOfChatWindowContent}/>
</div>
)
}
}
Content.js
class Content extends Component {
componentDidMount() {
this.props.handleUpdateValue(this);
}
render() {
return (
<div>
</div>
)
}
}
Footer.js
class Footer extends Component {
constructor(props,context){
super(props,context);
this.state = {
showEmojiPicker: false,
}
}
handleToggleEmojiPicker() {
this.setState({
showEmojiPicker: !this.state.showEmojiPicker,
});
}
render() {
return (
<div>
<div>
<div>
<bootstrap.Button ref="targetEmojiPicker" bsSize="xsmall" onClick={this.handleToggleEmojiPicker.bind(this)}>
<bootstrap.Glyphicon glyph="heart" />
</bootstrap.Button>
<bootstrap.Overlay
show={this.state.showEmojiPicker}
onHide={this.handleClose.bind(this)}
container={this.props.stateValue}
target={() => ReactDOM.findDOMNode(this.refs.targetEmojiPicker)}
>
<EmojiModalCategories actions={this.props.actions}/>
</bootstrap.Overlay>
</div>
</div>
</div>
)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.