用户定义的模板字符串

User-defined template string

我正在寻找一种方法让用户可以选择定义模板文字。该模板将被发送到后端并与他提供的数据一起使用。

示例场景:

const dataSentToBackend = [
  {
    name: 'Adam',
    country: 'Spain'
  },{
    name: 'Eve',
    country: 'Germany'
  }
]

用户想要生成两个类似这样的文件:{name} from {country}(或其他任何让他按照自己喜欢的方式使用标签的文件)。因此,此示例中的文件将被命名为 Adam from SpainEve from Germany.

诀窍是需要将模板保存为模板,以便在后端实际处理数据时使用它。所以它可以用在一个循环中,通过dataSentToBackend数组一个一个地命名文件。

到目前为止我只找到了String.raw函数(感谢this页面),但我没有发现它对我有多大帮助(或者我不明白)。

假设您的用户在输入字段中输入的是模板字符串。您可以简单地将转义字符串保存在数据库中,并在将其编译为模板字符串之前取消转义。

要实际使用它,您可以尝试这样的操作。

const templateString = "Hello ${this.name}!"; // replace it with unescaped template 
const templateVars = {
    name: "world"    
}

const fillTemplate = function(templateString, templateVars){
    return new Function("return `"+templateString +"`;").call(templateVars);
}

console.log(fillTemplate(templateString, templateVars));

但我肯定会说不要让用户定义模板并使用它,除非你有一个非常可靠的清理脚本。

这是一种方法。我使用正则表达式 [a-z]+ 作为 属性 名称,如果您需要允许更多字符(大写、下划线、数字等),您可以扩展该名称

const dataSentToBackend = [
  {
    name: 'Adam',
    country: 'Spain'
  }, {
    name: 'Eve',
    country: 'Germany'
  }
]

const templateSentToBackend = "{name} from {country}";

serverSideReplace = (template, datas) =>
  datas.map(data => template.replace(/\{([a-z]+)\}/g, (_, key) => data[key]));

console.log(serverSideReplace(templateSentToBackend, dataSentToBackend));