2017-10-27 14 views
0

2つの反応クラスにはボタンを使用してフォームを返すレンダリング関数があります。クラスBからフォームを使用できるように、クラスBをインポートする必要がありました。React ES5:1つのボタンが2つの関数を呼び出す

私の問題:内部ボタンをクリックすると、外側ボタンもトリガーされますが、内部送信ボタン働く

私の試み:私はコンソールをチェックし、それは私に警告与えていることが判明:validateDOMNestingを:フォームは、フォームの子孫として出現することはできません。

私は研究を行い、問題はネストされたフォームの可能性があると考えました。だから私は、<div></div>にクラスBの<form></form>を変更することで、SOから回避策を見つけました。これはもはやフォームではありません。今はコンソール上でエラーが出ることはありませんが、問題はまだ残っています。内側のボタンをクリックすると、外側のボタンもトリガーされ、合計で2つの関数が呼び出されます。 (私は多分、タグを変更すると、ネストされたフォームの問題を変更しないか、多分私は他のクラスを参照する方法方法は完全に適切ではないん考えています私は本当にこのような現象を発生させるかを把握したい:私は助けを必要と

マイコード:を私は唯一の "handleRegAdd" 機能を起動する必要があり、クラスB、からボタンをクリックしたときに(

var classA = React.createClass({ 
    render: function() { 
    return (
     <div> 
     <form 
      className={this.props.className} 
      id={this.props.controllerSingular + '_form'} 
      onSubmit={this.handleSubmit} 
      ref="some_form" 
     > 
      <FieldSet> 
      <ClassB id={this.state.id} /> 
      </FieldSet> 
      <button onClick={this.submit} className="btn btn-primary"> 
      Save 
      </button> 
     </form> 
     </div> 
    ) 
    }, 
}) 

var classB = React.createClass({ 
    render: function() { 
    return (
     <div> 
     <button id="some_ID" className="some_name" onClick={this.handleRegAdd}> 
      Add 
     </button> 
     </div> 
    ) 
    }, 
    handleRegAdd: function() { 
    var that = this 
    var regLines = this.state.regulation 
    regLines.push({ 
     reg_id: null, 
     Type: $('.reg-type-select span.Select-value-label').text(), 
     id: that.props.id, 
     Hours: null, 
     Minutes: null, 
     Days: '', 
     Start: null, 
     End: null, 
    }) 

    this.setState({ 
     regulations: regLines, 
    }) 
    }, 
}) 

)私はそれを簡略化していることに注意してください。ただし、クラスAのサブミット機能を起動しました

+0

残念ながら、この単純化は問題の理解に不可欠なものを省いています。 'handleRegAdd'はどこに定義されていますか?参考までに、div内に他のものがなければ、div内にボタンをラップする必要はありません。 – Sia

+0

しかし、答えはたぶんあなたが 'button'を使っていることで、ボタンのデフォルトの型は' submit'です。この投稿を参照してください。https://stackoverflow.com/questions/2825856/html-button-to-not-submit-form – Sia

+0

@Sia私はhandleRegAddを更新しました。それは基本的に状態を設定した、それだけです。上記のコードのロジックが正しいと思われる場合は、エラーは他のものからのものであることを意味します。私はそれを調べます。たぶんそれは私が思った何かに起因するものではないかもしれません。 – aDev

答えて

2

このエラーはvalidateDOMNestingという警告には関係しません。

ボタンクリック(および他のDOMイベント)はコンポーネントツリーをバブルアップします。つまり、ボタンをクリックすると、のすべての親コンポーネントのonClickイベントが発生します。

イベントハンドラでevent.preventDefault()を呼び出すと、バブリングを停止できます。それは次のようになります。ボタンの

handleRegAdd: function(event) { 
    event.preventDefault() 

    // continue with the rest of your code 
} 
+0

同様の問題を引き起こす原因は他にありますか?この特定の構造の名前は反応するのでしょうか?今、私はリアクションの知識を欠いているように感じ、それについてもっと読むことを望んでいるので、「コンポーネントツリーをバブルアップする」ことについて本当に興味がありますが、それについての読書を見つけることはできません。 – aDev

+0

これは(イベントのバブリング)がReactに固有のものではありません。この回答はhttps://stackoverflow.com/a/4616720/1424833で読むことができます。 –

0

デフォルトtypeはそう単純buttonに種類を変更し、ボタンがフォームのonSubmitアクションを実行しない持っている、submitです:

<button type="button" id="some_ID" className="some_name" onClick={this.handleRegAdd}> 
    Add 
</button> 

私が言及しましたこれは私のコメントであり、このSOの質問でもカバーされています。HTML button to NOT submit form

関連する問題