当前位置: 首页 > article >正文

表单的前端数据流向

在CRM项目中,会涉及很多张表单。每张表单的前端代码都会放在一个单独的文件夹中。这个文件夹下包含三个文件,分别是:

  1. index.js(以下称为 index):负责组件的渲染和交互逻辑。
  2. model.js(以下称为 model):负责状态管理和业务逻辑。
  3. service.js(以下称为 service):负责接口的定义和调用。
数据流向
  • index 调用 model 的方法。
  • model 的方法中会调用 service 的接口。
  • service 文件定义了与表单相关的所有接口。
状态管理的设计

在项目中,状态变量可以存在于 index 和 model 中,但状态变量的归属并不是固定的,而是根据具体的需求来决定。状态变量的类型可以分为以下两种:

  1. 控制组件展示的状态变量
    用于控制组件的隐藏、显示等 UI 状态。

  2. 控制数据展示的状态变量
    用于存储表单的输入值、接口返回的数据等业务状态。

状态变量的使用和更新
  1. 状态变量的使用

    • index 可以使用自己的状态变量(通过 this.state.状态变量)或 model 的状态变量(通过 this.props.状态变量)。
    • model 的状态变量可以通过 index 的 props 获取,但 model 不直接使用 index 的状态变量。
  2. 状态变量的更新

    • index 的状态变量通过 this.setState({状态变量: 值}) 更新。
    • model 的状态变量可以通过 index 或 model 自身调用 actions.业务对象名字.updateState({状态变量: 值}) 的方式更新。
交互逻辑

在表单页面中,每次用户点击或触发交互时,会调用对应的方法。这些方法的执行逻辑如下:

  1. 调用接口获取数据(通过 service)。
  2. 根据接口返回的数据更新状态变量(通过 actions.updateState 方法)。
  3. 状态变量的改变会触发组件的重新渲染,从而实现组件的展示或数据的更新。

举个例子,当我点击“分配”按钮中的分配负责人的时候,前端代码的逻辑是这样的:

1. index.js 文件

在 index.js 文件中,主要处理用户交互逻辑。以下是 Buttons 组件的定义和事件绑定:

<ButtonsbuttonTpl={listBtnsTpl} // 按钮模板onClick={this.listBtnsClick} // 点击事件处理函数
/>
  • Buttons 组件:一个通用按钮组件,通过 buttonTpl 属性传入按钮配置模板,通过 onClick 属性绑定点击事件处理函数。
  • listBtnsClick 方法:处理按钮点击事件,根据不同的按钮类型执行不同的逻辑。

以下是 listBtnsClick 方法的代码:

listBtnsClick(clickBtn, belongBtn) {const clickedKey = _.get(clickBtn, "key"); // 获取点击按钮的 keyconst belongBtnKey = _.get(belongBtn, "key"); // 获取所属按钮的 keyif (belongBtnKey === "add") {// 新增操作let obj = belongBtn.comp.filter(item => item.key == clickBtn.key);obj = obj ? obj[0] : {};_this.onClickNew({custChanTypeName: obj.name,custChanTypeId: obj.key});} else if (clickedKey === "add") {// 特殊新增操作if (clickBtn?.comp?.length === 1) {_this.onClickNew({custChanTypeName: _.get(clickBtn, "comp[0].name", ""),custChanTypeId: _.get(clickBtn, "comp[0].key", "")});}} else if (belongBtnKey === "distribute") {// 分配操作if (!_this.state.selectedRowKeys.length) {Warning("请选择客户"); // 如果没有选择客户,弹出警告return;}let assignObj = belongBtn.comp.filter(item => item.key == clickBtn.key);_this.showAssign(assignObj[0].key); // 调用分配方法} else if (belongBtnKey === "recycle") {// 回收操作if (!_this.state.selectedRowKeys.length) {Warning("请选择客户"); // 如果没有选择客户,弹出警告return;}let assignObj = belongBtn.comp.filter(item => item.key == clickBtn.key);_this.showAssign(assignObj[0].key); // 调用回收方法}
}
  • 逻辑说明
    • 根据 belongBtnKey 和 clickedKey 判断按钮的类型,执行不同的操作。
    • 分支逻辑包括新增、分配、回收等功能。
    • 调用对应的方法(如 onClickNew 或 showAssign)完成具体操作。

在 listBtnsClick 方法中,当按钮类型为 "分配" 或 "回收" 时,会调用 showAssign 方法。以下是 showAssign 方法的代码:

