当前位置:首页 > JavaScript

js实现template功能

2026-02-02 13:18:39JavaScript

实现基础模板替换

使用字符串替换是最简单的方式,通过正则表达式匹配占位符并替换为实际值。以下是一个基础实现:

function renderTemplate(template, data) {
  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
    return data[key] || '';
  });
}

const template = 'Hello, {{name}}! Today is {{day}}.';
const data = { name: 'Alice', day: 'Monday' };
console.log(renderTemplate(template, data)); 
// 输出: "Hello, Alice! Today is Monday."

支持嵌套对象访问

扩展基础功能以支持对象嵌套访问,使用点号分隔路径:

js实现template功能

function renderTemplate(template, data) {
  return template.replace(/\{\{([\w\.]+)\}\}/g, (match, path) => {
    return path.split('.').reduce((obj, key) => {
      return (obj && obj[key] !== undefined) ? obj[key] : '';
    }, data);
  });
}

const template = 'User: {{user.name}}, Age: {{user.age}}';
const data = { user: { name: 'Bob', age: 25 } };
console.log(renderTemplate(template, data));
// 输出: "User: Bob, Age: 25"

添加条件逻辑支持

通过自定义语法实现简单的条件判断,例如 {{#if condition}}...{{/if}}

js实现template功能

function renderTemplate(template, data) {
  // 处理条件块
  const ifPattern = /\{\{#if (\w+)\}\}(.*?)\{\{\/if\}\}/gs;
  template = template.replace(ifPattern, (match, condition, content) => {
    return data[condition] ? content : '';
  });

  // 处理普通替换
  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
    return data[key] || '';
  });
}

const template = '{{#if show}}Welcome!{{/if}} {{name}}';
const data = { show: true, name: 'Charlie' };
console.log(renderTemplate(template, data));
// 输出: "Welcome! Charlie"

实现循环功能

支持数组循环渲染,使用类似 {{#each items}}...{{/each}} 的语法:

function renderTemplate(template, data) {
  // 处理循环块
  const eachPattern = /\{\{#each (\w+)\}\}(.*?)\{\{\/each\}\}/gs;
  template = template.replace(eachPattern, (match, arrayName, content) => {
    const items = data[arrayName] || [];
    return items.map(item => {
      return content.replace(/\{\{\.\}\}/g, item);
    }).join('');
  });

  // 处理普通替换
  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
    return data[key] || '';
  });
}

const template = '{{#each fruits}}{{.}} {{/each}}';
const data = { fruits: ['Apple', 'Banana', 'Cherry'] };
console.log(renderTemplate(template, data));
// 输出: "Apple Banana Cherry "

使用Function构造函数实现动态模板

对于更复杂的场景,可以使用Function构造函数动态生成渲染函数:

function compileTemplate(template) {
  const body = "let result = '';\n" +
    template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
      return `result += ${key};\n`;
    }) +
    'return result;';

  return new Function(...Object.keys(data), body);
}

const template = '{{greeting}}, {{name}}!';
const data = { greeting: 'Hello', name: 'Dave' };
const render = compileTemplate(template);
console.log(render(data.greeting, data.name));
// 输出: "Hello, Dave!"

标签: 功能js
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备与绑定 准备一个包含所有数据的数组,并使用v-model或v-…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…