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

news2025/1/16 6:16:15

一、最早的灵感

最早的灵感来自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.coloradmin.cn/o/2277401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Deep Learning] Anaconda+CUDA+CuDNN+Pytorch(GPU)环境配置-2025

文章目录 [Deep Learning] AnacondaCUDACuDNNPytorch(GPU)环境配置-20250. 引子1. 安装Anaconda1.1 安装包下载:1.2 启用安装包安装1.3 配置(系统)环境变量1.4 验证Anaconda是否安装完毕1.5 Anaconda换源 2. 安装CUDACuDNN2.1 判断本机的CUDA版本2.2 下载适合自己CU…

直播预告丨Arxiv Insight:用 AI 重新定义论文检索

1月16日晚上20:00-20:50,Zilliz直播间,深圳大学计算机视觉所硕士牛增豪先生将带来《Arxiv Insight:用 AI 重新定义论文检索》分享,届时他将讲述从零到一构建 Arxiv Insight产品的过程,思考以及未来计划。欢迎大家锁定Z…

STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态

目录 任务的挂起与恢复的API函数 任务挂起函数 任务恢复函数 任务恢复函数(中断中恢复) 函数说明 注意事项 查看任务状态 任务的挂起与恢复的API函数 vTaskSuspend():挂起任务, 类似暂停,可恢复 vTaskResume()&#xff1a…

4. 使用springboot做一个音乐播放器软件项目【数据库表的创建】

上一章文章 我们做了音乐播放器 这个项目一些公共封装的一些工具类。参考网址: https://blog.csdn.net/Drug_/article/details/145093705 那么这篇文章 我们开始创建数据表。来存储我们项目中所需要存储的数据。 对于 我们这个项目 版本一 需要开发的核心功能 在 第…

leetcode刷题记录(五十四)——560. 和为 K 的子数组

(一)问题描述 560. 和为 K 的子数组 - 力扣(LeetCode)560. 和为 K 的子数组 - 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。 示例 1&am…

软考,质量管理。

项目质量管理,PMBOOK 质量是满足需求的能力的特性的总结 需求的满足程度 质量通常是指产品的质量,广义上的质量还包括工作质量。产品质量是指产品的使用价值及其属性;而工作质量则是产品质量的保证,它反映了与产品质量直接有关的…

Re78 读论文:GPT-4 Technical Report

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:GPT-4 Technical Report 官方博客:GPT-4 | OpenAI appendix懒得看了。 文章目录 1. 模型训练过程心得2. scaling law3. 实验结果减少风险 1. 模型训练过程心得 模型结构还…

LeetCode | 图文详细描述动态规划DP算法及经典题型

本文将用简单直白的方式,从零开始带你掌握动态规划的精髓。你会发现: 动态规划其实没那么难——它就是递归的“记性”版。状态转移方程不再玄学——从题目思路到实现,手把手教你推导。经典题型剖析——从“爬楼梯”到“背包问题”&#xff0…

学习threejs,使用RollControls相机控制器

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.RollControls 相机控…

期权懂|场内期权合约行权价格是如何设定制度的?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 场内期权合约行权价格是如何设定制度的? 场内期权合约的行权价格是期权合约中的一个关键要素,它决定了期权买方在期权到期日或之前买入(对于…

设计模式相关面试

设计模式 工厂方法模式 简单工程模式 工厂方法设计模式 抽象工厂设计模式 工厂方法小结 策略模式 案例(工厂模式策略模式) 责任链设计模式 概述 常见使用方式 常见技术场景 单点登录如何实现 权限认证如何实现 上传数据的安全如何控制 遇到了那些比较棘…

C#轻松实现ModbusTCP服务器接口

大家好!我是付工。 通透!终于把ModbusRTU弄明白了 这样看来,ModbusTCP协议太简单了 太简单了!C#轻松实现Modbus通信 前面给大家介绍了一系列关于Modbus和ModbusTCP的知识,主要针对的是ModbusTCP客户端。 在实际开…

比较之舞,优雅演绎排序算法的智美篇章

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、冒泡排序:数据海…

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库: 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图,该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件,文件内容及各配置项内容如下图,需要先将配置项【skip-grant-tab…

2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学

176项指标数据库 任意组合 千种组合方式 14页纯图 无水印可视化 63页无附录正文 3万字 1、为了方便大家阅读,全文使用中文进行描述,最终版本需自行翻译为英文。 2、文中图形、结论文字描述均为ai写作,可自行将自己的结果发给ai&#xff0c…

unity学习17:unity里的旋转学习,欧拉角,四元数等

目录 1 三维空间里的旋转与欧拉角,四元数 1.1 欧拉角比较符合直观 1.2 四元数 1.3 下面是欧拉角和四元数的一些参考文章 2 关于旋转的这些知识点 2.1 使用euler欧拉角旋转 2.2 使用quaternion四元数,w,x,y,z 2.3 使用quaternion四元数,类 Vector3.zero 这种…

深度剖析RabbitMQ:从基础组件到管理页面详解

文章目录 一、简介二、Overview2.1 Overview->Totals2.2 Overview->Nodesbroker的属性2.3 Overview->Churn statistics2.4 Overview->Ports and contexts2.5 Overview->Export definitions2.6 Overview->Import definitions 三、Connections连接的属性 四、C…

机器学习中的凸函数和梯度下降法

一、凸函数 在机器学习中,凸函数 和 凸优化 是优化问题中的重要概念,许多机器学习算法的目标是优化一个凸函数。这些概念的核心思想围绕着优化问题的简化和求解效率。下面从简单直观的角度来解释。 1. 什么是凸函数? 数学定义 一个函数 f…

使用 WPF 和 C# 绘制覆盖网格的 3D 表面

此示例展示了如何使用 C# 代码和 XAML 绘制覆盖有网格的 3D 表面。示例使用 WPF 和 C# 将纹理应用于三角形展示了如何将纹理应用于三角形。此示例只是使用该技术将包含大网格的位图应用于表面。 在类级别,程序使用以下代码来定义将点的 X 和 Z 坐标映射到 0.0 - 1.…

深入Android架构(从线程到AIDL)_32 JNI架构原理_Java与C的对接05

1、EIT造形观点 基于熟悉的EIT造形&#xff0c;很容易理解重要的架构设计决策议题。 前言 2、混合式EIT造形 一般EIT造形是同语言的。也就是<E>、 <I>和<T>都使用同一种语言撰写的&#xff0c;例如上述的Java、 C/C等。于此&#xff0c;将介绍一个EIT造…