Реагируйте на useRef, чтобы установить ширину узла DOM

поэтому я столкнулся с проблемой, когда я не могу изменить ширину узла DOM с помощью useRef. Я использую событие 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;

person The Coder    schedule 18.04.2021    source источник


Ответы (1)


Во-первых, это может не работать, потому что вы используете одну ссылку для нескольких элементов.

Этот ответ в другом сообщении может помочь вам https://stackoverflow.com/a/65350394

Но то, что я сделал бы в вашем случае, было бы довольно простым.

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

Вам не нужно использовать ссылку, поскольку у вас уже есть ссылка на цель события.

person Luis Sardon    schedule 18.04.2021
comment
Огромное спасибо! Полагаю, я не обращал на это внимания. - person The Coder; 18.04.2021