主App组件中的代码如下:
class App extends Component {
componentDidMount(){
console.log(this.ref);
debugger;
}
render() {
return (
<div>
<Header/>
{this.props.children}
<Footer/>
</div>
);
}
}
使用{this.props.children}
呈现的其中一个组件是HomePage,其中是带有refs的部分。
HomePage的代码如下:
render(){
return (
<div className="homeMain">
<section ref="info"> <Info/> </section>
<section ref="contact"> <Contact /> </section>
</div>
);
}
如何在App组件中获取这些引用,以便能够将它们作为道具传递给标题?
我正在尝试在App组件的componentDidMount中执行此操作,但console.log(this.refs)
为空。
有什么建议吗?
修改
整个App组件:
import React, {Component} from 'react';
import Footer from './common/footer';
import Header from './common/header';
import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import * as actions from './components/homepage/login/authActions';
class App extends Component {
componentDidMount(){
console.log(this.props.children.refs);
debugger;
}
render() {
return (
<div>
<Header route={this.props.location.pathname}
language={this.props.language.labels}
authenticated={this.props.authenticated}
signoutAction={this.props.actions}
offsets={this.props.offsets}
/>
{React.cloneElement(this.props.children, {
currentLanguage: this.props.language.labels,
authenticated: this.props.authenticated
})}
<div className="clearfix"/>
<Footer currentLanguage={this.props.language.labels}/>
</div>
);
}
}
function mapStateToProps(state, ownProps) {
return {
language: state.language,
authenticated: state.auth.authenticated,
offsets: state.offsets
};
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(actions, dispatch)
};
}
export default connect(mapStateToProps, mapDispatchToProps)(App);
答案 0 :(得分:3)
React的主要想法是将道具从父母传递给孩子(甚至更深层次的孩子 - 我的意思是孙子)
因此,当我们希望父级执行从子级触发(或属于子级)的操作时,我们可以在父级中创建一个回调函数,然后将其作为道具传递给子级
根据您的喜好,这是一个演示如何向下传递回调函数到多个级别的子级以及如何触发它们:
Force React container to refresh data
Re-initializing class on redirect
在您的情况下,您可以按如下方式访问子组件中的引用:(使用字符串作为参考 - 如您所述)
父组件:
import React, { Component } from 'react';
// import Child component here
export default class Parent extends Component {
constructor(props){
super(props);
// ...
this.getRefsFromChild = this.getRefsFromChild.bind(this);
}
getRefsFromChild(childRefs) {
// you can get your requested value here, you can either use state/props/ or whatever you like based on your need case by case
this.setState({
myRequestedRefs: childRefs
});
console.log(this.state.myRequestedRefs); // this should have *info*, *contact* as keys
}
render() {
return (
<Child passRefUpward={this.getRefsFromChild} />
)
}
}
子组件:
import React, { Component } from 'react';
export default class Child extends Component {
constructor(props){
super(props);
// ...
}
componentDidMount() {
// pass the requested ref here
this.props.passRefUpward(this.refs);
}
render() {
return (
<div className="homeMain">
<section ref="info"> <Info/> </section>
<section ref="contact"> <Contact /> </section>
</div>
)
}
}
答案 1 :(得分:0)
ref
是每个this.props.children
的属性,因此您可以通过ref
上的this.props.children
属性访问父级中子组件的引用
确保您在componentDidMount
编辑:
如果有效,请尝试以下代码集:
var myChild= React.Children.only(this.props.children);
var clone = React.cloneElement(myChild, { ref: "myRef" });
答案 2 :(得分:0)
根据Refs to Components,基于字符串的All connections on all I/O threads are busy
s - 虽然未弃用 - 会被基于回调的语法取代,例如:
ref
基于字符串的<section ref={sectionElement => this.sectionElement = sectionElement}>
<Info/>
</section>
可能很快就会被弃用,这也意味着ref
也会受到影响。因此,我建议您考虑这些因素,并提供实例方法或属性来代替公开引用:
this.refs
之后,您还需要获得class HomePage extends Component {
render() {
return (
<div className="homeMain">
<section ref={infoSection => this.infoSection = infoSection}>
<Info/>
</section>
<section ref={contactSection => this.contactSection = contactSection}>
<Contact />
</section>
</div>
);
}
}
到ref
,然后您可以访问HomePage
和infoSection
作为属性,然后你可以作为道具传递给contactSection
,例如:
Header
您确切的应用程序结构对我来说是未知的,但一般原则可以在任何地方使用:通过实例方法或属性公开<HomePage ref={homePage => this.homePage = homePage} ... />
<Header sections={[this.homePage.infoSection, this.homePage.contactSection]} ... />
,获取ref
暴露其ref
的组件s,然后通过公开的属性访问内部ref
。
如果你现在继续使用基于字符串的ref
,你可以定义一个getter (尽管ref
也可以直接访问):
refs
答案 3 :(得分:0)
如果您的组件是相关的(父级和子级),您可以将ref分配给子级,并可以在父级
中使用它如果没有,那么getElementById
将会拯救,但在选择它时请指定html类型
离。
const info = (document.getElementById("info") as HTMLDivElement)