如何将文本框绑定到 React 状态中的复杂对象?

How can I bind a text box to a complex object within state in React?

背景

我正在使用他们基于 React 的入门工具包和 TypeScript 构建一个办公插件。我提到这个是因为据我所知我无法获得很好的调试支持,所以我无法看到 React 在我当前情况下提供的错误消息。

我在尝试什么

(下面进行了简化。如果您愿意,我可以更具体;让我知道。)

我的 AppState 有一个接口,还有一个具有某些属性的复杂对象:

export interface AppState {
  eventInput: EventInput;
}

export class BookendEventInput {
  public minutesAdjacent: number = 30;
  public subject: string = "";
  public enabled: boolean = false;
  public eventId: string = "";
}

我有一个工作场景,它是一个复选框:

<Checkbox id="enableBookendBefore" checked={this.state.eventInput.enabled} onChange={this.eventInputCheckboxChanged}></Checkbox>

即通过更改函数更新状态:

eventInputCheckboxChanged = () => {
    this.setState((state: AppState) => {
      var newValue = !this.state.eventInput.enabled;
      var input = state.eventInput;

      input.enabled = newValue;

      state.eventInput = input;
    })
  }

但这不适用于另一种情况。

问题

我现在正尝试对文本框做类似的事情。我有一个输入:

<input type="text" id="subject" disabled={!this.state.eventInput.enabled} value={this.state.eventInput.subject} onChange={this.subjectChanged} />

以及变化函数:

  subjectChanged = (e) => {
    var newSubject = e.target.value;

    this.setState((state: AppState)=> {
      var input = state.eventInput;
      input.subject = newSubject;

      state.eventInput = input;
    })

预期行为:我希望看到主题文本框和状态更新,就好像它们是双向绑定的一样。

实际行为:整个屏幕变成 blank/white,表明我收到了我认为的 React 级错误(因为我不能执行 F12 和无法看到调试输出,因为它位于 Outlook 内的任务窗格中。)

问题

如何使用 React 正确绑定文本框,该文本框绑定到状态内对象中的 属性?是否可以这样做,或者我是否违反了 React 原则?

在这种情况下,您正在使用 setState 的回调来尝试修改状态。这要么没有触发,要么导致无限循环,我不确定是哪一个!

无论哪种方式,要正确修改您需要的状态:

subjectChanged = (e) => {
    var newSubject = e.target.value;
    var input = state.eventInput;

    input.subject = newSubject;

    this.setState({eventInput: input});
});

这将实现您想要的。