是否可以将带标签的模板文字与保存为常量的模板文字一起使用?

时间:2019-12-04 15:23:17

标签: javascript node.js ecmascript-6 template-literals

我正在开发一种使用多种语言的应用程序。我们不使用像'i18n'这样的包,而是-因为字符串文字的数量不是很大-使用这样的系统:

// constants
const GREETING = 'greeting'

// es.js -- a language object

const aLanguageObject = {[GREETING] : '¿Cómo estás?'}

// helper function
const getText(selector) = currentLanguageObject[selector]

// usage file
const greetingPhrase = getText(GREETING);

其中currentLanguageObjectes.jsen.js等之一,也就是说,已经定义的languageObject之一(我们根据{{1}选择}值)

我们希望能够使用标记的模板文字将值插值到保存为常量的这些模板文字中。

我试图像这样使带标签的模板文字在我们的系统中工作:

process.env

但numberConfirmString为// en.js const aLanguageObject = {[CONFIRM_NUMBER] : `is the number ${0} correct?`} and then use tagged templates like this const theNumber = 12; const myTag = (strings, numberExp) => `${strings[0]}${theNumber}${strings[1]}`; const numberConfirmString = myTag`${getText(CONFIRM_NUMBER)})`;

有没有办法“填写”保存为常量的模板文字?任何帮助,不胜感激!

1 个答案:

答案 0 :(得分:1)

语法:

const obj = {[key] = value}

应该是:

const obj = {[key]: value}

否则,会出现SyntaxError。

除此之外,我认为这样的方法应该起作用:

function generaTemplate (strings, ...keys) {
  return function(data) {
    let temp = strings.slice();
    keys.forEach((key, i) => {
      temp[i] = temp[i] + data[key];
    });
    return temp.join('');
  }
}

const userTpl = user => generaTemplate`<article>
  <p>Name: ${'name'}</p>
  <p>Age: ${'age'}</p>
</article>`(user);

const users = [{
  name: 'Eric',
  age: '10'
}, {
  name: 'Rob',
  age: '20'
}];

const usersList = users.reduce((acc, user) => {
  return acc + userTpl(user);
}, '');

console.log(usersList);

它返回以下内容:

<article>
  <p>Name: Eric</p>
  <p>Age: 10</p>
</article><article>
  <p>Name: Rob</p>
  <p>Age: 20</p>
</article>

您也可以使用:

const welcome = param => `Hello, ${param}`;
console.log(welcome('world'));

输出:

你好,世界

检查以下内容:Defer execution for ES6 Template Literals