如何从React JS中的另一个组件获取refs

时间:2016-10-17 07:31:32

标签: javascript reactjs

主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);

4 个答案:

答案 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,然后您可以访问HomePageinfoSection作为属性,然后你可以作为道具传递给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)