当前位置:首页 > 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
分享给朋友:

相关文章

vue实现账号注册功能

vue实现账号注册功能

注册功能实现步骤 前端部分(Vue.js) 创建注册表单组件 使用Vue的单文件组件结构,包含用户名、邮箱、密码等输入框,并添加表单验证逻辑。 <template> <form…

vue实现产品使用功能

vue实现产品使用功能

Vue 实现产品功能的关键方法 组件化开发 Vue 的核心思想是组件化,将产品功能拆分为独立可复用的组件。每个组件包含模板、逻辑和样式,例如产品卡片组件可封装图片、名称、价格等元素。通过 props…

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template&…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…