reactjs - React + TypeScript användning av className-prop
Vad är det korrekta sättet att skriva och använda className-propsen i en anpassad komponent? Jag kunde tidigare göra så här:
class MyComponent extends React.Component<MyProps, {}> {
...
}
och sedan använda min komponent via:
<MyComponent className="my-class" />
Observera att jag inte skulle definiera className i MyProps, även om React tidigare var typat för att stödja denna användning.
Nu ser jag detta typerrorsmeddelande:
Property 'className' does not exist on type 'IntrinsicAttributes &
IntrinsicClassAttributes<Component<{}, ComponentState>> & Readonly<{
childr...'
Vad är det korrekta sättet att definiera/typa min komponent som gör att jag kan använda className när jag använder min komponent?
Svar #1
Du kan använda typen HTMLAttributes, till exempel:
class MyComponent extends React.Component<MyProps & React.HTMLAttributes<HTMLDivElement>, {}> {
render() {
return <div className={ this.props.className }>My Div</div>
}
}
På så sätt kan du skicka vidare vilken som helst av de egenskaper som ett HTML-element kan behöva.
Om du bara behöver className-egenskapen kan du göra så här:
class MyComponent extends React.Component<MyProps & { className: string }, {}> {
render() {
return <div className={ this.props.className }>My Div</div>
}
}
Eller lägg helt enkelt till det i din MyProps-typ.
Svar #2
För någon som letar efter en lösning för funktionella komponenter, som jag gjorde.
type Props = {
className?: string
}
const MyComponent: React.FC<Props> = (props) => (
<div className={props.className}>{props.children}</div>
)
export default MyComponent
eller om du vill deklarera gränssnittet separat:
interface OnlyClassNameInterface extends React.FC<{className: string}> {}
const MyComponent: OnlyClassNameInterface = (props) => (
<div className={props.className}>{props.children}</div>
)
export default MyComponent
och du kan flytta gränssnittet till en annan fil
import React from 'react'
type MixProps<P> = P & {className?: string}
export interface OnlyClassNameInterface<P = {}> extends React.FC<MixProps<P> {}
Svar #3
Jag själv använder alltid typen HTMLProps genom att få className från den på detta sätt:
HTMLProps<HTMLElement>["className"];
Det fungerar också helt problemfritt med TailwindCSS klassnamn autofullständig funktionalitet.
