【发布时间】:2021-06-07 12:13:36
【问题描述】:
我有一个可重复使用的标题组件,它允许我传递 tag 属性,创建任何类型的标题(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>;
};
但是,我遇到了一个用例,我希望能够在Tag 上使用useRef() 挂钩来拥有ref,以便我可以访问元素并制作动画与 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 添加到组件中?
谢谢。
【问题讨论】:
标签: javascript reactjs react-hooks createelement use-ref