React useState改变状态后,在useCallback中并不能拿到改变之后的状态。

发布于 2022-09-12 23:13:38 字数 2165 浏览 24 评论 0

我想通过设置left和width来控制下方蓝色条的位置。
image.png
触发onClickHandler事件打印如下:
image.png

const SwitchTabPages = ({ defaultKey, onChange, datas }) => {
  const ulRef = useRef();
  const [inkBarWidth, setInkBarWidth] = useState('0px');
  const [inkBarLeft, setInkBarLeft] = useState('0px');

  useEffect(() => {
    setInkBarWidth('64px')
  }, [])

  const onClickHandler = (e, index) => {
    let lefts = [];
    let curWidth = 0;
    const event = e.nativeEvent.style
    const lis = ulRef.current.querySelectorAll('.li-item')

    for (let key of lis.keys()) {
      lefts.push({
        left: curWidth,
        width: lis[key].clientWidth,
      });
      curWidth += (lis[key].clientWidth + 32)
    }

    console.log('width设置成:', lefts[index].width + 'px', 'left设置成:', lefts[index].left + 'px')
    setInkBarWidth((lefts[index].width + 'px'))
    setInkBarLeft((lefts[index].left + 'px'))
  }

  const inkBarLine = useCallback(() => {
    console.log('width/left change', inkBarWidth, inkBarLeft)
    return (
      <div className="li-tabs-ink-bar" style={{ width: inkBarWidth, left: inkBarLeft }}></div>
    )
  }, [inkBarWidth, inkBarLeft])

  return (
    <div className="switch-tab-pages">
      <div className="switch-tabs">
        <ul
          style={{ transform: 'translate(0px, 0px)' }}
          ref={ulRef}
        >
          {datas.map(item => (
            <li className="li-item" key={item.key} onClick={(e) => onClickHandler(e, item.key)}>
              <Link to={item.toPath || ''}>{item.label}</Link>
            </li>
          ))}
          {
            inkBarLine()
          }
        </ul>
      </div>
      <div className="page-content">
        <Route path="/agentManage/detail/baseData" exact component={BaseData} ></Route>
        <Route path="/agentManage/detail/bills" exact component={Bills} ></Route>
      </div>
    </div>
  )
}

export default SwitchTabPages

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

划一舟意中人 2022-09-19 23:13:38

并没有复现你所说的问题,你的代码没问题
https://codesandbox.io/s/late...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文