showAssign(key) {let assNum = key.match(/\d+/) ? key.match(/\d+/)[0] - 1 : 0; // 提取数字并减一let dispatchCustomer = this.state.selectedRowKeys; // 获取选中的客户if (!dispatchCustomer.length) {Warning("请选择客户"); // 如果没有选中客户,弹出警告return;}let param = { customerId: dispatchCustomer[0].id }; // 构造请求参数actions.customerhome.dispatchResponsiblesByCustomerId(param).then(resultData => {// 调用 model 中的方法,获取数据console.log(JSON.stringify(resultData, null, 2) + " resultData2222");// 遍历返回数据,新增字段const updatedDispatchList = resultData.map(item => ({...item,personId: item.staffUserId,personName: item.staffUserName,personCode: item.staffUserCode}));// 去重逻辑:只保留 personId 唯一的对象const uniqueDispatchList = updatedDispatchList.reduce((acc, current) => {if (!acc.find(item => item.personId === current.personId)) {acc.push(current);}return acc;}, []);console.log(JSON.stringify(updatedDispatchList, null, 2) + " updatedDispatchList");// 更新组件状态this.setState({dispatchList: uniqueDispatchList // 更新 dispatchList});// 更新 model 状态actions.customerhome.updateState({assignVisiable: true,clickAssign: key,dispatchRange: assNum});});
}
  • 逻辑说明
    • 提取 key 中的数字,用于计算分配范围。
    • 获取选中的客户 ID,构造请求参数 param
    • 调用 model 文件中的方法 dispatchResponsiblesByCustomerId 发起接口请求。
    • 对接口返回的数据进行处理:
      • 新增字段(如 personIdpersonName)。
      • 去重处理,确保 personId 唯一。
    • 更新组件的 state 和 model 的状态。

2. model.js 文件

在 model.js 文件中,封装了具体的业务逻辑。以下是 dispatchResponsiblesByCustomerId 方法的代码:

async dispatchResponsiblesByCustomerId(param) {let result = await api.dispatchResponsiblesByCustomerId(param); // 调用接口if (result && result.data) {var resultData = result.data; // 提取数据return resultData; // 返回处理后的数据}
}
  • 逻辑说明
    • 使用 async/await 处理异步请求。
    • 调用 service.js 文件中的 dispatchResponsiblesByCustomerId 方法发起接口请求。
    • 提取接口返回的数据并返回给调用方。

3. service.js 文件

在 service.js 文件中,定义了接口调用的具体实现。以下是 dispatchResponsiblesByCustomerId 方法的代码:

/*** 客户分配中,根据客户ID找到客户对应的负责人的信息* @param {*} params*/
export const dispatchResponsiblesByCustomerId = param => {return requestSec(URL.DISTRIBUTE_RESPONSIBLE_URL, {method: "get",param});
};
  • 逻辑说明
    • 使用 requestSec 方法发起 HTTP 请求。
    • 请求方法为 GET,参数为 param
    • 返回后端接口的数据。

相关文章:

表单的前端数据流向

在CRM项目中&#xff0c;会涉及很多张表单。每张表单的前端代码都会放在一个单独的文件夹中。这个文件夹下包含三个文件&#xff0c;分别是&#xff1a; index.js&#xff08;以下称为 index&#xff09;&#xff1a;负责组件的渲染和交互逻辑。model.js&#xff08;以下称为 …...

PP-ChatOCRv3新升级:多页PDF信息抽取支持自定义提示词工程,拓展大语言模型功能边界

文本图像信息抽取技术在自动化办公、建筑工程、教育科研、金融风控、医疗健康等行业领域具有广泛应用场景。2024年9月&#xff0c;飞桨低代码开发工具PaddleX中新增文本图像智能产线PP-ChatOCRv3&#xff0c;充分结合PaddleOCR的文本图像版面解析能力和文心一言语言理解优势&am…...

《二叉树:二叉树的顺序结构->堆》

二叉树一般可以使用两种结构存储&#xff0c;一种是顺序结构&#xff0c;一种是链式结构。 顺序存储 顺序结构存储是使用数组来存储&#xff0c;一般使用数组只适合表示完全二叉树&#xff0c;因为不是完全二叉树会有空间的浪费。实际上使用中只有堆才会使用数组来存储。二叉…...

OpenLayers:封装Overlay的方法

平时在使用OpenLayers的Overlay时常感觉不便&#xff0c;于是最近我便封装了一些Overlay增删改查的方法&#xff0c;以提高可用性。这边文章中我会介绍我封装的方法&#xff0c;同时记录这个过程中踩的一些坑。 添加Overlay /*** abstract 添加overlay* param {*} map* param…...

软件重构与项目进度的矛盾如何解决

软件重构与项目进度之间的矛盾可以通过明确重构目标与范围、采用渐进式重构策略、优化项目管理流程、提高团队沟通效率、建立重构意识文化等方式解决。其中&#xff0c;采用渐进式重构策略尤为关键。渐进式重构是指在日常开发过程中&#xff0c;以小步骤持续进行重构&#xff0…...

