前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感

最早的灵感来自sprider / 网络爬虫 / 爬虫配置,在爬虫爬取网站文章时候,会输入给爬虫一个配置文件,里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引出的配置就类似爬虫的配置,一模一样。只是我们把配置输入给了前端的组件,数据从接口直接获取。本质上是一模一样的。相比较爬虫配置我们会定义的更加细致而已,以满足需求。

爬虫配置

{"url": "https://example.com",  // 目标网页的URL"headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"},title: 'js代码获取title', // 这里就类似本文的组件content: 'js代码获取content', // 这里就类似本文的组件......"timeout": 10,  // 请求超时时间(秒)"max_retries": 3  // 最大重试次数
}

爬虫通过配置爬取到数据后,会把数据输入到模板页面,模板页面会承载所有的数据,前端会以富文本的形式得到模板页面,在页面展示出来。
或者以接口的形式给到前端也是同理的。

这里的重点是一个配置文件,驱动爬虫抓取了目标页面的所有信息。
我们的配置从某种意义上和爬虫配置是一样的。

本文的重点是类似爬虫配置一样,给前端组件输入一个配置从而形成一个基础的页面。

二、配置工程师的玩笑

有一个玩笑的话,前端开发工程师是配置工程师。我作为前端开发工程师可以这么玩笑的说,别人不能对我这么说,因为我们定义配置是对业务和技术的升华形成了配置。别人对我这么说我认为你只看到了前端努力后简洁明快的结果,没有看到努力的过程,我会不高兴,刚过元旦,我只能祝你元旦快乐,洗洗睡吧。

三、理解配置驱动开发

很长时间在团队里强调,业务开发与组件开发分离。为什么?因为业务开发往往比较紧急,往往在代码逻辑上不够细致,在UI上也不够完美,规范性难以保证,多方人员的情绪接踵而来。所以我强调业务开发与组件分离。

我这么强调和引导,并不是想要开发组件成为少数人所谓在团队中的专利和壁垒,我在倡导业务开发与组件开发分离的同时我积极引导团队每一个成员开发组件,给予机会,并引导帮助迭代。

那么组件化之后会带来哪些变化,为什么组件化是前端工程化的重要组成,简单讲就是,“输入配置,输出结果”。大大提升了生产力。甚至一套配置驱动多端(pc端/小程序端/等,再有其他端也是同理),这里就引出的本文的主题“配置”。

随着我团队组件化的丰富,基本做到了配置驱动开发。由业务和技术我们定义配置,由配置驱动开发。采用这种方式后,团队成员开发效率和积极性有明显提高。技术水平在开发组件过程中也得到提升。在定义配置的过程中/伴随对业务的研究-业务水平也得到提升。

我一直相信要有开放包容的心态,积极努力的过程中带动一帮人,这样的努力更有意义,独学而无友,则孤陋而寡闻,这也是我博客的初衷。

四、配置驱动开发的前提

组件化、模块化,以此产生了配置,以配置的规范性/统一性来驱动多端

五、展示表单页面

如图展示的内容均可轻易通过配置的方式轻松实现

六、定义配置

