使用VirtualView渲染的前端UI组件开发模式

简介:

在上篇文章中,我讲到我们的组件开发模式解决了以下几个问题

  1. 渲染逻辑,业务逻辑,事件分发,控制器彻底分离
  2. 组件内部只有一个状态
  3. 渲染逻辑只有一处
  4. 只绑定一次事件
  5. 没有任何学习成本

下面来看我们具体我们是通过什么方式解决的

  1. 渲染逻辑,业务逻辑,事件分发,控制器彻底分离,易于维护和重用

    我们在原来的开发中一般都是把这些代码都写在同一个文件中,整个文件上千行是常有的事。在维护代码或者根据需求的变化修改代码的时候会变得极其困难,从团队的角度来说,根本没法互相协作。为了解决这些问题我们把一个组件拆分为渲染逻辑,业务逻辑,时间分发,和控制器。下面是我们开发一个组件时的文件结构

    组件文件结构

    - index.js
    
        组件的控制器: 主要负责组件的变量的初始化,这些变量主要包括组件的container,template,event,store,initData;根据不同的状态拿到对应的模版;virtual dom的转换,diff,pattch;事件的绑定与解绑。
    
    - store.js
    
        业务逻辑: 主要负责在内存中对业务逻辑的处理,如add,remove,modify,query等的操作,处理完成后把最终的状态告诉组件的控制器,组件只会存在这样的一个唯一的状态;同时也负责从service中取得数据。
    
    - tempate.js
    
        渲染逻辑: 该文件中都是组件的不同的状态对应的模版方法,每个方法都会根据传入的组件状态参数,和相对应模版结构组合为最终的html.
    
    - actions.js
    
        事件分发: 该部分主要用于组件的对外通信,如果组件内部的变化需要通知其他组件,就需要该部分来协作完成。
    
  2. 组件内部只有一个状态

    组件内部只有一个状态是通过Store来维护的,这里所说的状态其实就是组件需要的数据。组件的初始化数据会传给store,在每次事件的操作会触发store中的对数据的处理方法,等数据更新完成会发出一个updateData的事件告诉组件控制器。具体的实现看下面的代码

    
            createStore: function(){
                var Store = this.get('store');
                var that = this;
    
                if(Store){
                    var initData = this.get('initData');
                    var storeObj = new Store({
                        data:initData
                    });
                    storeObj.on('updateData',function(e){
                        var data = e.data.data;
                        that.updateView(data);  
                    });
    
                    this.store = storeObj;
                }
            }
    
  3. 渲染逻辑只有一处

    组件的所有渲染都是通过一个render方法进行.在render方法中拿到最新的html字符串,通过VirtualHtml转换为VirtualDom,如果是首次渲染就直接附加到真正的dom树上;如果是以后渲染,需要拿最新的VirtualDom和上次的VirtualDom进行diff,把diff所产生的patches,patche到真正的dom树上。具体的实现看下面的代码

    
        render: function(data,cb){
            var that = this;
    
            var firstRender = !this.tree;
    
            this.renderedTemplate = this.buildHTML();
    
            //把字符串转换为dom
            VirtualHtml(this.renderedTemplate, function (err, dom) {
                if (err) {
                    if (cb) return cb(err);
                    throw err;
                }
    
                if (firstRender) {
                    that.tree = dom;
                    that.el = CreateElement(dom);
                } else {
                    var patches = Diff(that.tree, dom);
                    that.tree = dom;
                    that.el = Patch(that.el, patches);
                }
    
                if (cb) cb(null, that);
            });
        }
    
    
  4. 只绑定一次事件

    会在组件的容器上或者页面的body上绑定一次事件,以后组件内部的所有的事件操作都是基于这个事件代理外分发。具体的实现代码如下

        delegateEvents: function(events) {
            //默认通过参数传入,也可以通过配置属性传入
            events = events || this.get('events');
    
            if (!events) return this;
    
            //循环所有事件,并代理
            for (var key in events) {
                var method = events[key];
                if (!S.isFunction(method)) method = this[events[key]];
                if (!method) continue;
                var match = key.match(delegateEventSplitter);
    
                this.undelegate(match[1], match[2]);
                this.delegate(match[1], match[2], S.bind(method, this));
            }
            return this;
        }   
    
  5. 没有任何学习成本

    * 基于开发这都很熟悉的字符串模版
    * virtual dom的相关操作封装在所有组件的基类中,对开发者不透明
    

这里是源码文件http://g.tbcdn.cn/de/cicada/1.0.0/widget/base-widget/index.js,这篇文章其实是一篇对源码的解读。

最后我想说的是,我们数娱用到的ui组件开发模式,都不是最新的或者我们发明的[实际上大部分的框架也都是这样,没有发明什么新技术],我们做的只是把开发过程中的重复行为或者容易犯错误的地方封装在框架中,从根本上解决了开发人员的开发效率低,写的代码不易于维护和扩展的问题。

目录
相关文章
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
伪类:伪类这个叫法源自于它们跟类相似,但实际上并没有类会附加到标记中的标签上。 伪类分为两种(以及新增的伪类选择器): UI伪类:会在HTML元素处于某种状态时(例如:鼠标指针位于连接上),为该元素应用CSS样式。 :hover 结构化伪类:会在标记中存在某种结构上的关系时 例如: 某元素是一组元素中的第一个或最后一个,为该元素应用CSS样式。 :not和:target(CSS3新增的两个特殊的伪类选择器)
1412 2
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
676 0
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
1103 11
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1300 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
418 1
|
人工智能 JSON 前端开发
如何解决后端Agent和前端UI之间的交互问题?——解析AG-UI协议的神奇作用
三桥君指出AG-UI协议通过SSE技术实现智能体与前端UI的标准化交互,解决流式传输、实时进度显示、数据同步等开发痛点。其核心功能包括结构化事件流、多Agent任务交接和用户中断处理,具有"一次开发到处兼容"、"UI灵活可扩展"等优势。智能体专家三桥君认为协议将AI应用从聊天工具升级为实用软件,适用于代码生成、多步骤工作流等场景,显著提升开发效率和用户体验。
2990 0
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
3555 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
1015 2
|
前端开发 JavaScript API
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
1571 4

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1457
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    722
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    591
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    596
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    676
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    862
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1711
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    409
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1412
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    716