【问题标题】:JSX if statement in template literal模板文字中的 JSX if 语句
【发布时间】:2018-11-02 14:39:07
【问题描述】:

我正在使用 JSX 渲染以下 HTML

<div data-things="{"somethingOne": 1, "somethingTwo": 22, "somethingThree": 'some string'}">
</div>

在 JSX 中我有

const data = `{
  "somethingOne": ${valueOne}, 
  "somethingTwo": ${valueTwo}, 
  "somethingThree": ${valueThree}
}`;

返回

<div data-things={ data }><div>

这很好用,但现在我尝试在模板文字中添加条件以仅在值存在时显示属性-值对。

我尝试了很多变化,包括:

const data = `{
  "somethingOne": ${valueOne}, 
  ${valueTwo} && "somethingTwo": ${valueTwo},
  "somethingThree": ${valueThree}
}`;

条件渲染:

22 && "initialSlide": 22,

它显示值但返回条件语句语法而不是处理它。

我怎样才能使条件有效?我必须为每一个添加条件。

【问题讨论】:

  • Hm .. 看起来您正在尝试将 JSON 字符串化字符串传递给 data-things。我对吗?如果是这样 - 您可以尝试仅对对象文字进行字符串化,而不是进行字符串插值。 You can check my detailed answer.

标签: reactjs jsx


【解决方案1】:

根据您的问题:

您可以在占位符 (${}) 中使用 三元运算符,如下所示:

const data = `{
  "somethingOne": ${valueOne}, 
  ${ valueTwo ? `"somethingTwo:" ${valueTwo},`: '' }
  "somethingThree": ${valueThree}
}`;

伪代码示例

const data = `{
  ${ true ? '"key": "value",' : '' }
  "key1": "value1",
  ${ false ? '"key2": "value2",' : '' }
}`


console.log(data)

...但是您要解决什么问题?

我猜我们这里有XY Problem

也许我错了 - 但您正在尝试创建一个字符串化对象?

如果是这样,您可以简单地以conditionally creating an object literal 进行操作,然后将其字符串化:

const data = {
  ...true ? { key: 'value' } : {},
  key1: 'value',
  ...false ? { key2: 'value2' } : {}
}

console.log(JSON.stringify(data))

【讨论】:

  • 绝妙的答案!非常感谢您考虑实际问题。似乎字符串化是最好的解决方案。要正确隐藏一个值:如果不存在值,我可以使用.. ...value ? { key: value } : {} ?
  • 没错。使用这种语法 - 如果三元为假,您将隐藏该值。如果答案对您有帮助 - 您可以接受/投票。谢谢。 :)
  • 您已接受答案,这与投票不同。但是 - 谢谢你:)
  • 接受就是我的意思:)
【解决方案2】:

我认为这应该可行。请试一试

     const two = valueTwo ? `"somethingTwo": ${valueTwo},`:"";
     const data = `{
         "somethingOne": ${valueOne}, 
         ${two}
         "somethingThree": ${valueThree}
      }`;

【讨论】:

  • 谢谢!我试过了,但它只返回值 22: 22, 而不是 "somethingTwo": 22,
猜你喜欢
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 2020-01-27
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多