React高阶函数使用

文章目录

  • 一、TypeScript创建组件
  • 二、高阶函数使用步骤
    • 1.创建interface,声明属性类型
    • 2.创建高阶函数
    • 3.在组件中使用
  • 三、总结

一、TypeScript创建组件

const Example = ()=>{
    
}
export default Example

二、使用步骤

1.创建interface,声明属性类型

//创建接口声明属性类型
interface MenuItemProps{
    title: string,
    content: string,
    icon: React.ReactNode,//可传入标签
}

const Example = ()=>{

}
export default Example

2.创建高阶函数

//创建接口声明属性类型
interface MenuItemProps{
    title: string,
    content: string,
    icon: React.ReactNode,//可传入标签
}
//高阶函数,可返回组件
function MenuItem(props:MenuItemProps){
    return <>
        <a>
            <h4>{props.title}</h4>
            <li className='ml-5'>{props.content}</li>
            <span className='mr-5'>{props.icon}</span>
        </a>
    </>
}
const Example = ()=>{

}
export default Example

3.在组件中使用

//创建接口声明属性类型
interface MenuItemProps{
    title: string,
    content: string,
    icon: React.ReactNode,//可传入标签
}
//高阶函数,可返回组件
function MenuItem(props:MenuItemProps){
    return <>
        <a>
            <h4>{props.title}</h4>
            <li className='ml-5'>{props.content}</li>
            <span className='mr-5'>{props.icon}</span>
        </a>
    </>
}
import {RedditOutlined} from '@ant-design/icons'
const Example = ()=>{
    const menuList = [
        {
            title: 'React',
            content: '高阶函数',
            icon : (<RedditOutlined/>),
        },
        {
            title: 'java',
            content: 'springBoot',
            icon : (<RedditOutlined/>),
        },
        {
            title: 'vue',
            content: '生命周期',
            icon : (<RedditOutlined/>),
        }
    ]
    return <>
        <div>
            {    
                menuList.map((item,index)=>{
                    {/* 高阶函数组件 */}
                    <MenuItem 
                        key={index}
                        title={item.title}
                        content={item.content}
                        icon={item.icon}
                    />
                })
            }
        </div>
    </>

}
export default Example

三、总结

  1.  本次使用图表组件<RedditOutlined/>,需下载 yarn add @ant-design/icons@5.x
  2. 无其他样式,需自行添加样式进行展示
React 高阶函数可以在许多场景中运用,以下是一些常见的应用示例: 1. 权限控制:通过高阶函数可以实现对组件的访问权限控制。例如,可以创建一个名为 `withAuth` 的高阶函数,它根据用户的登录状态来决定是否渲染原始组件。 ```jsx function withAuth(WrappedComponent) { return function WithAuth(props) { const isLoggedIn = checkUserLoginStatus(); // 检查用户登录状态的函数 if (isLoggedIn) { return <WrappedComponent {...props} />; } else { return <div>请先登录</div>; } } } const MyComponent = () => <div>需要登录才能看到的内容</div>; const AuthComponent = withAuth(MyComponent); // 使用增强后的组件 <AuthComponent /> ``` 2. 数据获取:通过高阶函数可以封装数据请求逻辑,使组件可以方便地获取数据并进行渲染。例如,可以创建一个名为 `withDataFetching` 的高阶函数,它负责从 API 获取数据,并将数据作为 props 传递给原始组件。 ```jsx function withDataFetching(WrappedComponent, url) { return function WithDataFetching(props) { const [data, setData] = useState(null); useEffect(() => { fetchData(); }, []); async function fetchData() { try { const response = await fetch(url); const jsonData = await response.json(); setData(jsonData); } catch (error) { console.error('Error fetching data:', error); } } return <WrappedComponent {...props} data={data} />; } } const MyComponent = ({ data }) => { if (!data) { return <div>Loading...</div>; } return ( <ul> {data.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> ); }; const DataComponent = withDataFetching(MyComponent, 'https://api.example.com/data'); // 使用增强后的组件 <DataComponent /> ``` 3. 状态管理:通过高阶函数可以封装一些公共状态,使多个组件可以共享该状态。例如,可以创建一个名为 `withTheme` 的高阶函数,它将主题信息作为 props 传递给原始组件。 ```jsx function withTheme(WrappedComponent) { return function WithTheme(props) { const theme = useContext(ThemeContext); // 使用 Context 获取主题信息 return <WrappedComponent {...props} theme={theme} />; } } const MyComponent = ({ theme }) => ( <div style={{ background: theme.background, color: theme.text }}> 主题样式 </div> ); const ThemedComponent = withTheme(MyComponent); // 使用增强后的组件 <ThemedComponent /> ``` 这些只是一些常见的应用场景,实际上,React 高阶函数非常灵活,可以根据具体需求来定义和使用。它们可以帮助我们在不改变原始组件的情况下,增加、修改或封装组件的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十二楼A02

感谢投喂,我会继续努力的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值