Mysql+Demo 获取当前日期时间的方式

记录一下使用Mysql获取当前日期时间的方式 获取当前完整的日期时间有常见的四种方式&#xff0c;获取得到的默认格式(mysql的格式标准)是 %Y-%m-%d %H:%i:%s其它格式 %Y-%m-%d %H:%i:%s.%f方式一&#xff1a;now()函数 select now();mysql> select now(); -------------…...

数智化时代下开源AI大模型驱动的新型商业生态构建——基于AI智能名片与S2B2C商城小程序的融合创新研究

摘要 数字技术的指数级发展推动物理世界向数智化网状结构加速转型&#xff0c;传统商业逻辑面临系统性重构。本文以"开源AI大模型AI智能名片S2B2C商城小程序"为研究主体&#xff0c;采用案例分析与技术验证相结合的方法&#xff0c;揭示技术融合对商业生态的重塑机制…...

Spring Cloud Alibaba 技术全景与实战指南

简介&#xff1a; Spring Cloud Alibaba 是阿里巴巴开源的微服务解决方案&#xff0c;基于 Spring Cloud 标准构建&#xff0c;提供了一站式分布式系统开发能力。它深度整合阿里云生态组件&#xff0c;为企业级微服务架构提供高可用、高性能的技术支撑。 核心特性 全栈微服务能…...

回归预测 | Matlab实现NRBO-Transformer-BiLSTM多输入单输出回归预测

回归预测 | Matlab实现NRBO-Transformer-BiLSTM多输入单输出回归预测 目录 回归预测 | Matlab实现NRBO-Transformer-BiLSTM多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【JCR一区级】Matlab实现NRBO-Transformer-BiLSTM多变量回归预测&#xf…...

了解 PoE 握手协议在网络配电中的重要性

在现代网络领域&#xff0c;以太网供电(PoE)已成为一项革命性的技术&#xff0c;通过在一根以太网电缆上集成电力和数据传输&#xff0c;简化了网络连接设备的部署和管理。这种无缝操作的核心是 PoE 握手 —— 一个促进支持PoE 的设备之间的通信、确保高效供电和保护网络基础设…...

小智机器人相关函数解析,BackgroundTask::Schedule (***)将一个回调函数添加到后台任务队列中等待执行

以下是对 BackgroundTask::Schedule 函数代码的详细解释&#xff1a; void BackgroundTask::Schedule(std::function<void()> callback) {std::lock_guard<std::mutex> lock(mutex_);if (active_tasks_ > 30) {int free_sram heap_caps_get_free_size(MALLOC_…...

基于Python设计的TEQC数据质量可视化分析软件

标题:基于Python设计的TEQC数据质量可视化分析软件 内容:1.摘要 本文旨在设计一款基于Python的TEQC数据质量可视化分析软件。随着全球导航卫星系统&#xff08;GNSS&#xff09;的广泛应用&#xff0c;数据质量的评估变得至关重要。TEQC&#xff08;TransEditQualityCheck&…...

人月神话:如何有效的避免Bug的产生

bug的来源有很多种&#xff0c;一般的小bug很好修复&#xff0c;最头疼的是哪些致命且难以察觉的Bug。这些bug从哪来的&#xff1f; 在人月神话书中说&#xff1a;假设的不匹配是大多数致命和难以察觉的bug的主要来源。 假设来源于各个组成部分的开发者对概念的理解不一致。 为…...

Git的基础使用方法

本文最终功能&#xff1a; 1.从终端直接传输代码给仓库 2.用终端从仓库克隆文件 基本概念 我们先来理解下 Git 工作区、暂存区和版本库概念&#xff1a; 工作区&#xff1a;就是你在电脑里能看到的目录。 暂存区&#xff1a;英文叫 stage 或 index。一般存放在 .git 目录下的…...

轮胎厂相关笔记

一、术语 图解&#xff1a;https://news.yiche.com/hao/wenzhang/38498703/ 1、胚胎 在轮胎制造行业中&#xff0c;“胎胚”&#xff08;也称“生胎”或“未硫化轮胎”&#xff09;是指轮胎在硫化&#xff08;高温高压固化&#xff09;之前的半成品形态。它是轮胎成型的中间…...

Java常用异步方式总结

使用建议 完整代码见https://gitee.com/pinetree-cpu/parent-demon 提供了postMan调试json文件于security-demo/src/main/resources/test_file/java-async.postman_collection.json 可导入postMan中进行调试 Java异步方式以及使用场景 继承Thread类 新建三个类继承Thread&…...

