javascript - 启用按钮仅在所有字段均已填写时才提交

标签 javascript reactjs draftjs

我有一个包含 3 个字段的表单。前两个字段是 email_from 和 email_subject,最后一个字段是编辑者。我使用draftjs作为编辑器。如果没有编辑器,我可以启用和禁用提交按钮,但由于包含编辑器,我不知道如何仅在所有字段都填充且没有错误的情况下启用该按钮。

这是我的代码。

AdminEditor是具有draftjs编辑器的组件

class EmailTemplate extends React.Component {
  state = {
    emailSubject: '',
    emailFrom: ''
  };

  handleChange = event =>
    this.setState({ [event.target.name]: event.target.value });

  handleSubmit = event => {
    event.preventDefault();
  };

  render() {
    const { emailSubject, emailFrom } = this.state;
    return (
      <form onSubmit={this.handleSubmit}>
        <FieldGroup
          id="formControlsText"
          name="emailSubject"
          type="text"
          label="Email Subject"
          placeholder="Enter Email Form"
          onChange={this.handleChange}
          validationState={emailSubject ? 'success' : 'error'}
          required
        />
        <FieldGroup
          id="formControlsText"
          name="emailFrom"
          type="email"
          label="Email From"
          placeholder="Enter Email From"
          onChange={this.handleChange}
          validationState={emailFrom ? 'success' : 'error'}
          required
        />
        <AdminEditor />
        <Button type="submit">
          Submit
        </Button>
      </form>
    );
  }
}

export default EmailTemplate;

class AdminEditor extends React.PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      editorState: EditorState.createEmpty(),
      isEmpty: true
    };
  }

  onEditorStateChange = editorState => {
    this.setState({
      editorState
    });
  };

  onEditorChange = editorContent => {
    this.setState({
      editorContent
    });
  };

  handleChange = event =>
    this.state.editorState.getCurrentContent().hasText()
      ? this.setState({ isEmpty: false })
      : this.setState({ isEmpty: true });

  render() {
    const { editorState } = this.state;
    return (
      <div>
        <Editor
          editorState={this.state.editorState}
          initialContentState={rawContentState}
          toolbarClassName="home-toolbar"
          wrapperClassName="home-wrapper"
          editorClassName="home-editor"
          onEditorStateChange={this.onEditorStateChange}
          toolbar={{
            textAlign: { inDropdown: true },
          }}
          onContentStateChange={this.onEditorChange}
          placeholder="write text here..."
          onChange={this.handleChange}
        />
      </div>
    );
  }
}

export default AdminEditor;

有人可以帮我吗?

最佳答案

有很多方法可以做到这一点,主要是将一些回调传递到受控组件中,以更新父级中的状态。 一种简单的方法是传递一个处理程序,该处理程序在编辑器是否为空时设置一个标志:

class AdminEditor extends React.PureComponent {

...

  handleChange = event =>
    this.props.setEditorIsEmpty(
      this.state.editorState.getCurrentContent().hasText()
    );

然后在EmailTemplate中:

setEditorIsEmpty(editorIsEmpty) {
  this.setState({
    editorIsEmpty
  });
}

render() {
  const { emailSubject, emailFrom } = this.state;
  return (
    <form onSubmit={this.handleSubmit}>

      ...

      <AdminEditor
        setEditorIsEmpty={this.setEditorIsEmpty}
      />
      <Button
        type="submit"
        disabled={!emailSubject || !emailFrom || editorIsEmpty}>
        Submit
      </Button>
    </form>
  );
}

关于javascript - 启用按钮仅在所有字段均已填写时才提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44171275/

相关文章:

javascript - 使用带有 html 输入和 html 输出的 draft js

javascript - 如何在dom中访问ajax获取的json对象?

reactjs - 在 EditorJs 中创建自定义元素

javascript - 使用 Node.js 中的 TLS/SSL 隐式加密连接到 FTP 服务器

javascript - 如何在 Facebook Draft.js 中使用装饰器创建 Link 实体

reactjs - DraftJS Modifier.insertText() : Insert Unicode

javascript - 播放音频的定义部分

javascript - 在加载下一页时保持网站事件

Javascript if url等于仅在一页上添加文本的函数

reactjs - "sh: 1: react-scripts: not found"在 Docker 中