ReactJs如何在点击事件中更改按钮的图标?

时间:2017-01-25 13:31:52

标签: javascript reactjs

我正在使用material-ui中的IconButton,我想在点击/触摸事件后更改按钮的图标。

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"}仅评估一次,之后不再评估。我想如果我改变状态,我会强行重新渲染?我做错了什么?

编辑:补充说iconButton已分配给变量。如果我将<IconButton>直接包含在render方法中,它可以正常工作。我不得不重新分配变量以使其工作。

4 个答案:

答案 0 :(得分:1)

这是我能想到的最好的:

     <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()

} }>

答案 1 :(得分:1)

设置文字&#34; view_module&#34;或&#34;列表&#34;在<i>元素中不会更改按钮的图标

您需要在按钮中设置嵌套图标,例​​如:

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

答案 2 :(得分: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'));

我正在使用bootstrap,但任何图标系统都可以使用

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

答案 3 :(得分:1)

<IconButton>使用的图标由其图标类别道具定义。

之后可能看起来像这样。

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