【问题标题】:Issue getting a child components size获取子组件大小的问题
【发布时间】:2018-09-01 11:04:20
【问题描述】:

长话短说,我正在尝试使用 React 重现此 Codepen

但是,它需要着陆页的高度(背景中的 gif),我试图获得“我的”,但由于某种原因,我在使用 refs 时遇到了麻烦。

这里是父组件:

export default class Stadium extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            height: '',

        }
    }


    componentDidMount() {
        console.log(this.Landing);
    }

    render() {
        const { data, scrollClass } = this.state;
        return (
            data !== null &&
            [
                <Header key={"header"} scrollClass={scrollClass} />,
                <Landing key={"landing"} heightRef={(elem) => this.Landing = elem}/>,
                <Maps key={"maps"} gmapskey={data.g_map_key} />,
                <p>Taille du landing: {this.state.height}</p>,
                <Footer key={"footer"}/>

            ]
        )
    }
}

这是我的子组件:

export default class Landing extends React.Component {

    render() {
        return (
            [
                <header id="landing" className="white-text" key={"header"} ref={this.props.Landing}>
                    <div className="container">
                        <h1>Opacity on scroll</h1>
                        <p>The header element fades away.</p>
                    </div>
                </header>,

                <div id='nav-bg' key={"bg"} />
            ]
        )
    }
}

根据thisthis jsfiddle link,我应该可以得到我组件的对象,但是console.log(this.Landing);返回undefined

我忘记了什么?

提前谢谢你

【问题讨论】:

  • 我没听说过heightRef,不是ref={ elem =&gt; this.Landing = elem}。然后你的 this.Landing 将成为 dom 节点,你可以在其中调用任何你需要的数据来获取数据,比如 this.Landing.offsetHeight
  • @ArmanCharan ...我在我的问题中链接了这个。
  • this.props.Landing 不存在。你想要this.props.heightRef
  • 你是对的,我的元素不一样,但即使你的回复我仍然不确定

标签: javascript reactjs


【解决方案1】:

应该是:

<Landing key={"landing"} Landing={elem => { this.Landing = elem; }} /></Landing> 

Landing里面,改成这样:

<header id="landing" className="white-text" key={"header"} ref="header"></header>

另一个问题:
- &lt;p&gt; 标签缺少键值

注意:
您可以使用&lt;React.Fragment&gt;&lt;/React.Fragment&gt; 来包装您的组件,因此它不会创建额外的&lt;div&gt;,并且您不必提供键值。

更新:
传递props时的一个常见错误:
heightRef={(elem) =&gt; this.Landing = elem}
heightRef={(elem) =&gt; { return (this.Landing = elem); }},
heightRef={(elem) =&gt; { this.Landing = elem; return (this.Landing); }}相同
heightRef={(elem) =&gt; (this.Landing = elem)}

这与heightRef={(elem) =&gt; { this.Landing = elem; }} 完全不同 如果它不期望返回值,则不要产生它。可能会产生副作用。

有我在codesandbox上测试过的demo

【讨论】:

  • 别担心

    ,它更多的是用于测试而不是永久元素。但是,对于您的回答,我不断收到“未定义”

  • @Jaeger codesandbox.io/s/oqkn10yjx6 我提供了这个问题的代码框链接,因为它对 React 有更好的支持。
  • 我看到了你的链接,但是我无法让它在我的项目中运行,它让我发疯
  • 我不知道谁对你投了反对票,但我决定自己复制并粘贴你的代码,然后......它奏效了。我想我错过了一些显而易见的事情。非常感谢!
  • @Jaeger 在我看来,使用ref 并不是很好的做法。是否使用回调函数而不是选项传递值?
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2019-10-07
  • 2012-01-23
  • 2013-02-26
相关资源
最近更新 更多