【问题标题】:Using Template Literals with Lodash _.template()在 Lodash _.template() 中使用模板文字
【发布时间】:2019-06-10 13:48:16
【问题描述】:

我正在尝试将模板文字与 Lodash'_.template() 结合使用,根据来自另一个确定打开/关闭的函数的响应从 JSON 文件中选择一条消息,但它对我不起作用。

流程:

  • 函数运行逻辑并通过opencloseResponse.openclose 对象返回openclose(假设工作正常,但未显示在下面的代码sn-p 中)
  • 使用 Lodash _.template() 我将 messages.openmessages.close 与用户的名字作为 first_name
  • 显示消息文本

没有模板文字的工作示例

messages.json

{
  "messages": {
    "open": "Hello ${ first_name }! We are open!",
    "closed": "Hello ${ first_name }! We are closed!"
  }
}

app.js

const _ = require('lodash');
const { messages } = require('messages.json');

const sendMessage = _.template(messages.open);
console.log(sendMessage({ first_name: 'Jeremy' }));

output

Hello Jeremy! We are open!

使用模板文字的失败示例

messages.json

{
  "messages": {
    "open": "Hello ${ first_name }! We are open!",
    "closed": "Hello ${ first_name }! We are closed!"
  }
}

app.js

const _ = require('lodash');
const { messages } = require('messages.json');

const sendMessage = _.template(`messages.${opencloseResponse.openclose}`);
console.log(sendMessage({ first_name: 'Jeremy' }));

output

messages.open

我希望我缺少一些简单的东西。一整天都让我发疯。感谢您的帮助!

【问题讨论】:

    标签: javascript node.js lodash template-literals


    【解决方案1】:

    Lodash 的模板和 JavaScript 的模板字面量是完全不同的动物。如果你想继续使用那些 JSON 文件,你不会使用 JavaScript 的模板文字,你只需要使用动态属性访问:

    const sendMessage = _.template(messages[opencloseResponse.openclose]);
    console.log(sendMessage({ first_name: 'Jeremy' }));
    

    如果你想使用模板文字,让它们可重用的方法是将它们包装在 functions 中。例如,您可能有一个messages.js,而不是您的messages.json

    exports.messages = {
      "open": (first_name) => `Hello ${ first_name }! We are open!`,
      "closed": (first_name) => `Hello ${ first_name }! We are closed!`
    };
    

    然后

    const messages = require('./messages');
    
    console.log(sendMessage(messages[opencloseResponse.openclose]('Jeremy')));
    

    如果您愿意,也可以让函数接受一个对象,就像您的 Lodash 代码一样:

    exports.messages = {
      "open": ({first_name}) => `Hello ${ first_name }! We are open!`,
    //         ^----------^-------------------------------------------------- destructuring
      "closed": ({first_name}) => `Hello ${ first_name }! We are closed!`
    //           ^----------^------------------------------------------------ destructuring
    };
    

    然后

    const messages = require('./messages');
    
    console.log(sendMessage(messages[opencloseResponse.openclose]({first_name: 'Jeremy'})));
    

    【讨论】:

    • 谢谢你,TJ。我将更新我上面的问题以删除await,因为这是我给它“厨房水槽”尝试的神器,不应该将它放入我的问题代码中。感谢您提供多种解决方法!
    【解决方案2】:

    您不需要模板文字。

    只需使用方括号 [] 符号即可访问 message 属性

    const sendMessage = await _.template(messages[opencloseResponse.openclose]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多