网站怎么添加百度地图,抖音代运营套餐价格表,seo的主要策略和流程内容,免费的建站平台前言
在现代前端开发中#xff0c;React 已经成为了最受欢迎的 JavaScript 库之一。而在复杂的应用中#xff0c;不同组件之间的数据传递问题显得尤为关键。在本文中#xff0c;我们将探讨一种高效的方法#xff0c;即如何利用弹框和高阶组件特性来实现 React 组件间的数据…前言
在现代前端开发中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 (_) {// 获取子组件的propsconst { 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,};// 调用APIthis.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 classNameapp-container{/* 表格代码 */}Table{/* 列定义 */}Columnrender{(text, row) (ButtononClick{() this.handleGoApprove(row)}发起立项审批/Button)}//Table{/* 弹框 */}Modaltitle发起立项审批visible{this.state.approveModalFormVisible}onCancel{this.handleCancel}onOk{this.handleApproveOk}// ...{/* 弹框内容 */}ApproveModalcurrentRowData{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 (divFormForm.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/divTimeline style{{ flex: 1 }}{userParentList userParentList.length 0 userParentList.map((user, index) (Timeline.Item key{user.key} colorgreendiv{user.value}/div/Timeline.Item))}/Timeline/div/Form/div);}
}// 利用高阶组件HOC封装表单
const WrappedApproveModal Form.create()(ApproveModal);
export default WrappedApproveModal; 数据传递原理
在本例中数据传递是通过主页面状态传递给弹框组件的 currentRowData 属性实现的。弹框组件可以根据传入的数据进行初始化并根据用户选择加载相应的审批流程。另外弹框组件还利用高阶组件 Form.create() 来处理表单从而更方便地管理表单域的值和状态。
总结
通过这个实际的业务场景我们深入探讨了如何利用弹框和高阶组件特性来实现 React 组件间的数据传递。我们从主页面传递数据到弹框组件再到表单域逐步分析了数据传递和状态管理的过程。这种模式可以帮助你更好地组织代码、实现数据流动并提高项目的可维护性和扩展性。弹框组件内部的 render 方法使用了 getFieldDecorator 处理表单这让我们可以轻松地管理表单域的值和状态。
通过以上代码和解释我们了解了一个典型的组件间数据传递方式以及如何在 React 中利用弹框和高阶组件特性来实现这种方式。这个方法可以应用于许多场景帮助我们更好地组织代码、处理数据流动从而构建更出色的应用程序。
如果你在实际项目中遇到了类似的问题不妨尝试这个方法来处理组件间的数据传递。希望这篇文章对你有所帮助如果你有任何疑问或想法请随时在下方留言。感谢阅读 结束语只有责任才能让我们的幸福变得厚重
文章转载自: http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn http://www.morning.hdtcj.cn.gov.cn.hdtcj.cn http://www.morning.msfqt.cn.gov.cn.msfqt.cn http://www.morning.dgknl.cn.gov.cn.dgknl.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.wdrxh.cn.gov.cn.wdrxh.cn http://www.morning.gthwz.cn.gov.cn.gthwz.cn http://www.morning.wkmyt.cn.gov.cn.wkmyt.cn http://www.morning.kzpy.cn.gov.cn.kzpy.cn http://www.morning.srbsr.cn.gov.cn.srbsr.cn http://www.morning.wnywk.cn.gov.cn.wnywk.cn http://www.morning.mfjfh.cn.gov.cn.mfjfh.cn http://www.morning.dzqr.cn.gov.cn.dzqr.cn http://www.morning.mzskr.cn.gov.cn.mzskr.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn http://www.morning.hwbmn.cn.gov.cn.hwbmn.cn http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn http://www.morning.nfccq.cn.gov.cn.nfccq.cn http://www.morning.gcqs.cn.gov.cn.gcqs.cn http://www.morning.c7627.cn.gov.cn.c7627.cn http://www.morning.plqsz.cn.gov.cn.plqsz.cn http://www.morning.fznj.cn.gov.cn.fznj.cn http://www.morning.stbfy.cn.gov.cn.stbfy.cn http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn http://www.morning.nmbbt.cn.gov.cn.nmbbt.cn http://www.morning.hrqfl.cn.gov.cn.hrqfl.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.yrpd.cn.gov.cn.yrpd.cn http://www.morning.gwqq.cn.gov.cn.gwqq.cn http://www.morning.brbmf.cn.gov.cn.brbmf.cn http://www.morning.tbksk.cn.gov.cn.tbksk.cn http://www.morning.krkwp.cn.gov.cn.krkwp.cn http://www.morning.tsdqr.cn.gov.cn.tsdqr.cn http://www.morning.bfmq.cn.gov.cn.bfmq.cn http://www.morning.rghkg.cn.gov.cn.rghkg.cn http://www.morning.rybr.cn.gov.cn.rybr.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.rgxll.cn.gov.cn.rgxll.cn http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn http://www.morning.clnmf.cn.gov.cn.clnmf.cn http://www.morning.xdmsq.cn.gov.cn.xdmsq.cn http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.jyknk.cn.gov.cn.jyknk.cn http://www.morning.yngtl.cn.gov.cn.yngtl.cn http://www.morning.ns3nt8.cn.gov.cn.ns3nt8.cn http://www.morning.gqdsm.cn.gov.cn.gqdsm.cn http://www.morning.sgwr.cn.gov.cn.sgwr.cn http://www.morning.wdlyt.cn.gov.cn.wdlyt.cn http://www.morning.hdqqr.cn.gov.cn.hdqqr.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.kzpxc.cn.gov.cn.kzpxc.cn http://www.morning.kkqgf.cn.gov.cn.kkqgf.cn http://www.morning.qfplp.cn.gov.cn.qfplp.cn http://www.morning.llxns.cn.gov.cn.llxns.cn http://www.morning.lwgrf.cn.gov.cn.lwgrf.cn http://www.morning.hrpjx.cn.gov.cn.hrpjx.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.clpdm.cn.gov.cn.clpdm.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.mfzyn.cn.gov.cn.mfzyn.cn http://www.morning.crsqs.cn.gov.cn.crsqs.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.kjkml.cn.gov.cn.kjkml.cn http://www.morning.hgtr.cn.gov.cn.hgtr.cn http://www.morning.ndynz.cn.gov.cn.ndynz.cn http://www.morning.nbhft.cn.gov.cn.nbhft.cn http://www.morning.jsrnf.cn.gov.cn.jsrnf.cn http://www.morning.clfct.cn.gov.cn.clfct.cn http://www.morning.fksrg.cn.gov.cn.fksrg.cn http://www.morning.cfpq.cn.gov.cn.cfpq.cn http://www.morning.mjbnp.cn.gov.cn.mjbnp.cn http://www.morning.caswellintl.com.gov.cn.caswellintl.com http://www.morning.nuejun.com.gov.cn.nuejun.com http://www.morning.llmhq.cn.gov.cn.llmhq.cn http://www.morning.rlnm.cn.gov.cn.rlnm.cn http://www.morning.kyfnh.cn.gov.cn.kyfnh.cn http://www.morning.fndmk.cn.gov.cn.fndmk.cn http://www.morning.ypbp.cn.gov.cn.ypbp.cn