【Easylive】视频在线人数统计系统实现详解 WebSocket 及其在在线人数统计中的应用

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 视频在线人数统计系统实现详解 1. 系统架构概述 您实现的是一个基于Redis的视频在线人数统计系统&#xff0c;主要包含以下组件&#xff1a; 心跳上报接口&#xff1a;客户端定期调用以…...

tomcat 目录结构组成

文章目录 背景文件结构层级一些常用的路径 背景 现在非常多的 java web 服务部署在 linux 服务器中&#xff0c;我们服务器中的 tomcat 会有各种文件路径&#xff0c;看下它有哪些文件 文件结构层级 ├── bin/ # 核心脚本和启动文件 ├── conf/ # …...

苍穹外卖day12

课程内容 工作台 Apache POI 导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系统运…...

Unity Final IK:下一代角色动画与物理交互的技术解析

引言&#xff1a;角色动画的范式转移 在传统游戏开发中&#xff0c;角色动画主要依赖于 前向动力学&#xff08;Forward Kinematics, FK&#xff09; 和预烘焙动画。然而&#xff0c;这种方法的局限性在开放世界、物理交互和VR等场景中愈发明显&#xff1a; 环境适应性差&…...

前端开发时的内存泄漏问题

目录 &#x1f50d; 什么是内存泄漏&#xff08;Memory Leak&#xff09;&#xff1f;&#x1f6a8; 常见的内存泄漏场景1️⃣ 未清除的定时器&#xff08;setInterval / setTimeout&#xff09;2️⃣ 全局变量&#xff08;变量未正确释放&#xff09;3️⃣ 事件监听未清除4️⃣…...

【Feign】⭐️使用 openFeign 时传递 MultipartFile 类型的参数参考

&#x1f4a5;&#x1f4a5;✈️✈️欢迎阅读本文章❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;本篇文章阅读大约耗时三分钟。 ⛳️motto&#xff1a;不积跬步、无以千里 &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&a…...

Linux中动静态库的制作

1.什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个⼈的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是⼀种可执⾏代码的⼆进制形式&#xff0c;可以被操作系统…...

Docker部署sprintboot后端项目

创建Docker网络 docker network create icjs 部署Redis docker run -d \--network icjs \--name redis \-p 6379:6379 \redis:latest数据持久化 docker run --restartalways --network icjs -p 6379:6379 --name redis -v /opt/docker/redis/redis.conf:/etc/redis/redis.c…...

forms实现连连看

说明&#xff1a; forms实现连连看 效果图&#xff1a; step1:C:\Users\wangrusheng\RiderProjects\WinFormsApp2\WinFormsApp2\Form1.cs using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms;namespace …...

多视图几何--立体校正--Fusiello方法

1. 坐标系对齐与正交基构造 目标&#xff1a;构建新坐标系基向量 { e 1 , e 2 , e 3 } \{ \mathbf{e}_1, \mathbf{e}_2, \mathbf{e}_3 \} {e1​,e2​,e3​}&#xff0c;使成像平面共面且极线水平对齐。 (1) 基线方向 e 1 \mathbf{e}_1 e1​ 基线向量由左右相机光心平移向量…...

鸿蒙开发踩坑记录 - 2024S2

wrapBuilder如果想View和ObservedV2做绑定 必须要用 ComponentV2 Param 和 区别 退出两层循环 Builder的传入的参数及时是Trace修饰的也无法刷新组件 折叠屏展开后键盘无法点击 vm是公用的&#xff0c;组件生命周期问题导致 监听键盘高度变化失效 原因&#xff1a;分享面…...

【学Rust写CAD】21 2D 点(point.rs)

源码 //matrix/point.rs use std::ops::Mul; use super::algebraic_units::{Zero, One}; use super::generic::Matrix;/// 点坐标结构体 #[derive(Debug, Clone, Copy, PartialEq)] pub struct Point<X, Y>(Matrix<X, Y, One, Zero, Zero, One>);impl<X, Y>…...

0基础入门scrapy 框架,获取豆瓣top250存入mysql

一、基础教程 创建项目命令 scrapy startproject mySpider --项目名称 创建爬虫文件 scrapy genspider itcast "itcast.cn" --自动生成 itcast.py 文件 爬虫名称 爬虫网址 运行爬虫 scrapy crawl baidu(爬虫名&#xff09; 使用终端运行太麻烦了&#xff0c;而且…...

鸿蒙NEXT小游戏开发:井字棋

1. 引言 井字棋是一款经典的两人对战游戏&#xff0c;简单易懂&#xff0c;适合各个年龄段的玩家。本文将介绍如何使用鸿蒙NEXT框架开发一个井字棋游戏&#xff0c;涵盖游戏逻辑、界面设计及AI对战功能。 2. 开发环境准备 电脑系统&#xff1a;windows 10 开发工具&#xff1a;…...