网易首页 > 网易号 > 正文 申请入驻

web前端培训React 泛型组件

0
分享至

以下文章来源于方应杭讲编程

案例

假设我们要做一个很简单的 Show 组件,用法如下:

content="hi"

onClick={c => console.log(c)}

Show 组件会展示 content,并在用户点击 content 时把 content 传给 onClick。

因此代码中的 c 和 content 总是相等的。

你会如何实现 Show 组件呢?假设你是这么写的:

interface Props{

content: any

onClick?: (arg: any) => void

function Show(props: Props){

const {content, onClick} = props

return (

{content}

onClick={()=> onClick?.(content)}

Click me

确实能完成功能,但是用到了两个 any,这不是 TypeScript,这是 AnyScript。

改写

于是你可以打算进行改写,你发现 content 和 onClick 的参数其实总是一样的,于是你写成这样:

interface Props

content: T

onClick?: (arg: T) => void

但此时,Show 报错了:

报错内容是 Props 需要接受一个参数 T,于是你让 Show 接受一个参数 T,再把 T 传给 Props:

function Show

(props: Props

报错消除了。

于是 Show 组件就可以这样用了:

content="hi"

onClick={c => console.log(c)}/>

由于 TypeScript 有自动推断功能,所以可以从 content 自动推断出 T = string,所以可以简写成这样:

content="hi"

onClick={c => console.log(c)}/>

这种写法跟最开始的写法一模一样,【关注尚硅谷,轻松学IT】但是我们得到了一个大好处:c 的类型不再是 any 了,而是跟 content 保持一致:

以上,就是泛型组件的简单演示。

不过值得注意的是,上面的 Show 被我声明为普通函数,并没有被声明为 React.FunctionComponent,因为一旦声明成 React.FunctionComponent,就没法再加泛型了。

另外,如果你喜欢用 Class 组件,那么可以把 Show 组件写成这样:

class Show

extends Component

render(){

return (

{this.props.content}

onClick={

()=> this.props.onClick?.(this.props.content)}

Click me

export default function App() {

return (

console.log(c)} />

实际场景

在实际工作中,我们什么时候会遇到泛型组件呢?这里有一个典型的例子:Table 组件。

假设我们的 Table 组件是这样用的:

data={[

{id:1, name:'Alice',age:16,gender:'女'},

{id:2, name:'Bob',age:16,gender:'男'},

{id:3, name:'Carry',age:16,gender:'男'},

cols={[

{key:'name', title:'姓名'},

{key:'age', title:'年龄'}

三条数据,只展示 name 和 age,我们如何确保 cols 里的 key 一定是 data 里面的字段名呢?

用泛型即可:

interface Props

data: T[],

cols: {

key: keyof T // cols 的 key 必须是 data item 的字段名

title: string

function Table

(props: Props

const {data, cols} = props

return (

{data.map(d =>

{cols.map(c =>

{d[c.key]}

也就是说,当你需要两个 props 的类型有关联的时候,www.atguigu.com 往往可以使用泛型组件来实现。

不解

不过目前我很疑惑下面这段代码翻译成 TypeScript 是怎样的:

虽然我知道这段代码翻译成 JavaScript 是

React.createElement(Show)

// 或

_jsx(Show)

但我并不知道翻译成 TypeScript 应该怎么写,尤其是会被放在哪。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
复杂的黎巴嫩,走投无路的真主党

复杂的黎巴嫩,走投无路的真主党

寰宇大观察
2026-04-17 17:36:11
申花3:1铁人,黄健翔犀利点评:外援太丝滑,却揪出门将最大隐患

申花3:1铁人,黄健翔犀利点评:外援太丝滑,却揪出门将最大隐患

晚雾空青
2026-04-19 02:32:45
卫冕冠军泰州被徐州3:0血洗,苏北五虎专治各种不服!

卫冕冠军泰州被徐州3:0血洗,苏北五虎专治各种不服!

锡望
2026-04-18 22:24:06
济南19日傍晚将迎强对流天气!小到中雨伴有雷电,降温8℃~10℃,局部阵风10级

济南19日傍晚将迎强对流天气!小到中雨伴有雷电,降温8℃~10℃,局部阵风10级

鲁中晨报
2026-04-18 18:16:10
苏超一家独大,多少地方文旅成了陪跑?

苏超一家独大,多少地方文旅成了陪跑?

环球旅讯
2026-04-17 08:08:52
老婆新婚夜不让碰,我心冷上了高原,一年后她抱着孩子来探亲

老婆新婚夜不让碰,我心冷上了高原,一年后她抱着孩子来探亲

红豆讲堂
2026-02-11 17:55:07
还能活多久,看体重就知?医生强调:上了年纪的人,体重这些刚好

还能活多久,看体重就知?医生强调:上了年纪的人,体重这些刚好

医学科普汇
2026-04-18 17:05:51
胡锡进给沃尔沃汽车做广告,评论区全翻车了……

胡锡进给沃尔沃汽车做广告,评论区全翻车了……

麦杰逊
2026-04-17 11:51:26
震惊!“首位背刺张雪峰之人”,大鹏公开贬低前东家、低价挖资源

震惊!“首位背刺张雪峰之人”,大鹏公开贬低前东家、低价挖资源

火山詩话
2026-04-16 06:02:23
太惨了!成都这个板块又跌了20%!

太惨了!成都这个板块又跌了20%!

楼市灭霸
2026-04-18 16:45:57
女生主动起来有多黏人?网友:这些女的太开放了

女生主动起来有多黏人?网友:这些女的太开放了

带你感受人间冷暖
2026-01-27 00:20:06
海军预备役杀妻藏尸冰柜,逃亡两月海外落网

海军预备役杀妻藏尸冰柜,逃亡两月海外落网

追星雷达站
2026-04-17 09:26:20
许家印认罪,人民日报称呼变11字释放不寻常信号

许家印认罪,人民日报称呼变11字释放不寻常信号

未来已来风云变幻
2026-04-19 04:32:30
八国联军中,有七国主动退还赔款,唯独一国分文不退,是哪个?

八国联军中,有七国主动退还赔款,唯独一国分文不退,是哪个?

千秋文化
2025-03-28 10:37:53
高市要哭了:花了30年才当上首相,却连打4通电话,要求伊朗放人

高市要哭了:花了30年才当上首相,却连打4通电话,要求伊朗放人

云舟史策
2026-04-19 07:25:45
民企贪腐,参照公职入罪标准,有何深意?

民企贪腐,参照公职入罪标准,有何深意?

中国新闻周刊
2026-04-18 12:07:25
1-0!卡帅专打强队+曼联领先切尔西10分,热刺15轮不胜保级难了

1-0!卡帅专打强队+曼联领先切尔西10分,热刺15轮不胜保级难了

体育知多少
2026-04-19 06:33:19
照母山近十年首个豪宅开盘,两小时宣告售罄?现场惊爆大瓜

照母山近十年首个豪宅开盘,两小时宣告售罄?现场惊爆大瓜

小树聊房
2026-04-18 21:54:43
伊能静长文控诉!十年没二人世界,她抑郁是秦昊缺位还是自作自受

伊能静长文控诉!十年没二人世界,她抑郁是秦昊缺位还是自作自受

郭蛹包工头
2026-04-17 14:14:44
卡里克治下曼联近12场英超8胜,与本赛季前21场赢球场次持平

卡里克治下曼联近12场英超8胜,与本赛季前21场赢球场次持平

懂球帝
2026-04-19 07:27:03
2026-04-19 08:19:00
IT爱好者小尚
IT爱好者小尚
分享IT教育类信息
630文章数 55关注度
往期回顾 全部

科技要闻

传Meta下月拟裁8000 大举清退人力为AI腾位

头条要闻

媒体:特朗普对伊朗发动攻击 美国遭遇四大挫败

头条要闻

媒体:特朗普对伊朗发动攻击 美国遭遇四大挫败

体育要闻

时隔25年重返英超!没有人再嘲笑他了

娱乐要闻

刘德华回应潘宏彬去世,拒谈丧礼细节

财经要闻

"影子万科"2.0:管理层如何吸血万物云?

汽车要闻

奇瑞威麟R08 PRO正式上市 售价14.48万元起

态度原创

家居
手机
数码
公开课
军事航空

家居要闻

法式线条 时光静淌

手机要闻

华为Pura X Max:被曝24日开卖!华为Pura 90:发售日成谜!

数码要闻

华为版的科技春晚来了!Pura 90/Pura X Max下周发:阵容豪华

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

解放军护卫舰与外舰缠斗20小时 细节披露

无障碍浏览 进入关怀版