// 字段命名要显性命名,不能产生歧义
// 每一个对象是一个模块
// 再有更多的模块类型也是同理,再有更多的表单类型也是同理
// 涉及到从接口获取数据的/比如select-remote,输入接口即可,若输入数据,那么配置小的变化就需要全量的处理
// 本文第五条展示的内容,按照合理的配置都可以输出页面骨架
export const config = {id: 'contract',title: 'contract',type: 'add', // add 新增 / edit 编辑 / details 详情 / delete 删除 / approval 审批list: [{id: '',type: 'buttons',title: '',list: [{type: 'add',id: '1',name: '新增',code: '001',event: () => {},disabled:false,more: {}},{type: 'edit',id: '2',name: '编辑',code: '002',event: () => {},disabled:false,more: {}},{type: 'details',id: '3',name: '详情',code: '003',event: () => {},disabled:false,more: {}},// ...],more: {}},{id: '',type: 'form',title: '',list: [ // form配置项{type: 'title'label: "title",},{type: 'input'label: "姓名",fieldName: '',fieldValue: '', // 可能没有disabled:false,},{type: "select",label: "收货地址",fieldName: "",fieldValue: '',required: true,disabled:false,attrs: {placeholder: "请选择收货地址",disabled:false,options: [{label:'北京', value: 1},{label:'上海', value: 2},],},more: {}},{type: "select-remote",label: "负责人",fieldName: "personInChargeName",fieldValue: "personInChargeId",required: true,url: '/m-a-center/api/v1/a/pageList',method: 'get',res: ['res', 'payload', 'content'],map: [{key: 'label',target: 'userName',},{key: 'value',target: 'id',},],params: {query: 'keyword',default:{companyId: uni.getStorageSync('company-id'),page: 1,pageSize: 20,},},attrs: {placeholder: "请选择负责人",disabled:false,options: [],},more: {}},// ...],values: {}, // 数据event: () => {},more: {}},{id: '',type: 'table',title: '',list: [[ // table配置项{type: 'title'label: "title",},{type: 'input'label: "姓名",fieldName: '',fieldValue: '', // 可能没有disabled:false,},{type: "select",label: "收货地址",fieldName: "",fieldValue: '',required: true,disabled:false,attrs: {placeholder: "请选择收货地址",disabled:false,options: [{label:'北京', value: 1},{label:'上海', value: 2},],},more: {}},{type: "select-remote",label: "负责人",fieldName: "personInChargeName",fieldValue: "personInChargeId",required: true,url: '/m-a-center/api/v1/a/pageList',method: 'get',res: ['res', 'payload', 'content'],map: [{key: 'label',target: 'userName',},{key: 'value',target: 'id',},],params: {query: 'keyword',default:{companyId: uni.getStorageSync('company-id'),page: 1,pageSize: 20,},},attrs: {placeholder: "请选择负责人",disabled:false,options: [],},more: {}},// ...]],values: [{}, {}], // table 数据buttons: [{type: 'add',id: '1',name: '新增',code: '001',event: () => {},more: {}},{type: 'edit',id: '2',name: '编辑',code: '002',event: () => {},more: {}},{type: 'details',id: '3',name: '详情',code: '003',event: () => {},more: {}},// ...]event: () => {},more: {}}],more: {}
}

七、表单项

// input类型的可能没有fieldValue,输入什么就是什么,因为没有options,加上options就变成了select类型
list: [ // form配置项{type: 'title'label: "title",},{type: 'input'label: "姓名",fieldName: '',fieldValue: '', // 可能没有disabled:false,},{type: "amount",fieldName: "price",fieldValue: '',label: "单价(元)",attrs: {placeholder: "销售单价(元)",},disabled:false,},{type: "phone",label: "电话",fieldName: "price",fieldValue: '',required: true,attrs: {placeholder: "请输入电话",},disabled:false,},{type: 'postalcode'label: "邮政编码",fieldName: '',fieldValue: '', // 可能没有disabled:false,},{type: "images",label: "图片",fieldName: "price",fieldValue: '',attrs: {placeholder: "图片",},},{type: "file",label: "上传",fieldName: "price",fieldValue: '',valueType: "string", // string | string[] | object[]group:{moduleCode:'1', // 区分是哪一个字段上传的附件},model:null,visible: false,attrs:{fileKey:'url',nameKey:'name',disabled:false, fileMediatype: 'image',},},{type: "select",label: "收货地址",fieldName: "",fieldValue: '',required: true,disabled:false,attrs: {placeholder: "请选择收货地址",disabled:false,options: [{label:'北京', value: 1},{label:'上海', value: 2},],},more: {}},{type: "select-remote",label: "负责人",fieldName: "personInChargeName",fieldValue: "personInChargeId",required: true,url: '/m-a-center/api/v1/a/pageList',method: 'get',res: ['res', 'payload', 'content'],map: [{key: 'label',target: 'userName',},{key: 'value',target: 'id',},],params: {query: 'keyword',default:{companyId: uni.getStorageSync('company-id'),page: 1,pageSize: 20,},},attrs: {placeholder: "请选择负责人",disabled:false,options: [],},more: {}},// ...
],

