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等)创建视图操作中。

目录
相关文章
|
13天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
15天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
8天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
24 1
|
19天前
|
前端开发 JavaScript UED
探索JavaScript中的异步编程模式
【10月更文挑战第21天】在数字时代的浪潮中,JavaScript作为一门动态的、解释型的编程语言,以其卓越的灵活性和强大的功能在Web开发领域扮演着举足轻重的角色。本篇文章旨在深入探讨JavaScript中的异步编程模式,揭示其背后的原理和实践方法。通过分析回调函数、Promise对象以及async/await语法糖等关键技术点,我们将一同揭开JavaScript异步编程的神秘面纱,领略其带来的非阻塞I/O操作的魅力。让我们跟随代码的步伐,开启一场关于时间、性能与用户体验的奇妙之旅。
|
7天前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第33天】在JavaScript的世界里,异步编程是提升应用性能和用户体验的关键。本文将带你深入理解异步编程的核心概念,并展示如何在实际开发中运用这些知识来构建更流畅、响应更快的Web应用程序。从回调函数到Promises,再到async/await,我们将一步步解锁JavaScript异步编程的秘密,让你轻松应对各种复杂的异步场景。
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
21 3
|
1月前
|
JavaScript 前端开发 API
探索Node.js中的异步编程模式
【10月更文挑战第4天】在JavaScript的世界中,异步编程是提升应用性能和用户体验的关键。本文将深入探讨Node.js中异步编程的几种模式,包括回调函数、Promises、async/await,并分享如何有效利用这些模式来构建高性能的后端服务。
|
1月前
|
JavaScript 前端开发 调度
探索Node.js中的异步编程模式
在Node.js的世界里,异步编程是核心。本文将带你深入了解异步编程的精髓,通过代码示例和实际案例分析,我们将一起掌握事件循环、回调函数、Promises以及async/await等关键概念。准备好迎接挑战,让你的Node.js应用飞起来!
|
1月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
30 3