代码之家  ›  专栏  ›  技术社区  ›  arvere

处理ReactJS中受控制字段中的未定义属性

  •  0
  • arvere  · 技术社区  · 6 年前

    所以我刚刚开始学习reactjs,我正在构建一个简单的应用程序来管理一个包含对象的简单列表。

    所有对象都有一些共同的属性“a、b、c”,但有些对象有“d”,有些对象有“e”,有些对象有两个属性,如下所示:

    this.state.list = [
        {
            a: 1,
            b: 2,
            c: 3
        },
        {
            a: 1,
            b: 2,
            c: 3,
            d: 4,
            e: 5
        },
        {
            a: 1,
            b: 2,
            c: 3,
            d: 4
        },
        {
            a: 1,
            b: 2,
            c: 3,
            e: 5
        },
    ]
    

    我将输入绑定到每个不同的属性,这些属性将根据所选项目进行常规更改:

    <input value={this.state.list[selectedIndex].a} />
    <input value={this.state.list[selectedIndex].b} />
    <input value={this.state.list[selectedIndex].c} />
    <input value={this.state.list[selectedIndex].d} />
    <input value={this.state.list[selectedIndex].e} />
    

    问题是,当我更改所选项目时,输入不考虑缺少的属性(因为它们是未定义的)。

    我可以简单地使用一个条件来检查未定义的属性,而不打印输入,但我希望能够在对象中添加“d”和“e”,无论何时在没有它们的对象上填充各自的输入。

    最好的方法是什么?它是可行的还是我应该将所有对象标准化为具有所有属性,即使它们是空的?有没有一个“正确”的方法来完成这项工作(这不会在将来给我带来麻烦)?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Cameron Downer    6 年前

    你可以试试这个

    (selectedIndex) => {
      const {
        a='',
        b='',
        c='',
        d='',
        e=''
      } = this.state.list[selectedIndex];
    
      return (
        <input value={a} />
        <input value={b} />
        <input value={c} />
        <input value={d} />
        <input value={e} />
      )
    }
    

    这叫做 object destructuring 使用默认值。

        2
  •  0
  •   Jayffe    6 年前

    是否尝试在渲染函数中放置类似的内容:

      {
        Object.keys(this.state.list[selectedIndex]).map(input=>(
          <input value={this.state.list[selectedIndex][input]} />
        ))
      }