• JS 控件使用模板


    简介

    前面讲过JS代码中如何实现模板,我们在实现控件的时候,每个控件初始化时都需要有默认的html,如果这些html都是固定的,那么当需求发生变化或者用到其他项目时,这个控件的迁移成本就会非常大,所以我们在设计控件的时候,就应该分析那些地方应该使用模板。

    分析

    控件有自己的生命周期,控件上显示的html和CSS一般情况下:

    1. 初始化时创建
    2. 状态发生改变时变化

    本文关注的是控件初始化创建控件DOM时需要的模板,以及模板跟初始化传入变量之间的关系。控件的生命周期,前面曾经讲过,跟本文相关的是 createDom 和 renderUI

     

    1. createDom 就是控件创建自己的DOM结构
    2. renderUI 是控件根据一些配置项设置一些DOM的状态,以及生成渲染子控件

    我们在考虑控件使用模板时,发现控件的模板对于菜单、列表这一类控件更为有用,这一类控件都是父控件包含多个同类的子控件,例如

    l  一个菜单包含多个菜单项,

    l  一个列表包含多个列表项

    如果菜单项或者列表项都支持模板,那么使用菜单时只需要设置菜单项的模板即可改变菜单的样式,同时我们也会发现更多需要实现的功能:

    l  同一个菜单的不同菜单项的模板也可能不一样

    l  菜单本身如果有模板,那么菜单项需要指定容器

    属性和接口

    经过上面的分析,我们需要提供以下属性:

    1. tpl : 控件的模板,是html模板,可以跟配置项进行合并。
    2. tplRender : 控件模板的渲染函数,当控件的模板根据配置项的值而生成的时候,使用渲染函数。
    3. childContainer : 控件子控件的容器,控件渲染完DOM后,在渲染子控件时使用。

    所使用的接口:

    1.    setContentTpl (): 设置模板

    上面的设计非常简单,但是我们会发现在使用的过程中非常难以使用,在菜单实现中,我们总不能在每个菜单项中都配置模板或者渲染函数,所以必须提供一种方便使用的机制,允许在父控件上设置子控件的模板,这个在后面的扩展里面讲解。

    我们来看一个示例:

    var menu = new Menu.Menu({
    
      render : '#m1',
    
      width : 200,
    
      elCls: 'demo-menu',
    
      children : [
    
        {href :'http://www.taobao.com',text : '链接1'},
    
        {id : 'm12', href :'http://www.taobao.com', text : '链接2'},
    
        {href :'http://www.taobao.com', text : '链接3'}
    
      ],
    
      itemTpl:'<span><label>▶ </label><a href="{href}">{text}</a></span>' //菜单项的模板
    
    });
    
    menu.render();

    其他模板

    在控件状态发生改变时,控件的html或者CSS需要发生改变,例如:

    l  菜单选中一项时,菜单项需要添加选中的css

    l  表单里面一个表单项验证失败时需要显示错误信息

    所以我们需要区别那些状态改变是仅仅改变CSS还是需要增删DOM,把需要增删DOM的内容设置成控件的属性模板,在配置控件时传入,下面是一个文本框控件

    var textField = new TextField({
    
             render : '#row',
    
             label : '测试字段',
    
             elCls : 'control-group span8',
    
             controlContainer : '.controls',
    
             errorTpl : '<span class="valid-text"><span class="estate error"><span class="x-icon x-icon-mini x-icon-error">!</span><em>{error}</em></span></span>',//错误模板
    
             rules : {
    
               required : true,
    
               min : 5,
    
               max : 10
    
             },
    
             tpl : tpl
    
    });
    
     
    
    textField.render();

    实现

    代码实现

    菜单使用模板

    模拟天猫菜单

    总之,所有可变的的地方都应该使用模板,同时注意易用性和易理解性。

  • 相关阅读:
    【设计模式+原型理解】第四章:函数的三种角色+原型链终结版
    【设计模式+原型理解】第三章:javascript五种继承父类方式
    【设计模式+原型理解】第二章:基于构造函数扩展出来的原型模式
    【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式
    【Javascript】JS遍历数组的三种方法:map、forEach、filter
    mysql_8.0.12环境配置
    Vue搭建环境
    Flask学习:根据WTF实现登录
    Flask学习:简单的实现登录功能(表单,消息显示)
    Flask学习:模板的使用(变量,控制器,过滤器)
  • 原文地址:https://www.cnblogs.com/zaohe/p/3005760.html
Copyright © 2020-2023  润新知