表单字段在输入时失去输入焦点

Form field loses input focus on typing

我正在努力实现以下 double,用户可以输入:Account Details & Account Currency

从服务器中检索的数据格式如下:

{
  ...,
  "invoiceConfiguration": {
    "id": 290271069734815,
    "bankConfigs": [
      {
        "bankDetails": "Bank Details Euro",
        "currency": {
          "id": 17592186045607,
          "name": "Euro",
          "iso": "EUR"
        }
      },
      {
        "bankDetails": "USD Test Bank details",
        "currency": {
          "id": 17592186045610,
          "name": "US Dollar",
          "iso": "USD"
        }
      }
    ]},
    ...
}

我在 render() 函数中实现了以下内容。

银行账户
    {_.map(this.state.company.invoiceConfiguration.bankConfigs, (bankConfig, i) => {
      return (
        <div className="row" key={_.uniqueId("bankDetailRow_")}>
          <div className="small-12 medium-6 columns">
            <label>
              Account Details
              <textarea rows="6" value={bankConfig.bankDetails} onChange={event => this.onBankDetailsChange("bankDetails", i, event.target.value)} />
            </label>
          </div>
          <div className="small-12 medium-4 columns">
            <label>
              Currency
              <Select
                name="bankCurrency"
                placeholder="Bank Account Currency"
                value={bankConfig.currency.id}
                options={currencyTypeOptions}
                onChange={_.partial(this.onBankDetailsChange, "currency", i)} />
            </label>
          </div>
        </div>
      )
    })}

onBankDetailsChange()函数定义如下:

onBankDetailsChange(key, pos, val) {
    if (key === "currency") {
      val = {
        id: val.value
      };
    }
    const company = this.state.company;
    let bankAccounts = company.invoiceConfiguration.bankConfigs;
    bankAccounts[pos][key] = val;
    company.invoiceConfiguration.bankConfigs = bankAccounts;
    this.setState({
      company,
      status: "unsaved"
    });
  }

每次我输入内容时,输入字段都会失去焦点。

从这里回答:http://reactkungfu.com/2015/09/react-js-loses-input-focus-on-typing/

在我们的例子中,有问题的代码在这里:

<div className="row" key={_.uniqueId("bankDetailRow_")}>

由于 key 是唯一的,每次状态都会丢弃旧的 div 并在其位置添加一个新的 div。看起来一模一样,但是重点不对

解决方案是使用一个不变的 key。在这里,这有效:

<div className="row" key={i}>