代码之家  ›  专栏  ›  技术社区  ›  TheUnreal

反应-单击后更改按钮颜色

  •  3
  • TheUnreal  · 技术社区  · 8 年前

    我有以下按钮:

    {this.steps.map((step, index) => (
        <Button variant="raised" color={(step.answer === 'done' ? 'primary' : 'default')}
                                onClick={this.markAs('done', step)}>
                                    Done
                                </Button>
    )}
    

    我的 markAs() 函数如下所示:

    markAs(value, step) {
            step.answer = value;
        }
    

    虽然 step.answer 更改为 done ,按钮的颜色保持不变。

    class App extends Component {
       steps = [...some steps];
    }
    

    发生了什么?

    2 回复  |  直到 8 年前
        1
  •  1
  •   fyasir    8 年前

    仅当组件状态已更改时,才能触发“反应重新渲染”。状态可以从 props 更改,或从直接 setState 改变组件获取更新的状态,并决定是否应重新呈现组件。

    import React, { Component } from 'react';
    
    class MyComponent extends Component {
      constructor(props){
       super(props);
       this.state = {
         step: { answer: '' },
       };
       this.markAs = this.markAs.bind(this);
      }
    
      markAs() {
       this.setState({ step: { answer: 'done' } });
      }
    
      render(){
       return (
         <Button
           variant="raised"
           color={(this.state.step.answer === 'done' ? 'primary' : 'default')}
           onClick={this.markAs}
          > Done
          </Button>
       );
      }
    }
    
        2
  •  0
  •   oklas    8 年前

    您需要使用react组件 state . 初始化对应按钮的默认值。并在完成后更改状态。

    constructor(props) {
      super(props)
      this.state = {
      }
      steps.forEach( (item,i) => {
        this.state[i] = 'not done'
      })
    }
    
    renderStep(step,stepId) {
      return (
        <Button
          variant="raised"
          color={this.state[stepId] === 'done' ? 'primary' : 'default')}
          onClick={this.setState({[stepId]:'done'}
        >
          Done
        </Button>
      )
    }
    

    在渲染中,需要这样调用(其中 stepId 是步进阵列中的位置)

    <div>
      {renderStep(step,stepId)}
    </div>