gpt4 book ai didi

javascript - 通过 ref 访问自定义组件方法无法按预期工作

转载 作者:行者123 更新时间:2023-11-29 21:02:20 25 4
gpt4 key购买 nike

有人可以向我解释为什么在 SomeClass 构造函数中 getLoggerClass 方法返回未定义,但在 onClick() 方法中它返回记录器类吗?

class App extends React.Component {

constructor(props){
super(props)
this.getLoggerClass = this.getLoggerClass.bind(this)
}

render(){

return(

<div>
<LoggerClass ref={(c)=>{this.loggerClass = c}}/>
<SomeClass app={this} />
</div>

)

}

getLoggerClass(){
return this.loggerClass

}

}

class SomeClass extends React.Component {

constructor(props){
super(props)

this.loggerClass = this.props.app.getLoggerClass()
console.log(this.loggerClass)

this.onClick = this.onClick.bind(this)
}

render(){

return <button onClick={this.onClick}>click</button>

}

onClick(){

console.log(this.props.app.getLoggerClass().console)

}

}

class LoggerClass extends React.Component {

render(){
return <div></div>
}

console(v){
console.log(v)
}

test(){}

}


ReactDOM.render(<App />,document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="app"></div>

最佳答案

这是因为 ref LoggerClass 上的函数constructor 时节点尚未执行的 SomeClass得到运行。 constructor在创建虚拟 DOM 时执行,而 ref当组件实际安装到真实 DOM 时执行(more info about mounting here)。这就是我认为您正在寻找的内容,相关代码在 SomeClass 中的 componentDidMount :

class App extends React.Component {

constructor(props){
super(props)
this.getLoggerClass = this.getLoggerClass.bind(this)
}

render(){

return(

<div>
<LoggerClass ref={(c)=>{this.loggerClass = c}}/>
<SomeClass app={this} />
</div>

)

}

getLoggerClass(){
return this.loggerClass

}

}

class SomeClass extends React.Component {

constructor(props){
super(props)

this.onClick = this.onClick.bind(this)
}

componentDidMount() {
this.loggerClass = this.props.app.getLoggerClass()
console.log('in mounted', this.loggerClass.console)
}

render(){

return <button onClick={this.onClick}>click</button>

}

onClick(){

console.log(this.props.app.getLoggerClass().console)

}

}

class LoggerClass extends React.Component {

render(){
return <div></div>
}

console(v){
console.log(v)
}

test(){}

}


ReactDOM.render(<App />,document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="app"></div>

关于javascript - 通过 ref 访问自定义组件方法无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45905619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com