【问题标题】:Using React, how do I make the value of my variable dynamic?使用 React,我如何使变量的值动态化?
【发布时间】:2017-10-17 03:38:12
【问题描述】:

我希望能够做到这一点:

for(let i = 0; i < this.props.user.cart.length; i++) {
  return (
    <div>
      {"products.desserts." + this.props.user.cart[i] + ".name"}
    </div>
  );
}

让 JSX 将其读取为对我的 json 的调用。相反,它只是吐出一个字符串。

它给出的字符串是 products.desserts.cakes.cake1.name,如果它实际访问我的 json 文件中的名称,这是正确的。

我看到了一些关于动态变量名称的东西,但我不确定这是否是正确的方向,因为我在尝试时不断出错。 (顺便说一下,对 React 很陌生)

【问题讨论】:

  • 输出的字符串是什么?它应该输出一个字符串,只是可能不是你想要的。
  • 它应该返回产品的名称。所以在这种情况下,this.props.user.cart[0] 等于 cakes.cake1,它与其他所有内容都会返回“巧克力蛋糕”
  • 读错了,目前输出的是“products.desserts.cakes.cake1.name”
  • 我的回答对你有用吗?

标签: javascript reactjs


【解决方案1】:

您可以使用字符串而不是点 . 访问对象键。

for(let i = 0; i < this.props.auth.cart.length; i++) {
  return (
    <div>
      {products.desserts[this.props.user.cart[i].name]}
    </div>
  );
}

编辑
作为您评论的后续行动:

我希望它访问“products.desserts.cakes.cake1.name

cakes.cake1 不是对象的有效键,因此您需要拆分数组中值的. 并使用双括号。
所以在你的情况下:

{
  const splitedKeys = this.props.user.cart[i].split(".");
  const key1 = splitedKeys[0];
  const key2 = splitedKeys[1];
  products.desserts[key1][key2].name
}

一个简单的例子:

const products = {
  desserts: {
    cakes: {
      cake1: {
        name: 'cake 1'
      },
      cake2: {
        name: 'cake 2'
      }
    }
  }
}

const cart = ['cakes.cake1', 'cakes.cake2'];

cart.forEach((val) => {
  const splitedKeys = val.split('.'); // split the values by the "."
  const key1 = splitedKeys[0] // left side of the "."
  const key2 = splitedKeys[1] // right side of the "."
  console.log(products.desserts[key1][key2].name)
});

【讨论】:

  • 这给了我错误“无法读取未定义的属性'名称'”。
  • 我不确定products.desserts 是一个数组还是一个对象,以及你在那里得到什么样的结构。我猜是products.desserts[this.props.user.cart[i].name]products.desserts[this.props.user.cart[i]].name。再次取决于您的数据结构
  • 我有一个我正在使用的 json 文件。所以基本上我希望它访问“products.desserts.cakes.cake1.name”,this.props.user.cart[0] 的值为“cakes.cake1”
  • 好吧 cakes.cake1 不是对象的有效键。您应该用点 (.) 分割该值并尝试使用双破解访问它。我会更新我的答案
  • 这成功了!谢谢!我想把 cakes.cake 推到购物车上对我来说是个糟糕的选择。
【解决方案2】:

如果您尝试输出字符串products.desserts.someValue.name,那么这将起作用:

for(let i = 0; i < this.props.auth.cart.length; i++) {
  return (
    <div>
      products.desserts.{this.props.user.cart[i]}.name
    </div>
  );
}

你所拥有的也可以,但是这更干净一些。

如果你想输出变量products.desserts.someValue.name,那么你可以这样做:

for(let i = 0; i < this.props.auth.cart.length; i++) {
  return (
    <div>
      {products.desserts[this.props.user.cart[i]].name}    
    </div>
  );
}

基本上,只将实际动态的部分视为动态,将其余部分视为正常变量。

【讨论】:

    【解决方案3】:

    一些陷阱:

    1. 组件必须返回一个反应元素(在 JSX 中基本上是一个 div 、 span 等)或 null。确保您返回一个且仅一个反应元素,而不是多个。如果还有更多,请将它们包装成一个并返回包装器。
    2. 如果你给出的代码是从组件返回的,你可以这样做:

      const items= this.props.auth.cart.map((item, index) => {
                 let val = products.desserts[this.props.user.cart[index]];
                 return (
                      <div>
                           {val && val.name}
                     </div>
                 );
      });
      

    然后只返回包装在 div 中的项目。

    【讨论】:

      【解决方案4】:

      删除字符串引号并将您的 JSX 包裹在 {}:

      for(let i = 0; i < this.props.auth.cart.length; i++) {
        const item = products.desserts[this.props.user.cart[i]];
        return (
          <div>
            {item ? item.name : 'N/A'}
          </div>
        );
      }
      

      【讨论】:

      • @Sag1v 哈哈好吧,我想这是怎么回事??
      • 悲哀地不起作用:/这告诉我它无法读取未定义的属性名称
      • @Sophie 更新了答案。不过,这很可能意味着您的数据有问题,或者 this.props.user.cart 不包含正确的数据。
      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 2021-07-04
      • 2021-10-16
      相关资源
      最近更新 更多