什么是React函数作为子组件

什么是React函数作为子组件(React functions As Children)

函数作为子组件是一种模式,允许你将渲染函数作为 Children 属性传递给组件,以便您可以更改可以作为子组件传递给组件的内容。


使用

当你使用Function作为子组件时,可以将子组件指定为函数,而不是传递JSX标记。

tsx 复制代码
    // index.tsx
    <Foo>
        {(name) => <div>`hello from ${name}`</div>}
    </Foo>

Foo组件应该长这样

tsx 复制代码
    // Foo.tsx
    const Foo = ({ children }) => {
        return children('foo')
    }

例子

将函数作为子组件的高级示例。

tsx 复制代码
    // PageWidth.tsx
import React from 'react'
class PageWidth extends React.Component {
  state = { width: 0 }
  componentDidMount() {
    this.setState({ width: window.innerWidth })
    window.addEventListener(
      'resize',
      ({ target }) => {
        this.setState({ width: target.innerWidth })
      }
    )
  }
  render() {
    const { width } = this.state
    //渲染传过来的函数
    return this.props.children(width)
  }
}

使用方式

tsx 复制代码
    // index.tsx
    <PageWidth>
        {(width) => <div>{width}</div>}
    </PageWidth>

正如在上面所看到的,children 被"重载"并作为函数传递给 PageWidth ,而不是按照自然的方式传递给 ReactNodeList 。 PageWidth 组件的 render 方法调用 this.props.children (传递宽度),该方法返回渲染的 JSX。

在此示例中可以看到渲染回调的真正威力。 PageWidth 将完成所有繁重的工作,而渲染的具体内容可能会发生变化,具体取决于传递的渲染函数。


其他使用方式

点击展开/折叠

tsx 复制代码
    //HTTPPOST.tsx
import { Component, ReactNode } from 'react';
import axios, { AxiosResponse } from 'axios';
interface Props<T> {
    url: string;//url
    condition: unknown;//参数
    loading?: ReactNode;//loading
    children: (data: T) => ReactNode;//渲染组件
    dataOperate: (data: T) => T;//数据处理
    error?: ReactNode;//错误渲染
}
interface State<T> {
    data: T;
    component: ReactNode;
}
export default class POST<T> extends Component<Props<T>, State<T>> {
    state: State<T> = {
        data: {} as T,
        component: this.props.loading || '',
    };
    async componentDidMount() {
        const { url, error, condition, children, dataOperate } = this.props;
        try {
            const result: AxiosResponse<T> = await axios.post(url, condition);
            const processedData: T = dataOperate(result.data);
            this.setState({
                data: processedData,
                component: children(processedData),
            });
        } catch (e) {
            this.setState({ component: error || 'error' });
            throw e;
        }
    }
    render() {
        return this.state.component;
    }
}

使用

tsx 复制代码
    //index.tsx
const props = {
    url: '123321',
    condition: {},
    loading: <span>loading 一下</span>,
    dataOperate: (data) => {
        return data.sort((a, b) => a - b);
    },
    error: <span>出错了!</span>,
}
 <HTTPPOST {...props}>
            {
                (data) => {
                    return data.map(item => {
                        <span>{item}</span>
                    })
                }
            }
</HTTPPOST>

转译自 reactpatterns

相关推荐
ZhengEnCi1 天前
React 19 加 Vite 6 企业级前端项目目录结构:无路由 SPA、zustand 与 Tailwind 4 的分层架构指南
react.js
用户298698530141 天前
React 前端实现 Excel 与 CSV 互转:基于 WebAssembly 的浏览器端方案
javascript·react.js·excel
Highcharts.js3 天前
Highcharts Orbit 完全指南:把每一张图表变成交互式分析工具
react.js·前端框架·highcharts·orbit·使用指南·ai 图表·交互式分析工具
鸿蒙开发3 天前
小程序存档写到一半怎么办?双槽保存与损坏恢复实战
前端·javascript·react.js
古茗前端团队5 天前
由 key 引发的思考
前端·javascript·react.js
用户298698530148 天前
React 前端将 Excel 工作表导出为图片的技术实践
javascript·react.js·excel
終不似少年遊*9 天前
【安全业务Agent】从场景到编排
python·react.js·ai·langchain·agent·安全架构·工作流
JavaPub-rodert10 天前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
Highcharts.js10 天前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
JudithHuang10 天前
React 嵌套路由与布局
前端·react.js·arcgis·react·react router