У меня есть многоразовый компонент заголовка, который позволяет мне передавать tag
prop, создавая любой заголовок (h1, h2, h3 и т. д.). Вот этот компонент:
heading.tsx
import React, { ReactNode } from 'react';
import s from './Heading.scss';
interface HeadingProps {
tag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
children: ReactNode;
className?: string;
}
export const Heading = ({ tag, children, className }: HeadingProps) => {
const Tag = ({ ...props }: React.HTMLAttributes<HTMLHeadingElement>) =>
React.createElement(tag, props, children);
return <Tag className={s(s.heading, className)}>{children}</Tag>;
};
Тем не менее, я сталкиваюсь с вариантом использования, когда я хотел бы иметь ref
, используя хук useRef()
, на Tag
, чтобы я мог получить доступ к элементу и анимировать с помощью GSAP. Однако я не могу понять, как это сделать, используя createElement
.
Я попытался сделать это, добавив ref
непосредственно в компонент Tag
и добавив его в реквизит Tag
следующим образом:
import React, { ReactNode, useRef } from 'react';
import s from './Heading.scss';
interface HeadingProps {
tag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
children: ReactNode;
className?: string;
}
export const Heading = ({ tag, children, className }: HeadingProps) => {
const headingRef = useRef(null);
const Tag = ({ ...props }: React.HTMLAttributes<HTMLHeadingElement>) =>
React.createElement(tag, props, children, {ref: headingRef});
return <Tag className={s(s.heading, className)} ref={headingRef}>{children}</Tag>;
};
Я получаю сообщение об ошибке Property 'ref' does not exist on type 'IntrinsicAttributes & HTMLAttributes<HTMLHeadingElement>'.
Что я делаю не так, и как я могу безопасно добавить ref
к компоненту?
Спасибо.