React useRef 设置 DOM 节点的宽度

React useRef to set the width of a DOM node

所以我遇到了无法使用 useRef 更改 DOM 节点宽度的问题。我使用 onDragEnd 事件仅触发所选节点上的宽度变化。 我通过更改 'elementRef.current.style.width 属性 来设置宽度。但是更改没有反映在前端。

这是我的代码:

import React, { useEffect, useState, useRef } from "react";
import timelineItems from "../timelineItems";
import "../index.css";

const TimeLine = () => {
  const [sortedTimeline, setTimelineSorted] = useState([]);
  const increaseDateDomRef = useRef(null);

  let usedIndex = [];

  useEffect(() => {
    let sortedResult = timelineItems.sort((a, b) => {
      return (
        new Date(a.start) -
        new Date(b.start) +
        (new Date(a.end) - new Date(b.end))
      );
    });

    setTimelineSorted(sortedResult);
  }, []);

  const increaseEndDate = (e) => {

  };
  const increaseEndDateFinish = (e, idx) => {
    //Im setting the width here but it is not being reflected on the page
    increaseDateDomRef.current.style.width = '200px';
    console.log(increaseDateDomRef.current.clientWidth);
  };

  return (
    <div className="main">
      {sortedTimeline.map((item, idx) => {
        return (
          <div key={idx}>
            <p>{item.name}</p>
            <p>
              {item.start} - {item.end}
            </p>
            <div className="wrapper">
              <div className="circle"></div>
              <div
                className="lineDiv"
                ref={increaseDateDomRef}
                draggable
                onDragStart={(e) => increaseEndDate(e)}
                onDragEnd={(e) => increaseEndDateFinish(e, idx)}
              >
                <hr className="line" />
              </div>
              <div className="circle"></div>
            </div>
          </div>
        );
      })}
    </div>
  );
};

export default TimeLine;

首先这可能不起作用,因为您对多个元素使用单个引用。

另一个 post 上的这个答案可能会对您有所帮助

但是对于你的情况我会做的事情非常简单。

const increaseEndDateFinish = (e, idx) => {
  const target = e.target;
  target.style.width = '200px';
  console.log(target.clientWidth);
};

您不必使用引用,因为您已经有了事件目标的引用。