2016-03-27 18 views
7

私は以下のようなJSを持っています。 mdl-js-layoutを削除すると、ボタンのonClickが機能することがわかります。それ以外の場合は失敗します。これはなぜでしょうか?私はすでにのonClickが拘束されることになっている私が反応デバッガツールに見れば、私が実際に見ることができますcomponentHandler.upgradeDom()ReactJS&Google MDLボタンonClickが動作しない

'use strict'; 

module.exports = React.createClass({ 
    componentDidMount: function() { 
    console.log('update') 
    componentHandler.upgradeDom(); 
    }, 

    addExpense: function() { 
    console.log('add expense'); 
    }, 

    render: function() { 
    return (
     <div ref="appLayout" className="mdl-layout mdl-js-layout mdl-layout--fixed-drawer"> 
     <div className="mdl-layout__drawer"> 
      <span className="mdl-layout-title">Expenses</span> 
      <nav className="mdl-navigation"> 
      <a className="mdl-navigation__link" href="#">Expenses</a> 
      <a className="mdl-navigation__link" href="#">Settings</a> 
      </nav> 
     </div> 

     <main className="mdl-layout__content"> 
      <div className="page-content"> 
      <div className="mdl-grid"> 
       <div className="mdl-cell mdl-cell--12-col"> 
       <button ref="btnAddExpense" onClick={this.addExpense} className="mdl-button mdl-js-button mdl-button--raised mdl-button--accent"> 
        Add Expense 
       </button> 
       </div> 
      </div> 
      </div> 
     </main> 
     </div> 
    ); 
    } 
}); 

をやっていますか?

enter image description here

+0

https://github.com/tleunen/react-mdl/issues/254 - この情報が役立つ場合があります。クリックハンドラが正しい 'this'オブジェクトを含むクロージャであることを確認してください。 –

答えて

1

それはMDLが反応と互換性がないように見える、と作業から反応するコンポーネントからのクリックイベントを防ぎます。うまくいけば、これは将来のアップデートで修正されるだろうが、それまではコンポーネントをマウントした後にイベントを手動で再追加することで対処できる。

componentDidMount: function() { 
    componentHandler.upgradeDom(); 
    var button = this.refs.btnAddExpense; 
    button.addEventListener('click', this.addExpense); 
}, 

Demo

+0

Agreed Reactは動的テンプレートを使用しているため、要素をアップグレードする必要があります。他のいくつかの問題を扱うreact-mdlプロジェクトもあります。 http://dragablz.net/2015/07/14/react-js-and-material-design-lite/に従って、componentHandler.upgradeElement()はupgradeDom()よりも少し軽いかもしれません。それが役に立てば幸い。 –

1

うまくいけばthisは、あなたの質問に答える:資源を活用し は、それが明らかにDOMをタッチする必要はありません使用。

HTML 
<script src="https://facebook.github.io/react/js/jsfiddle-integration-babel.js"> 
</script> 

<div id="container"> 
    <!-- This element's contents will be replaced with your component. --> 
</div> 

JS 
var Widget = React.createClass({ 
    handleBtnClick: function(e) { 
    e.preventDefault(); 
    alert("clicked!"); 
    return true; 
    }, 

    render: function() { 
    return <div > 
     <form> 
     < button className = "mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-textfield--full-width mdl-button--facebook" 
      onClick = { 
      this.handleBtnClick 
      } > 
      Click MEEEEEE! 
     </button> </form> </div>; 
    } 
    }); 

    ReactDOM.render(< Widget/> , 
    document.getElementById('container') 
); 
+0

'mdl-js-layout'を使うと動作しないことがわかりました –

+0

はい。それに対処するには、react-mdlプロジェクトを見てください。 –

+0

これは、おそらくアリの丘に原子爆弾を投げたようなものですが、反応とmdlは膨大な資源を持つ企業から急速に進化しているフレームワークなので、react-mdlプロジェクトは発生する非互換性の収集ポイントとして機能します。 –

関連する問題