zoukankan      html  css  js  c++  java
  • roc-charts 开发笔记:原生组件开发技巧——组件更新

    最近开发一个前端工具,需要使用原生 JS 来开发组件,在开发一个下拉选择组件的过程中,一开始更新组件的功能——比如点击下拉列表选项更新选中状态,实现方式就是监听下拉列表选项的点击事件,然后修改当前选中的内容以及下拉列表中选中的内容。

    这样的实现方式是常规实现,通过不断的操作 dom 来实现功能。但是这样的实现有个问题就是 dom 操作过多,可能就会出现一些没考虑到的细节操作的 BUG。并且逻辑会很复杂。然后就记得很久以前用的一个前端模板渲染库的实现,通过清空 dom 再重绘 dom 实现更新,这就能极大的简化逻辑,也和现在的各种前端框架的思想一致——通过状态来渲染 dom,状态更新重绘 dom。

    在构造函数中创建一个容器来存放实际的组件,把创建容器和组件的功能分开,因为实现更新功能只需要创建组件。

        // [{ icon, value: 'xxx', label: 'yyy', selected: true }]
        constructor(options) {
            // 创建一个容器,将组件内容放于容器中,更新组建就清空容器内容再通过新的状态创建组件,而不是通过操作 dom 细节来更新组件
            this.createContainer();
            this.init(options);
        }

    init 方法就是创建组件,options 就是接收到的组件状态,通过 options 创建这个下拉选择功能组件

        init(options) {
            this.options = options;
            this.options.forEach((option, i) => {
                if (option.selected) {
                    this.selectIndex = i;
                }
            });
            this.optionsBtn = [];
    
            this.createElement();
            this.addEvent();
        }

    更新组件的时候就清空容器再创建组件实现组件的更新

        update(options) {
            this.elem.innerHTML = '';
            this.init(options || this.options);
        }
  • 相关阅读:
    《vi和vim》 学习手记(1)
    2013年1月第1个周末
    Oracle基础知识Oracle不同的启动关闭方式
    2013年1月第一个周末
    《vi和vim》 学习手记(2)
    Oracle基础知识数据迁移
    MySQL 显示表字段及注释等信息
    什么是UCenter Home、Discuz!、SupeSite、ECShop和SupeV 这些都是什么?
    mysql远程连接对用户的测试(吴龙波)
    MySQL与SQL的触发器的不同写法
  • 原文地址:https://www.cnblogs.com/3body/p/13028329.html
Copyright © 2011-2022 走看看