Usando o TypeScript com React, não precisamos mais estender React.Props
para que o compilador saiba que todos os adereços do componente react podem ter filhos:
interface MyProps { }
class MyComponent extends React.Component<MyProps, {}> {
public render(): JSX.Element {
return <div>{this.props.children}</div>;
}
}
No entanto, não parece ser o caso para componentes funcionais sem estado:
const MyStatelessComponent = (props: MyProps) => {
return (
<div>{props.children}</div>
);
};
Emite o erro de compilação:
Erro: (102, 17) TS2339: A propriedade 'filhos' não existe no tipo 'MyProps'.
Acho que é porque realmente não há como o compilador saber que uma função vanilla será fornecida children
no argumento props.
Portanto, a questão é como devemos usar filhos em um componente funcional sem estado no TypeScript?
Eu poderia voltar ao modo antigo MyProps extends React.Props
, mas a Props
interface está marcada como obsoleta e os componentes sem estado não têm ou suportam um, Props.ref
conforme eu o entendo.
Então, eu poderia definir o children
adereço manualmente:
interface MyProps {
children?: React.ReactNode;
}
Primeiro: é ReactNode
o tipo correto?
Segundo: tenho que escrever filhos como opcionais ( ?
) ou então os consumidores pensarão que isso children
é um atributo do componente ( <MyStatelessComponent children={} />
) e gerarão um erro se não for fornecido com um valor.
Parece que estou faltando alguma coisa. Alguém pode esclarecer se meu último exemplo é a maneira de usar componentes funcionais sem estado com crianças no React?
fonte
@types
React.StatelessComponent
/React.SFC
estão obsoletos. EmReact.FunctionComponent
vez disso, é recomendável consultar .Você pode usar o
React.PropsWithChildren<P>
tipo para seus adereços:interface MyProps { } function MyComponent(props: React.PropsWithChildren<MyProps>) { return <div>{props.children}</div>; }
fonte
Você pode usar
interface YourProps { } const yourComponent: React.SFC<YourProps> = props => {}
fonte
React.SFC
está obsoletoResposta mais simples: Use
ReactNode
:Se
children
é opcional ou não (ou seja, ter?
ou não) depende do seu componente. Essa?
é a maneira mais concisa de expressar isso, então nada de errado com isso.No histórico: esta não era necessariamente a resposta correta quando perguntado originalmente: o tipo
ReactNode
foi adicionado em (quase) sua forma atual em março de 2017 apenas por esta solicitação de pull , mas quase todos que estão lendo isso hoje devem estar em uma versão moderna do React .Por último, sobre passar
children
como "atributo" (que, no jargão do React, seria passar como "prop", não atributo): É possível, mas na maioria dos casos é melhor ler ao passar filhos JSX:<MyComponent> <p>This is part of the children.</p> </MyComponent>
lê mais facilmente do que
<MyComponent children={<p>This is part of the children.</p>} />
fonte
Você pode apenas adicionar filhos ao componente e se ele estiver conectado a um contêiner, isso é tudo que você precisa.
const MyComponent = ({ children }) => { return <div>{children}</div> }
fonte