React组件间数据传递(弹框和高阶组件(HOC)特性实现)

这篇具有很好参考价值的文章主要介绍了React组件间数据传递(弹框和高阶组件(HOC)特性实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在现代前端开发中,React 已经成为了最受欢迎的 JavaScript 库之一。而在复杂的应用中,不同组件之间的数据传递问题显得尤为关键。在本文中,我们将探讨一种高效的方法,即如何利用弹框和高阶组件特性来实现 React 组件间的数据传递。我们将通过一个具体的业务场景来深入讲解

业务场景介绍

假设我们正在开发一个项目管理系统,其中一个关键功能是发起项目立项审批。在主页面上,用户可以看到一张项目列表,每个项目都带有一个“发起审批”按钮。点击该按钮后,一个弹框将显示,允许用户选择公司部门并查看相关的审批流程。在这个过程中,我们需要实现从主页面向弹框组件传递数据,并根据用户的选择加载相关的审批流程。

主页面代码

首先,我们有一个名为 ProjectManagement 的主页面组件。在这个组件中,我们为每个项目都添加了一个“发起审批”按钮,点击该按钮会触发 handleGoApprove 方法,将项目数据传递给弹框组件,弹框组件点击确认按钮触发handleApproveOk方法调用后端接口。

// 主页面代码
import React, { Component } from "react";
import {
  Table,
  Form,
  Button,
  Input,
  Collapse,
  Pagination,
  Divider,
  message,
  Modal,
} from "antd";
// ...
const { Column } = Table;
const { Panel } = Collapse;
const { confirm } = Modal;
class ProjectManagement extends Component {
  // ... 其他状态和方法 ...

  // 处理发起审批按钮点击
  handleGoApprove = (row) => {
    // 更新状态,传递数据到弹框组件
    this.setState({
      currentRowData: Object.assign({}, row),
      approveModalFormVisible: true,
      // ...
    });
  };
  // 处理子组件确认提交按钮
  handleApproveOk = (_) => {
    // 获取子组件的props
    const { form } = this.approveItemFormRef.props;
    form.validateFields((err, fieldsValue) => {
      if (err) {
        return;
      }
      // 获取API所需的参数
      const projectId = form.getFieldValue("projectId");
      const selectedCompany = form.getFieldValue("departCompany");
      const values = {
        ...fieldsValue,
        projectId: projectId,
        selectedCompany: selectedCompany,
      };
      // 调用API
      this.setState({ approveModalFormLoading: true });
      toApprove(values)
        .then((response) => {
          form.resetFields();
          this.setState({ approveModalFormVisible: false, approveModalFormLoading: false });
          message.success("发起成功!");
          this.fetchData();
        })
        .catch((e) => {
          message.success("发起失败,请重试!");
          this.setState({ approveModalFormLoading: false });
        });
    });
  };
  // ... 其他渲染逻辑 ...

  render() {
    return (
      <div className="app-container">
        {/* 表格代码 */}
        <Table>
          {/* 列定义 */}
          <Column
            render={(text, row) => (
              <Button
                onClick={() => this.handleGoApprove(row)}
              >
                发起立项审批
              </Button>
            )}
          />
        </Table>

        {/* 弹框 */}
        <Modal
          title="发起立项审批"
          visible={this.state.approveModalFormVisible}
          onCancel={this.handleCancel}
          onOk={this.handleApproveOk}
          // ...
        >
          {/* 弹框内容 */}
          <ApproveModal
            currentRowData={this.state.currentRowData}
            wrappedComponentRef={(formRef) => (this.approveItemFormRef = formRef)}
            // ...
          />
        </Modal>
      </div>
    );
  }
}

弹框组件代码

接下来,让我们看看弹框组件 ApproveModal 的代码。在 componentWillMount 生命周期中,我们根据传入的 currentRowData 获取项目数据,并在状态中初始化相关信息。然后,通过 getDepartLevelByUser 方法获取部门层级信息,并将数据存储在状态中。

class ApproveModal extends Component {
  state = {
        userParentList: [],
        departCompanyList: [],
        selectedCompany: '', // 用于存储选中的公司
        projectId: '',
  }
  componentWillMount() {
    const { currentRowData } = this.props;
    const projectId = currentRowData.id;
    const departmentManager = currentRowData.departmentManager;

    // 根据当前行数据初始化状态
    this.setState({
      projectId: projectId,
    });

    // 获取部门层级信息并初始化状态
    this.getDepartLevelByUser(departmentManager);
  }

  getDepartLevelByUser = (value) => {
    // 使用API获取部门层级数据
    getDepartLevelByUser(value).then((response) => {
      const { data } = response.data;
      this.setState(
        {
          departCompanyList: data,
        },
        () => {
          // 在状态更新后,检查 departCompanyList 是否有记录
          if (this.state.departCompanyList.length > 0) {
            // 默认填充第一条记录的值
            const selectedCompany = this.state.departCompanyList[0].company;
            this.setState(
              {
                selectedCompany: selectedCompany,
              },
              () => {
                // 在设置 selectedCompany 后触发 onChange 事件
                this.handleDepartCompanySelect(selectedCompany);
              }
            );
          }
        }
      );
    });
  }

  // ... 其他逻辑 ...

  render() {
    // 使用 getFieldDecorator 处理表单
    const { getFieldDecorator } = this.props.form;
   const { projectId, selectedCompany, userParentList } = this.state;

    return (
      <div>
        <Form>
          <Form.Item>
            {getFieldDecorator("departCompany", {
              initialValue: selectedCompany,
              // ...
            })(
              <Select onChange={this.handleDepartCompanySelect} value={selectedCompany}>
                {/* 渲染部门选项 */}
                {departCompanyList.map((item) => (
                  <Select.Option key={item.company} value={item.company}>
                    {item.company}
                  </Select.Option>
                ))}
              </Select>
            )}
          </Form.Item>

          {/* 审批流程 */}
          <div style={{ display: this.state.selectedCompany ? 'flex' : 'none', alignItems: 'flex-start' }}>
               <div style={{ marginRight: '20px' }}>
                   <h4 style={{ margin: 0 }}>【审批流程】:</h4>
               </div>
               <Timeline style={{ flex: 1 }}>
                   {userParentList && userParentList.length > 0 && userParentList.map((user, index) => (
                       <Timeline.Item key={user.key} color="green">
                           <div>
                               {user.value}
                           </div>
                       </Timeline.Item>
                   ))}
               </Timeline>
           </div>
        </Form>
      </div>
    );
  }
}

// 利用高阶组件(HOC)封装表单
const WrappedApproveModal = Form.create()(ApproveModal);
export default WrappedApproveModal;

React组件间数据传递(弹框和高阶组件(HOC)特性实现),React,react.js,javascript,前端

数据传递原理

在本例中,数据传递是通过主页面状态传递给弹框组件的 currentRowData 属性实现的。弹框组件可以根据传入的数据进行初始化,并根据用户选择加载相应的审批流程。另外,弹框组件还利用高阶组件 Form.create() 来处理表单,从而更方便地管理表单域的值和状态。

总结

通过这个实际的业务场景,我们深入探讨了如何利用弹框和高阶组件特性来实现 React 组件间的数据传递。我们从主页面传递数据到弹框组件,再到表单域,逐步分析了数据传递和状态管理的过程。这种模式可以帮助你更好地组织代码、实现数据流动,并提高项目的可维护性和扩展性。弹框组件内部的 render 方法使用了 getFieldDecorator 处理表单,这让我们可以轻松地管理表单域的值和状态。

通过以上代码和解释,我们了解了一个典型的组件间数据传递方式,以及如何在 React 中利用弹框和高阶组件特性来实现这种方式。这个方法可以应用于许多场景,帮助我们更好地组织代码、处理数据流动,从而构建更出色的应用程序。

如果你在实际项目中遇到了类似的问题,不妨尝试这个方法来处理组件间的数据传递。希望这篇文章对你有所帮助,如果你有任何疑问或想法,请随时在下方留言。感谢阅读!

结束语:只有责任才能让我们的幸福变得厚重文章来源地址https://www.toymoban.com/news/detail-671229.html

到了这里,关于React组件间数据传递(弹框和高阶组件(HOC)特性实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【react】记录一次react组件props依赖异步数据(setFieldsValue)后传递form给子组件,再逐层传递给孙子组件引起的未渲染异常

    背景 react祖父组件设置异步数据(setFieldsValue)后传递form给子组件,再逐层传递给孙子组件引起的未渲染异常,孙子组件如果不设置useEffect和useState去监听value的值进行重渲染,会出现获取得到value最新值,但是不进行渲染的异常 解决前后的代码对比 完整代码(异常): 完整

    2024年01月17日
    浏览(48)
  • 【react】使用context进行跨级组件数据传递

    官方文档:使用 Context 深层传递参数、useContext 应用:无需为每层组件手动添加 props,能狗在组件树间进行数据传递的方法。 1、创建context ContextProvider.tsx: 要更新 context,请将其与 state 结合。在父组件中声明一个状态变量,并将当前状态作为 context value 传递给 provider。 上述写

    2024年01月25日
    浏览(40)
  • 在 React 中,props(属性)用于在组件之间传递数据

    在 React 中,props(属性)用于在组件之间传递数据。它是父组件向子组件传递信息的一种方式,通过 props,父组件可以向子组件传递数据、回调函数、配置项等。 注意: props 是只读的,它的值由父组件传递给子组件时确定,并且在子组件中不能直接修改。如果子组件需要改

    2024年02月15日
    浏览(52)
  • 高阶组件/react组件复用

                               

    2024年02月13日
    浏览(41)
  • 【React】组件性能优化、高阶组件

    React更新机制 ◼ React在props或state发生改变时,会调用React的render方法,会创建一颗不同的树。 ◼ React需要基于这两颗不同的树之间的差别来判断如何有效的更新UI: ​  如果一棵树参考另外一棵树进行完全比较更新,那么即使是最先进的算法,该算法的复杂程度为 O(n³),其

    2024年01月23日
    浏览(43)
  • React的高阶组件详解

    高阶组件基本介绍 什么是高阶组件呢? 在认识高阶组价之前, 我们先来回顾一下什么是高阶函数? 相信很多同学都知道(听说过?),也用过高阶函数 高阶组件和高阶函数它们非常相似的 高阶函数的定义, 至少满足以下条件之一: 接受一个或多个函数作为参数; 返回一个新的函数

    2024年02月01日
    浏览(49)
  • react-高阶组件

    高阶组件( Higher-Order Component,HOC )是一个以 组件作为参数 ,返回一个 新组件 的 函数 。 高阶组件最大的特点就是 复用组件逻辑 高阶组件本身并不是 React 的 API,而是React组件的一种设计模式,一种组件重用的 高级技巧 高阶组件是一个 函数 ,接收要包装的组件,返回增

    2024年02月07日
    浏览(38)
  • React:高阶组件|ref转发

            参考文档:高阶组件 – React (reactjs.org)         高阶组件(Higher-Order Components,简称  HOC )是React中用于复用组件逻辑的一种高级技巧。具体而言: 高阶组件是参数为组件,返回值为新组件的函数 。         组件是将 props 转换为 UI,而高阶组件是将组件转换

    2024年02月21日
    浏览(43)
  • React - 你使用过高阶组件吗

    难度级别:初级及以上                                 提问概率:55%  高阶组件并不能单纯的说它是一个函数,或是一个组件,在React中,函数也可以做为一种组件。而高阶组件就是将一个组件做为入参,被传入一个函数或者组件中,经过一定的加工处理,最

    2024年04月16日
    浏览(45)
  • uniapp及微信小程序封装全局网络请求,弹框和hint提示

    今天分享一下uniapp项目的网络请求如何封装,不知道大家开发微信小程序项目是用什么开发工具,我个人更喜欢用uniapp,无论是从项目扩展方向还是开发效率来说,uniapp都是首选。 1:创建一个项目工具库,http.js 在vite.config.js文件中配置跨域 这样,一个全局网络请求工具就完

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包