Массив ссылок ошибка машинописного текста: Свойство ‘getBoundingClientRect’ не существует для типа ‘RefObject’

#javascript #reactjs #typescript

Вопрос:

У меня есть множество ссылок, к которым я использую методы во время цикла. Однако в нем говорится об ошибке, что свойство «Список классов» не существует для типа «RefObject». Свойство ‘getBoundingClientRect’ не существует для типа ‘RefObject’.

Я добавил соответствующий код для получения дополнительной информации. Любая помощь будет признательна. Спасибо

 categories: [
    {
      id: 1,
      name: 'About',
      img: About,
      title: 'Problem Statement',
 }]
 const categoriesContentRef = useRef<React.RefObject<HTMLElement>[]>(
    Array(data.categories.length)
      .fill(null)
      .map(() => React.createRef())
  );

const clickHandler = (event: any) => {
    console.log(categoriesContentRef);
    console.log('Clicked');
    const id = event.currentTarget.id;
    console.log(id);
    const category = categoriesContentRef.current.filter((item) => {
      return item.classList.contains(`${id}`);
    })[0];
    console.log(category);
    if (category) {
      const categoryTop = category.getBoundingClientRect().top;
      const scrollTo = window.scrollY   categoryTop - offset;
      window.scrollTo({
        top: scrollTo,
        behavior: 'smooth',
      });
    }
  };

const Categories: React.FC<categoriesProps> = React.forwardRef(
  ({ allCategories, clickHandler }, ref: any): JSX.Element => {
    return (
      <CategoriesUlWrapper>
        {allCategories.categories.map((category, index) => {
          return (
            <CategoryLi
              ref={(elm) => (ref.current[index] = elm)}
              key={category.id}
              className={category.name}
              id={category.name}
              onClick={clickHandler}
            >
              <CategoryIcon>
                <ResponsiveImage src={category.img} alt={category.name} />
              </CategoryIcon>
              <CategoryName className="p-20-semi-bold">
                {category.name}
              </CategoryName>
            </CategoryLi>
          );
        })}
      </CategoriesUlWrapper>
    );
  }
);

<Categories
 clickHandler={clickHandler}
 allCategories={data}
 ref={categoriesContentRef}
 />

 

Ответ №1:

Это связано с тем, что созданная ссылка будет представлять собой массив с объектами ref, а не сам элемент HTMLElement.

Элемент массива имеет тип React.RefObject, а не тип HTMLElement, поэтому вам также необходимо получить доступ к текущему свойству, чтобы получить используемый HTMLElement.

 const category = categoriesContentRef.current.find((item) => {
  return item.current.classList.contains(`${id}`);
});
if (category) {
  const categoryTop = category.current.getBoundingClientRect().top;
}
 

Комментарии:

1. Эй, @jean182 , Если я сделаю console.log(категория.текущая). Это дает неопределенное. Если я это сделаю, console.log(категория), я получу следующую вещь {текущий: Массив(5)} текущий: Массив(5) 0: раздел#О программе. О 1: раздел#Процесс. Процесс 2: раздел#Исследование. Исследование 3: раздел#Каркасы. Каркасы 4: раздел#Пользовательский интерфейс. Длина пользовательского интерфейса: 5 [[Прототип]]: Массив(0)

2. Можете ли вы поделиться тем, куда вы звоните кликхЕндлеру? Я немного сбит с толку, так как в вашей категории есть этот тип, поэтому я предполагаю, что в вызове clickHandler может быть проблема

3. Я внес изменения в вопрос, @jean182

4. Эй, посмотрев на ваш код и ошибку, я почти уверен, что вы можете использовать current подобным образом в обоих местах, см. Обновленный ответ.

5. При использовании current ошибка исчезает, но я не могу получить доступ к каким-либо свойствам с помощью category.current.getBoundingClientRect().top; потому что current оказывается неопределенным.