2017-01-25 5 views
1

IconButtonmaterial-uiから使用しており、クリック/タッチイベントの後にボタンのアイコンを変更したいとします。ReactJsクリックイベントのボタンのアイコンを変更するにはどうすればいいですか?

var tableModeElement = 
<IconButton key="tableModeButton" 
onTouchTap={() => { 
    this.setState(prevState => (
    { isCardView: !prevState.isCardView })) } }> 
    <i className="material-icons theme-color-p1"> 
    {this.state.isCardView ? "view_module" : "list"} 
    </i> 
</IconButton> 

{this.state.isCardView ? "view_module" : "list"}は一度だけ評価される式とその後これ以上。私は状態を変更すれば再レンダリングを強制するだろうと思った?私は間違って何をしていますか?

EDIT:iconButtonが変数に割り当てられました。 <IconButton>をレンダリングメソッドに直接含めると正常に動作します。私はそれを動作させるために変数を再割り当てしなければならなかった。

+0

どのアイコンセットを使用し、どのように統合するかを教えてください。 – skAstro

答えて

1

これは、私が思い付くことが最高です:あなたが持っている必要がありますボタン

のアイコンを変更しません<i>要素内のテキスト「view_module」または「リスト」を設定

 <IconButton key="tableModeButton" onTouchTap={(e) => { 

     let show = this.state.prevState.isCardView; 
     let index = show.indexOf('show'); 

     if (index != -1) { 
      show = 'hide'; 
     } else { 
      show = 'show'; 
     } 

     this.setState(prevState => ({ isCardView: show })); 
     event.preventDefault() 

} }> 
+0

これは私が探しているものではありません。私はそれを隠したくありません。もっとアイコンのように反転してください。 –

+0

実際に私が使用した名前はあなた自身のクラスを使うことができる例で、私は原則を示したかっただけです:) –

1

ボタン内のネストされたアイコン、例えば:

<IconButton key="tableModeButton" 
onTouchTap={() => { 
    this.setState({ 
    isCardView: !this.state.isCardView 
    }) 
    }}> 
    {this.state.isCardView ? <IconA /> : <IconB /> } 
</IconButton> 
+0

私はこれを試しました。 –

+0

私はちょうど編集した別の設定された状態の呼び出しでそれを試してください – Marty

1

私はこれがうまくいくと信じて:

class IconButton extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     isCardView: false, 
    } 
    } 

    render() { 
    return (
     <a className="btn btn-primary" onClick={()=>this.setState({ isCardView: !this.state.isCardView })}> 
     { this.state.isCardView 
      ? <span className="glyphicon glyphicon-remove-sign" /> 
      : <span className="glyphicon glyphicon-ok-sign" /> 
     } 
     &nbsp;&nbsp;BUTTON 
     </a> 
    ); 
    } 

} 

class App extends React.Component { 
    render() {           
    return (
     <div> 
     <IconButton /> 
     </div> 
    ); 
    } 
} 

ReactDOM.render(<App/>,document.getElementById('root')); 

私は、ブートストラップを使用していますが、任意のアイコンシステムが<IconButton>で使用するアイコンは、それがiconClassName小道具だによって定義され

http://codepen.io/cjke/pen/MJvXNo?editors=0010

+0

これはおそらくうまく動作します。私は私の構造にいくつかの論理エラーがありました。変数に格納されているため、再レンダリングを強制的に呼び出す必要があります。 –

+0

興味のないところでは、なぜそれを変数に格納していますか? 10回中に9回、再レンダリングを強制的に行う必要はありません。 – Chris

+0

これは大きなUIの一部であり、物事をモジュラーに保つためのものです。それは基本的にヘッダーに属します。 –

1

を働くだろう。

これは後でこのように見える可能性があります。

<IconButton key="tableModeButton" 
    onTouchTap={() => { 
    this.setState(prevState => {isCardView: !prevState.isCardView}) } 
    } 
    iconClassName={this.state.isCardView ? "view_module" : "list"} /> 
</IconButton> 
関連する問題