使用 Typescript 创建 React 组件
Posted
技术标签:
【中文标题】使用 Typescript 创建 React 组件【英文标题】:Creating a React component with Typescript 【发布时间】:2021-08-30 06:07:21 【问题描述】:我最近在学习 typescript,我必须使用良好的实践将一个假的 react 组件转换为 typescript。
目前我有类似的东西
import axios from "axios";
import useEffect, useState from "react";
//var component = (props: any) =>
export default const component = (props: any) =>
//var listeOuNon = 0;
let listeOuNon = 0;
//var listes = props.lists;
const = props.lists;
listeOuNon = props.isLists;
//var montrecomposant = props.show;
const montreComposant = props.show;
if (listeOuNon)
//var [trad, ajoutTrad] = useState();
const [trad, ajoutTrad] = useState();
useEffect(() =>
(async () =>
axios.get("/api/trad").then((reponse) =>
if (reponse.status == 200)
ajoutTrad(reponse.data);
);
)();
);
//if (montrecomposant)
if (montreComposant)
return (
<div>
listeOuNon ? (
<div>
<div>le super titre trad</div>
<div>
<ul>
listes.map((elements: any) => (
<li>elements.text</li>
))
</ul>
</div>
</div>
) : (
<div>
<div>le super titre</div>
<div>Bonjour tout le monde</div>
</div>
)
</div>
);
else
return <></>;
;
//export default component;
我知道我应该使用Typescript接口系统,但我真的不知道如何实现它。 如果有打字稿专家,我会喜欢一些建议...
【问题讨论】:
【参考方案1】:您可以从更换道具开始。 useEffect
和 useState
调用不能放在 if 语句中,因此必须移动。
import FC from "react";
interface IProps
isLists: boolean;
lists: text: '' [];
show: boolean;
const MyComponent: FC<IProps> = (isLists, lists, show) =>
let listeOuNon = 0;
const [trad, ajoutTrad] = useState('');
useEffect(() =>
if (isLists)
(async () =>
axios.get("/api/trad").then((reponse) =>
if (reponse.status == 200)
ajoutTrad(reponse.data);
);
)();
, [isLists]);
if (!show)
return null;
return (
<div>
isLists ? (
<div>
<div>le super titre trad</div>
<div>
<ul>
listes.map((elements: any) => (
<li>elements.text</li>
))
</ul>
</div>
</div>
) : (
<div>
<div>le super titre</div>
<div>Bonjour tout le monde</div>
</div>
)
</div>
);
;
export default MyComponent;
【讨论】:
【参考方案2】:这是一个打字稿组件的简单示例
interface ComponentProps
organisationId: string;
const Component: React.FC<ComponentProps> = (props) =>
return ();
【讨论】:
【参考方案3】:您可以使用类型和/或接口:
import axios from "axios";
import useEffect, useState from "react";
interface List
// your fields here
type Props =
lists: List[];
isLists: boolean;
show: boolean;
export default const component = (props: Props) =>
//var listeOuNon = 0;
let listeOuNon = 0;
//var listes = props.lists;
const = props.lists;
listeOuNon = props.isLists;
//var montrecomposant = props.show;
const montreComposant = props.show;
if (listeOuNon)
//var [trad, ajoutTrad] = useState();
const [trad, ajoutTrad] = useState();
useEffect(() =>
(async () =>
axios.get("/api/trad").then((reponse) =>
if (reponse.status == 200)
ajoutTrad(reponse.data);
);
)();
);
//if (montrecomposant)
if (montreComposant)
return (
<div>
listeOuNon ? (
<div>
<div>le super titre trad</div>
<div>
<ul>
listes.map((elements: any) => (
<li>elements.text</li>
))
</ul>
</div>
</div>
) : (
<div>
<div>le super titre</div>
<div>Bonjour tout le monde</div>
</div>
)
</div>
);
else
return <></>;
;
【讨论】:
以上是关于使用 Typescript 创建 React 组件的主要内容,如果未能解决你的问题,请参考以下文章
如何为 React Native 嵌套组件创建 Typescript 定义
如何为无状态 React 组件创建 TypeScript 类型定义?
如何在 React 上正确使用带有样式组件画布的 TypeScript 类型
Typescript & React:在组件之间传递道具与默认道具
通过 React 高阶组件传递子道具的正确 TypeScript 类型
如何使用 Shebang Loader 配置 Webpack 以忽略 Hashbang 将 Cesium React 组件导入 Typescript React 组件