web-dev-qa-db-ja.com

Reactフォーム送信の処理

React/Reduxでフォームを作成しようとしています。今のところ、フォームが送信されたときに、フォームが関数handleSubmitをトリガーするようにします。しかし、現時点では、ページのロード時に関数が即座にトリガーされるようです...

export default class AssetsAdd extends React.Component {

  componentDidMount() {
    console.log(this)
  }

  handleSubmit(event) {
    if (this.refs.titleInput !== '') {
      event.preventDefault();
      var asset = {
        date: '',
        title : this.refs.titleInput.value,
        id : '',
        type: this.refs.typeInput.value
      }

      return this.props.dispatch(addAsset(asset))
    }


  }

  render() {
    return (
      <div>
        <Row>
          <Portlet title='New Asset' form>
            <Form horizontal onSubmit={this.handleSubmit}>
              <FormGroup>
                <Label text='Title' size='3' />
                <Input ref="titleInput" placeholder='Enter asset title' size='4'/>
              </FormGroup>
              <FormGroup>
                <Label text='Type' size='3' />
                <Input ref="typeInput" placeholder='Enter asset type' size='4'/>
              </FormGroup>
              <FormGroup>
                <Label text='Description' size='3' />
                <Input ref="descriptionInput" placeholder='Enter asset description' size='4'/>
              </FormGroup>
              <FormGroup>
                <Label text='Documentation' size='3' />
                <Input ref="documentationInput" placeholder='Enter documentation URL' size='4'/>
              </FormGroup>
              <FormActionBar>
                <SubmitButton value='Submit'/>
                <CancelButton value='Cancel'/>
              </FormActionBar>
            </Form>
          </Portlet>
        </Row>
      </div>
    )
  }
}

function mapStateToProps(state) {
  return {
    assets: state.assets
  };
}

export const AssetAddContainer = connect(mapStateToProps)(AssetsAdd);

コードの残りの部分はまだすべて正しいわけではありませんが、今の主な関心事は、適切なタイミングでonSubmitアクションをトリガーすることです。

前もって感謝します!

7
Matthias

handleSubmitをバインドしていないようです。

ドキュメント から:

メソッドは、通常のES6クラスと同じセマンティクスに従います。つまり、メソッドはこれをインスタンスに自動的にバインドしません。

3つのオプションがあります

  1. コンストラクタを追加し、そこでバインドを行います(推奨):

    this.handleSubmit = this.handleSubmit.bind(this);

  2. 直接バインド:

    onSubmit={this.handleSubmit.bind(this)}

  3. 矢印_=>_関数を使用します

    onSubmit={() => this.handleSubmit}

25
U r s u s