JavaScript设计模式(三十):卡片拼图-简单模板模式

简介: 卡片拼图-简单模板模式

简单模板模式(Simple template)

通过格式化字符串拼凑出视图避免创建视图时大量节点操作。优化内存开销。

image.png

<div id="container"></div>

创建文字列表视图

// 命名空间
const A = {
   
   
    // 主体展示区容器
    root: document.getElementById('container'),
    // 创建视图方法集合
    strategy: {
   
   
        // 文字列表展示
        listPart({
   
   data: d}) {
   
   
            let part = document.createElement("div");       // 模块容器
            let titleBox = document.createElement("h2");    // 标题容器
            let title = document.createTextNode(d.title);    // 标题内容
            let descBox = document.createElement("p");      // 描述容器
            let desc = document.createTextNode(d.desc);      // 描述内容
            let listBox = document.createElement("ul");     // 列表容器

            titleBox.appendChild(title);    // 将标题内容放入标题容器中
            descBox.appendChild(desc);      // 将描述内容放入描述容器中

            part.className = "part";        // 设置模块类名
            part.appendChild(titleBox);     // 将标题容器插入模块容器中
            part.appendChild(descBox);      // 将描述容器插入模板容器中

            let list = d.list;      // 列表数据
            let rowBox, labelBox, label, valueBox, value;
            // 遍历列表数据
            list.forEach(item => {
   
   
                rowBox = document.createElement("li");         // 创建列表项容器
                labelBox = document.createElement("strong");   // 创建列表项标题容器
                label = document.createTextNode(item.label);            // 创建列表项标题内容
                valueBox = document.createElement("span");     // 创建列表项解释容器
                value = document.createTextNode(item.value);            // 创建列表项解释内容

                labelBox.appendChild(label);
                valueBox.appendChild(value);

                rowBox.appendChild(labelBox);
                rowBox.appendChild(valueBox);

                listBox.appendChild(rowBox);
            });

            part.appendChild(listBox);  // 向模块中插入列表
            A.root.appendChild(part);   // 展现模块
        },
        codePart(data) {
   
   
            /* ···CODE··· */
        },
        onlyTitle(data) {
   
   
            /* ···CODE··· */
        },
        guide(data) {
   
   
            /* ···CODE··· */
        },
        /* ···CODE··· */
    },
    // 创建视图入口
    init: function (data) {
   
   
        // 根据传输的视图类型创建视图
        this.strategy[data.type](data);
    }
}

A.init({
   
   
    type: 'listPart',
    data: {
   
   
        title: 'You瞧谁不起 - 道不尽世间的沧桑,诉不完人生的悲凉',
        desc: '人海茫茫,你我依旧孤独~~~',
        list: [
            {
   
   label: '姓名:', value: 'Lee'},
            {
   
   label: '年龄:', value: 18},
            {
   
   label: '性别:', value: '男'}
        ]
    }
});

缺点

创建一个简单的视图就要操作这么多大节点,如果需求创建一个比较复杂的页面,那么很难想象会操作每个节点多少次。当然这过程中还可能会遇到像添加类、绑定事件什么的,这样你的开销就大了。

新方案(简单模板模式

// 命名空间
const A = {
   
   
    // 模板渲染方法
    formatString(str, data) {
   
   
        return str.replace(/\{#(\w+)#\}/g, function (match, key) {
   
   
            return typeof data[key] === undefined ? '' : data[key]
        });
    },
    // 视图模板
    view(data) {
   
   
        const tpl = {
   
   
            listPart: {
   
   
                row: `<li><strong>{#label#}</strong><span>{#value#}</span></li>`,
                theme: `
                    <div class="{#class#}">
                        <h2>{#title#}</h2>
                        <p>{#desc#}</p>
                        <ul>{#content#}</ul>
                    </div>
                `
            },
            codePart: {
   
   },
            onlyTitle: {
   
   },
            guide: {
   
   },
            /* ···CODE··· */
        };
        let rowStr = data.list.map(d => this.formatString(tpl.listPart.row, d)).join('');
        return this.formatString(tpl.listPart.theme, {
   
   ...data, content: rowStr});
    },
    // 主体展示区容器
    root: document.getElementById('container'),
    // 创建视图方法集合
    strategy: {
   
   
        // 文字列表展示
        listPart({
   
   data: d}) {
   
   
            A.root.innerHTML = A.view({
   
   ...d, class: 'part'});
        },
        codePart(data) {
   
   
            /* ···CODE··· */
        },
        onlyTitle(data) {
   
   
            /* ···CODE··· */
        },
        guide(data) {
   
   
            /* ···CODE··· */
        },
        /* ···CODE··· */
    },
    // 创建视图入口
    init: function (data) {
   
   
        // 根据传输的视图类型创建视图
        this.strategy[data.type](data);
    }
}

A.init({
   
   
    type: 'listPart',
    data: {
   
   
        title: 'You瞧谁不起 - 道不尽世间的沧桑,诉不完人生的悲凉',
        desc: '人海茫茫,你我依旧孤独~~~',
        list: [
            {
   
   label: '姓名:', value: 'Lee'},
            {
   
   label: '年龄:', value: 18},
            {
   
   label: '性别:', value: '男'}
        ]
    }
});

特点

简单模板模式主要包含三部分,字符串模板库,格式化方法,字符串拼接操作。

简单模板模式意在解决运用DOM操作创建视图时造成资源消耗大、性能低下、操作复杂等问题。

用正则匹配方式去格式化字符串的执行的性能要远高于DOM操作拼接视图的执行性能,因此这种方式常备用于大型框架(如MVC等)创建视图操作中。

目录
相关文章
|
2月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
142 11
|
13天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
26天前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
88 40
|
27天前
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——简单工厂模式
简单工厂模式是一种创建型设计模式,通过工厂类根据传入参数创建不同类型的对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。适用于对象种类较少且调用者无需关心创建细节的场景。
54 19
|
1月前
|
设计模式 数据安全/隐私保护
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
这篇文章介绍了在Next.js框架下,如何处理中后台管理系统中特殊页面(如登录页)不包裹根布局(RootLayout)的问题。作者指出Next.js的设计理念是通过布局的嵌套来创建复杂的页面结构,这虽然保持了代码的整洁和可维护性,但对于特殊页面来说,却造成了不必要的布局包裹。文章提出了一个解决方案,即通过判断页面的skipGlobalLayout属性来决定是否包含RootLayout,从而实现特殊页面不包裹根布局的目标。
90 33
|
25天前
|
设计模式 Java
「全网最细 + 实战源码案例」设计模式——生成器模式
生成器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象。它允许用户通过控制对象构造的过程,定制对象的组成部分,而无需直接实例化细节。该模式特别适合构建具有多种配置的复杂对象。其结构包括抽象建造者、具体建造者、指挥者和产品角色。适用于需要创建复杂对象且对象由多个部分组成、构造过程需对外隐藏或分离表示与构造的场景。优点在于更好的控制、代码复用和解耦性;缺点是增加复杂性和不适合简单对象。实现时需定义建造者接口、具体建造者类、指挥者类及产品类。链式调用是常见应用方式之一。
53 12
|
27天前
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——工厂方法模式
简单工厂模式是一种创建型设计模式,通过一个工厂类根据传入参数创建不同类型的产品对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。适用于创建对象种类较少且调用者无需关心创建细节的场景。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。
45 15
|
3月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
125 63
|
3月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###

热门文章

最新文章