javascript - React typescript forwardref med defaultProps
Jeg prøvde å bruke defaultProps i en funksjonell komponent sammen med forwardRef, men fikk feilen (se skjermbilde).
Jeg vil ikke desstrukturere props i funksjonsparametere og tildele standardverdi, fordi jeg har mange props i mitt opprinnelige brukstilfelle. Jeg prøvde også å tildele standardverdiene direkte i JSON til ComponentA.defaultProps, men fikk samme resultat.
Hvordan løse dette? Prøvde å surfe, men klarte ikke å finne noen løsning. Også siden vi bruker TS for typekontroll, trenger vi fortsatt prototype JSON? #App.tsx
import './App.css';
import ComponentA from './components/A/A';
function App() {
return (
<div className="App">
<ComponentA>
<button>Button I am</button>
</ComponentA>
</div>
);
}
export default App;
#ComponentA.tsx
import React,{forwardRef} from "react"
import PropTypes from 'prop-types';
type Props = {
children:JSX.Element | JSX.Element[],
text:string,
text1?:string,
}
const ComponentA=(prop:Props)=>{
return <div>Hey
{prop.children}
{prop.text}
{prop.text1}
</div>
}
ComponentA.prototype = {
children:PropTypes.element.isRequired,
text:PropTypes.string.isRequired,
text1:PropTypes.string
}
ComponentA.defaultProps={
text: 'done'
} as Partial<Props>
export default forwardRef<HTMLAllCollection,Props>(ComponentA)
Takk
Svar #1
Brian Vaughn kommenterte på problemet med Stateless Component: React.forwardRef gjør defaultProps ugyldig
Funksjonen som sendes til
forwardRefer ikke en React-komponent. (React-komponenter godtar for eksempel ikke en andreref-parameter.) Det er bare en funksjon som «renderer» (returnerer) React-elementer. Den støtter derfor ikkedefaultProps. Vi har tester som bekrefter dette som forventet oppførsel.React logger også følgende feil i konsollen (som kan sees i ditt Code Sandbox-reproduksjon):
Advarsel: forwardRef-renderfunksjoner støtter ikke propTypes eller >defaultProps. Har du ved et uhell sendt inn en React-komponent?
Det er grunnen til at du ikke kan legge ved defaultProps før du sender funksjonen som "rendrer" til forwardRef.
Det nevnes også i typedefinisjonene til React:
// the input of ForwardedRef
interface ForwardRefRenderFunction<T, P = {}> {
(props: P, ref: ForwardedRef<T>): ReactElement | null;
displayName?: string | undefined;
// explicit rejected with `never` required due to
// https://github.com/microsoft/TypeScript/issues/36826
/**
* defaultProps are not supported on render functions
*/
defaultProps?: never | undefined;
/**
* propTypes are not supported on render functions
*/
propTypes?: never | undefined;
}
I ditt tilfelle bare bytt om på rekkefølgen av deklarasjonene:
import "./styles.css";
import { forwardRef } from "react";
import PropTypes from "prop-types";
type Props = {
children: JSX.Element | JSX.Element[];
// NOTE: text is optional since he has default value.
text?: string;
text1?: string;
};
const ComponentA = forwardRef<HTMLAllCollection, Props>((prop: Props) => {
return (
<div>
Hey
{prop.children}
{prop.text}
{prop.text1}
</div>
);
});
ComponentA.prototype = {
children: PropTypes.element.isRequired,
text: PropTypes.string,
text1: PropTypes.string
};
ComponentA.defaultProps = {
text: "done"
};
export default function App() {
return (
<ComponentA>
<button>Button I am</button>
</ComponentA>
);
}
Sandkassekode