八、一套配置实现多端开发

核心思想:组件和配置结合起来驱动开发、让组件有秩序

九、定义规范配置模板

前端工程化:plop自动生成文件(快速开发,创建模板文件)_前端自动化生成文件-CSDN博客

十、配置文件得到业务文件的this

vue:.js 文件获取到 .vue 文件中的 this_vue.js 获取vue-CSDN博客

十一、写在最后

我们首先明白一个事实 就是 总体的工作量是不会减少,是守恒的,一部分少做了工作,一定是另一部分多做了。就好像一句话“风雨安好,一定是有人在替你负重前行”。
定义配置这份工作我们是想1实现减少重复的工作,2让擅长的人做擅长的事,以提高开发效率。
并不是以所谓配置为名,进行工作转移,比如把前端工作转移给后端,这样违背了分工的意义/专业的人做专业的事情。
如果配置走的极端一点,通过url的参数识别业务,在页面请求接口,接口返回左右的页面结构和数据以及交互规则,那么这样前端无需做任何工作,即可实现,那么这是提高效率了吗,并没有,反而很大程度增加了工作量,降低了效率,为什么,因为这个过程中工作量没有减少,只是进行了转移,把前端的工作全部转移给了后端去做,让不擅长的人做不擅长的工作,这个与初衷是违背的。并且失去了灵活性,不利开发。

十二、欢迎交流指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/1915.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招,打算做一个个人主页,以便在秋招市场上更有竞争力。 目前,现有的一些搭建主页的博文教程存在以下一些问题: 使用Github Page进行部署,这在国内访问容易受阻使用宝塔面板等框架,功能…

day07_Spark SQL

文章目录 day07_Spark SQL课程笔记一、今日课程内容二、Spark SQL函数定义(掌握)1、窗口函数2、自定义函数背景2.1 回顾函数分类标准:SQL最开始是_内置函数&自定义函数_两种 2.2 自定义函数背景 3、Spark原生自定义UDF函数3.1 自定义函数流程&#x…

【I/O编程】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用(运行中的程序)的角度。外部特指文件。 这里的文件是泛指,并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…

软件测试 —— Selenium常用函数

软件测试 —— Selenium常用函数 操作测试对象点击/提交对象 click()模拟按键输入 send_keys("")清除文本内容 clear() 模拟用户键盘行为 Keys包示例用法 获取文本信息 textget_attribute("属性名称") 获取当前页面标题 title获取当前页面的 url current_u…

java导出pdf文件

java导出pdf,前端下载 1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接 使用注意点 因为原来制作的pdf表单内容过于复杂,下面代码只包含前两行的操作。 本次操作需要前端向后端发起请求,后端返回数据给前端…

Python教程丨Python环境搭建 (含IDE安装)——保姆级教程!

工欲善其事,必先利其器。 学习Python的第一步不要再加收藏夹了!提高执行力,先给自己装好Python。 1. Python 下载 1.1. 下载安装包 既然要下载Python,我们直接进入python官网下载即可 Python 官网:Welcome to Pyt…

ip属地是根据手机号还是位置

在数字化时代,IP地址作为网络世界中的“门牌号”,其属地信息往往与用户的地理位置紧密相关。然而,关于IP属地是如何确定的,是否依赖于手机号还是实际位置,这一话题时常引发讨论。本文将深入探讨IP属地的确定方式&#…

Python编程与在线医疗平台数据挖掘与数据应用交互性研究

一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…

如何在 Linux、MacOS 以及 Windows 中打开控制面板

