我有一个包含子React组件的父React组件.

<div>
  <div>Child</div>
</div>

我需要对子组件应用样式,以将其定位在其父组件中,但其位置取决于父组件的大小.

render() {
  const styles = {
    position: 'absolute',
    top: top(),    // computed based on child and parent's height
    left: left()   // computed based on child and parent's width
  };
  return <div style={styles}>Child</div>;
}

我不能在这里使用百分比值,因为顶部和左侧位置是子对象和父对象宽度和高度的函数.

实现这一点的方法是什么?

推荐答案

这个问题的答案是使用参考号,如Refs to Components所述.

根本的问题是需要DOM node (及其父DOM node )来正确定位元素,但它在第一次渲染之后才可用.从上面链接的文章中:

执行DOM测量几乎总是需要接触一个"本机"组件,并使用ref访问其底层DOM node .ref是唯一可靠地实现这一点的实用方法之一.

以下是解决方案:

getInitialState() {
  return {
    styles: {
      top: 0,
      left: 0
    }
  };
},

componentDidMount() {
  this.setState({
    styles: {
      // Note: computeTopWith and computeLeftWith are placeholders. You
      // need to provide their implementation.
      top: computeTopWith(this.refs.child),
      left: computeLeftWith(this.refs.child)
    }
  })
},

render() {
  return <div ref="child" style={this.state.styles}>Child</div>;
}

这将在第一次渲染后立即正确定位元素.如果更改props 后还需要重新定位元素,请在componentWillReceiveProps(nextProps)中更改状态.

Reactjs相关问答推荐

webpack 5中动态导入的路径

阻止在ShadCN和React中的FormLabel中添加 colored颜色

从另一个组件更改组件中const的状态

NextJS(AppRouter)、Apollo(客户端),在根布局中使用ApolloProvider时出错

替换谷歌 map api默认信息窗口与自定义

为什么我的react虚拟化列表不显示滚动条,除非我确保高度低于rowCount*rowHeight?

无法将react 路由状态从路由传递给子组件

如何解决Reaction中遗留的上下文API错误?

有没有可能在next.js和ssr中使用tsps?

MUI 日期 Select 器 - 最小日期混乱

标签文本删除了 MUI 概述的输入

useEffect 渲染没有依赖数组的组件

当每个元素都可拖动时,移动设备上的滚动列表出现问题

动态添加或删除文本输入字段并将值设置为 React JS 中主要状态的数组

单元测试 useLoaderData() react-router v6 加载器函数

如何通过 id 从 useSprings 数组中删除元素

刷新页面时状态改变问题

为什么此代码中的 useState 不更新(文本更新但 id 不更新)?

多次响应获取发送请求

RTK 查询 POST 方法不会改变数据