我是 Typescript 的新手,我很难理解为什么我的代码不起作用。
我正在尝试使用 react 和 typescript 构建轮播图片库,当我尝试使用左右箭头上的“onClick”进行导航时遇到了问题。
我收到以下错误:
Type
'{ onClick: () => void; }'
不可分配给 type'IntrinsicAttributes'
。属性'onClick'
在 type 上不存在'IntrinsicAttributes'
。
这是我的代码:
const Carousel = ({ slides }) => {
return (
<section className="slider">
<ArrowRight onClick = {nextSlide} /> //The error is here!
<ArrowLeft onClick = { () => prevSlide() } /> //and here!
{slides.map((slide, index) => {
return (
<div className="img-slide">
<img src={slide.image} />
<div className="rolo-slide">
{/* <img src={slide.image} onClick={slides.setCurrent(index)} /> */}
</div>
</div>
)
})}
</section>
)
}
export default Carousel
这是 ArrowLeft 和 Right 是什么,它们只是一个跨度,我使用 CSS 制作了箭头。
function ArrowLeft() {
return (
<span className="arrow left"></span>
)
}
您ArrowLeft
根本不接受任何道具,因此 TypeScript 不会让您为其分配onClick
不接受的道具。
更新ArrowLeft
以接受onClick
处理程序。对于函数式组件,我通常使用函数表达式而不是声明:
const ArrowLeft: React.FC<{onClick?: React.MouseEventHandler<HTMLElement>}> = ({onClick}) => {
return (
<span className="arrow left" onClick={onClick}></span>
);
};
一些注意事项:
React.FC
是 的别名React.FunctionComponent
。它告诉 TypeScript 这ArrowLeft
是一个函数组件。React.FC
有一个可选的 type 参数来指定功能组件期望的 props 的类型(它们将与通常的 props 组合)。在<>
后React.FC
提供了一种类型参数描述所述对象的道具这种功能部件接受。onClick?:
说onClick
道具是可选的。React.MouseEventHandler<HTMLElement>
表示道具的类型(如果给定)是 HTML 元素的鼠标事件处理程序。onClick
处理程序转发到 ,span
以便在span
单击时调用它。我使用了箭头函数,因为它们比传统函数(略)轻,但如果您愿意,也可以使用传统函数:
const ArrowLeft: React.FC<{onClick?: React.MouseEventHandler<HTMLElement>}> = function({onClick}) {
return (
<span className="arrow left" onClick={onClick}></span>
);
};
顺便说一句:不要担心记住所有这些类型。你会想知道的React.FC
当然是(或React.Component
用于class
组件),但例如在onClick
上面你没有神奇地知道这一点。在任何像样的 IDE 中,您都可以从不存在的那个开始,然后执行以下操作:
// To start with
const ArrowLeft: React.FC = () => {
return (
<span className="arrow left" onClick={}></span>
);
};
...然后将鼠标悬停onClick
在span
. 我的 IDE (VS Code) 告诉我类型onClick
是React.MouseEventHandler<HTMLSpanElement> | undefined
:
该| undefined
部分我在道具处理的使用?
,使其可选的,我改变HTMLSpanElement
,只是更普遍的HTMLElement
,因为没有任何需要使用的代码ArrowLeft
就知道它使用一个span
,具体而言,与一个div
或i
或什么的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句