控制面板不仅仅是一系列图标和菜单的集合;它是通往优化个人计算体验的大门。通过它,用户可以轻松调整从外观到性能的各种参数,确保他们的电脑能够完美地适应自己的需求。无论是想要提升系统安全性、管理硬件设备,还是简单地改变桌…

【数据结构】基础知识

目录 1.1 什么是数据结构 1.2数据 1.3 逻辑结构 1.4 存储结构 1.4.1 顺序存储 1.4.2 链式存储 1.4.3 索引存储 1.4.4 散列存储 1.5 操作 1.1 什么是数据结构 数据的逻辑结构以及存储操作 数据结构没有那么复杂,它就教会你一件事:如何更有效的…

2025年中科院分区大类划分公布!新增8155本

2025年中科院分区表变更情况 扩大收录范围 2025年的期刊分区表在原有的自然科学(SCIE)、社会科学(SSCI)和人文科学(AHCI)的基础上,增加了ESCI期刊的收录,并根据这些期刊的数据进行…

【Hive】新增字段(column)后,旧分区无法更新数据问题

TOC 【一】问题描述 Hive修改数据表结构的需求,比如:增加一个新字段。 如果使用如下语句新增列,可以成功添加列col1。但如果数据表tb已经有旧的分区(例如:dt20190101),则该旧分区中的col1将为…

Xcode 正则表达式实现查找替换

在软件开发过程中,查找和替换文本是一项常见的任务。正则表达式(Regular Expressions)是一种强大的工具,可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具,提供了对正则表达式的支持。本…

我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时

据央视新闻从中国民航局了解到,2024 年我国全年新增通航企业 145 家、通用机场 26 个,颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架,无人机运营单位总数超过 2 万家,累计完成无人机飞行 2666 万小时&#x…

【论文阅读】SDA-FC: Bridging federated clustering and deep generative model

论文地址:SDA-FC: Bridging federated clustering and deep generative model - ScienceDirect 代码地址:https://github.com/Jarvisyan/SDA-FC 摘要 联邦聚类(FC)是集中式聚类在联邦环境中的扩展。关键在于如何在不共享私人数据…

查看APK的公钥,MD5信息

查看md5 sha1 sha256的等信息 keytool -list -printcert -jarfile apk的路径地址 查看公钥私钥信息 keytool -list -rfc --keystore keystore文件的路径地址 | openssl x509 -inform pem -pubkey 把里面的keystore文件的路径地址替换成你的本地文件就可以了 如果报以上错误 就…

王炸组合:Dolphinscheudler 3.1.*搭配SeaT unnel2.3.*高效完成异构数据数据集成

概述 本篇主要介绍如何通过Dolphinscheduler海豚调度搭配Seatunnel完成异构数据源之间的数据同步功能,这个在大数据流批一体数仓建设的过程中是一个非常好的解决方案, 稳定高效,只要用上了你肯定爱不释手。 环境准备 dolphinscheduler集群…

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程(2024最新版)_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具:用来抓取数据包的一个软件 wireshark的功能:用来网络故障排查;用来学习网络技术 wireshark下…

Java Stream流操作List全攻略:Filter、Sort、GroupBy、Average、Sum实践

在Java 8及更高版本中,Stream API为集合处理带来了革命性的改变。本文将深入解析如何运用Stream对List进行高效的操作,包括筛选(Filter)、排序(Sort)、分组(GroupBy)、求平均值&…

机器学习头歌(第三部分-强化学习)

一、强化学习及其关键元素 二、强化学习的分类 三、任务与奖赏 import numpy as np# 迷宫定义 maze np.array([[0, 0, 0, 0, 0],[0, -1, -1, 0, 0],[0, 0, 0, -1, 0],[-1, -1, 0, -1, 0],[0, 0, 0, -1, 1] ])# 定义强化学习的参数 gamma 0.8 # 折扣因子 alpha 0.5 # 学习率…