当前位置: 首页 > 面试题库 >

如何使用react钩子动态添加“ refs”?

仇正豪
2023-03-14
问题内容

因此,我有一个数据数组,并且正在使用该数据生成组件列表。我想在每个生成的元素上都有一个引用来计算高度。我知道如何使用Class组件执行此操作,但是我想使用React
Hooks进行操作。

这是一个说明我要做什么的示例:

import React, {useState, useCallback} from 'react'
const data = [
  {
    text: 'test1'
  },
  {
    text: 'test2'
  }
]
const Component = () => {
  const [height, setHeight] = useState(0);
  const measuredRef = useCallback(node => {
    if (node !== null) {
      setHeight(node.getBoundingClientRect().height);
    }
  }, []);

  return (
    <div>
      {
        data.map((item, index) => 
          <div ref={measuredRef} key={index}>
            {item.text}
          </div>
        )
      }
    </div>
  )
}

问题答案:

不确定我是否完全理解您的意图,但我认为您需要这样的东西:

const {

  useState,

  useRef,

  createRef,

  useEffect

} = React;



const data = [

  {

    text: "test1"

  },

  {

    text: "test2"

  }

];



const Component = () => {

  const [heights, setHeights] = useState([]);

  const elementsRef = useRef(data.map(() => createRef()));



  useEffect(() => {

    const nextHeights = elementsRef.current.map(

      ref => ref.current.getBoundingClientRect().height

    );

    setHeights(nextHeights);

  }, []);



  return (

    <div>

      {data.map((item, index) => (

        <div ref={elementsRef.current[index]} key={index} className={`item item-${index}`}>

          {`${item.text} - height(${heights[index]})`}

        </div>

      ))}

    </div>

  );

};



const rootElement = document.getElementById("root");

ReactDOM.render(<Component />, rootElement);


.item {

  box-sizing: border-box;

  display: flex;

  align-items: center;

  justify-content: center;

  border: 1px solid #ccc;

}



.item-0 {

  height: 25px;

}



.item-1 {

  height: 50px;

}


<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js"></script>

<div id="root"/>


 类似资料:
  • 提前谢了。我有一个状态数组,如下所示。 我需要添加一个项目到状态数组,我发现我们不需要做状态突变。如何使用PrevState设置状态。 如何调用set State以追加此状态数组。 像这样的东西?

  • 当类组件的输入道具相同时,可以使用PureComponent或ShouldComponentUpdate来避免呈现。现在,您可以通过将函数组件包装在react.memo中来对它们进行同样的处理。 所期望的: 我希望只有当模态可见时才呈现模态(由this.props.show管理) 对于类组件: 如何在功能组件中使用?在modal.jsx中? 相关代码: 功能组件modal.jsx(我不知道如何检查

  • 添加插件钩子有两种方法 添加执行多次的插件钩子 hook($hook, &$params = null, $extra = null) 功能 添加执行多次的插件钩子 参数 $hook: string 钩子名称 $params: boolean 传入参数 $extra: boolean 额外参数 返回 string 插件执行结果 添加只执行一次的插件钩子 hook_one($hook, &$par

  • X1.4.0新增 hook($hook,$param) 功能: 添加钩子 参数: $hook:钩子名称 $param:传入参数,默认为空数组 返回: 无 模板使用: {:hook('footer')} {:hook('sider',array('text'=>'hello ThinkCMF')} 控制器方法里使用: //不带参数 hook('your_hook_name'); //带参数 h

  • 我在CentOs上的上设置了一个新的Gitlab,并在continuous-delivery组下创建了一个新的存储库。完整路径为。此路径下只有一个文件,即readme.txt。 我试图实现的是当有人将更改推送到服务器时创建一个新文件。下面是我在服务器上做的事情: 在echo“text”>>file_name`创建一个新文件 chmod它们为775。 当我将更改从本地推送到服务器时,不会创建任何文件

  • 在React的官方文件中提到- 如果您熟悉React类生命周期方法,那么可以将useEffect钩子看作componentDidMount、componentDidUpdate和componentWillUnmount的组合。 我的问题是--我们如何在钩子中使用生命周期方法?