anu icon indicating copy to clipboard operation
anu copied to clipboard

某些情况下在 componentDidUpdate 的周期内取得的 dom 元素高度不正确

Open kitian616 opened this issue 5 years ago • 0 comments

当前的提交点: 33eec515c78497abc9b093187909f0914bb5ee07

这是一个可以在项目根目录中运行的示例:

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width">
	<script type='text/javascript' src="./dist/React.js"></script>
	<script type='text/javascript' src="./lib/ReactTestUtils.js"></script>
	<script type='text/javascript' src="./lib/babel.js"></script>

</head>

<body>

	<div id='root' class="root">

	</div>
	<script type='text/babel'>

        var Example = class extends React.Component {
			constructor(props) {
                super(props);
                this.child = null;
            }
            componentDidMount() {
                console.log('height@DidMount', this.child.offsetHeight);
            }
			render() {
                return <div ref={(dom) => {
                    dom && (this.child = dom);
                }}>
                    {this.props.children}
                </div>;
			}
            componentDidUpdate(prevProps, prevState) {
                console.log('height@DidUpdate', this.child.offsetHeight);
            }
		};

        var Child = class extends React.Component {
            constructor(props) {
                super(props);
                this.state = {
                    ok: false
                }
                this.child = null;
            }
            componentDidMount() {
                setTimeout(() => {
                    this.setState({
                       ok: true
                    });
                }, 1000);
            }
            render() {
                return <div>
                    <Example>
                        {
                            this.state.ok ?
                            <div>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                                <p>dsafjsakfjakls</p>
                            </div> :
                            <div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                                <div>NULL</div>
                            </div>
                        }

                    </Example>
                </div>;
            }
        }

        var container = document.getElementById('root');

		ReactDOM.render(
            <Child />,
            container,
		);
    </script>


</html>

示例的运行结果: image 这两个值存在偏差。 如果把上面的 <div>NULL</div> 都改为 <p>NULL</p> 结果就是对的。

kitian616 avatar Sep 27 '18 09:09 kitian616