【问题标题】:A component is changing a controlled input of type text to be uncontrolled组件正在将文本类型的受控输入更改为不受控制
【发布时间】:2018-08-14 21:53:10
【问题描述】:

这是与此相关的我的 sn-ps 代码:

家长:

class PropertyBar extends Component {
  state = {
    selectedCell: graph.selectedCell,
    cellProperties: []
  }

  updateSelectedCell() {
    if (graph.selectedCell != null) {
      this.setState({
        selectedCell: graph.selectedCell,
        cellProperties: Array.from(graph.selectedCell.value.attributes)
      });
    }
  }

  onChangeHandler = (e) => {
    console.log(e.target.value);
    let cellProperties = [...this.state.cellProperties];
    cellProperties[parseInt(e.target.id)] = e.target.value;
    this.setState({cellProperties});
  }

  renderPropertyList() {
    return this.state.cellProperties.map((key, i) => {
      return <PropertyBarItem name={key.nodeName} value={key.nodeValue} onChange={this.onChangeHandler} key={i} id={i} />
    })
  }

孩子:

class PropertyBarItem extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <ListItem divider={true} className="property-bar-item">
        <TextField
          id={this.props.id.toString()}
          label={this.props.name}
          value={this.props.value}
          margin="dense"
          onChange={(e) => this.props.onChange(e)}
        />
      </ListItem>
    )
  }
}

当我尝试更改 &lt;TextField&gt; 的 value 时,它会丢失与之配对的原始 label,并且我认为它与父组件状态有任何关系。

然后我收到此错误:组件正在将文本类型的受控输入更改为不受控制。输入元素不应从受控切换到不受控(反之亦然)。决定在组件的生命周期内使用受控输入元素还是不受控输入元素。

我知道这可能是因为我的 cellProperties 状态在开始时是一个空数组,但我的子组件直到数组中有实际值时才会呈现。我对value 字段进行了三元运算,例如value={this.props.value ? this.props.value : ""},但是当我尝试键入时它总是返回一个空字符串。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    因此,我的问题的答案是,由于我将 NamedNodeMap 转换为 Array,因此我忘记在我的状态下添加我在数组中更改的属性。

    所以我应该分配的正确值不是cellProperties[parseInt(e.target.id)] = e.target.value;,而是cellProperties[parseInt(e.target.id)].nodeValue = e.target.value;。

    现在一切正常!

    【讨论】:

    • 现在我正准备写答案:) 一个小问题:) 顺便说一句,我认为你可以接受自己的答案。
    • @devserkan 哈哈及时发现。它说我将不得不等待 2 天,但我会这样做。
    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 2020-11-04
    • 2019-11-16
    • 2018-01-13
    • 2020-11-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多