2017-05-27 104 views
0

Im在ReactJS中编译项目。我有一些可以被用户点击的div。默认情况下,每个div的背景颜色应该设置为绿色,但点击后它应该变成红色(意味着这个特定的div已经被点击并且进一步点击它不会有任何区别)。我设置CSS类的想法是在className内部,我有一个基于数组中对应值的三元if语句。我提出的解决方案没有做任何事情,没有出现任何错误。我怎样才能实现我的目标?如何根据ReactJS中的状态变量值分配CSS类

代码:

var style = require('./board.css'); 

var React = require('react'); 

class board extends React.Component { 
    constructor(props) { 
     super(props); 
     this.handleClick = this.handleClick.bind(this); 
     this.state = { 
      fieldClicksArray: [ 
       false, false, false, 
       false, false, false, 
       false, false, false 
      ] 
     } 
    } 

    handleClick(index) { 
     if (this.state.fieldClicksArray[index] === false) { 
      this.state.fieldClicksArray[index] = true; 
    } 

    render() { 
     return (
      <div className="parent"> 
        <div className={this.state.fieldClicksArray[0] ? 'red' : 'green'} onClick={() => this.handleClick(0)}>1</div> 
      </div>//parent 
     )//return 
    }//render 
}//class 

export default board; 

的CSS:

.red { 
    background-color: red; 
} 

.green { 
    background-color: green; 
} 

回答

0

class Board extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
     this.handleClick = this.handleClick.bind(this); 
 
     this.state = { 
 
      fieldClicksArray: [ 
 
       false, false, false, 
 
       false, false, false, 
 
       false, false, false 
 
      ] 
 
     } 
 
    } 
 

 
    handleClick(index) { 
 
     if (this.state.fieldClicksArray[index] === false) { 
 
      var newArray = this.state.fieldClicksArray; 
 
      newArray[index] = true; 
 

 
      this.setState({ 
 
       fieldClicksArray: newArray 
 
      }) 
 
      } 
 
    } 
 

 
    render(){ 
 
     return(
 
      <div className="parent"> 
 
       <div className={this.state.fieldClicksArray[0] ? 'red' : 'green'} onClick= {()=>this.handleClick(0)}>1</div> 
 
     </div>//parent 
 
     )//return 
 
    }//render 
 
}//class 
 

 
ReactDOM.render(<Board />, document.getElementById("app"))
.red { 
 
    background-color: red; 
 
} 
 

 
.green { 
 
    background-color: green; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id="app"></div>

this.state.fieldClicksArray[index] = true;不会执行任何东西。您需要致电this.setState更改组件的状态。

handleClick(index) { 
     if (this.state.fieldClicksArray[index] === false) { 
      var newArray = this.state.fieldClicksArray; 
      newArray[index] === false; 

      this.setState({ 
       fieldClicksArray: newArray 
      }) 
    } 

使用也setState方法在点击处理程序,您需要将自己的功能绑定到组件,

render() { 
     return (
      <div className="parent"> 
       <div className={this.state.fieldClicksArray[0] ? 'red' : 'green'} onClick= {()=>this.handleClick(0)}>1</div> 
     </div>//parent 
     )//return 
    } 
+0

我相信这行: 'newArray [index] === false;'你想把它设置为true。我改变了这一点。此外,我已经尝试了您的建议,仍然没有任何更改,并没有出现错误 –

+0

@AleksanderSadaj有一些语法错误。我已经删除它们。请参阅片段。 – nrgwsth

+0

由于您在原始阵列上操作,因此这会直接修改状态。 –

4

您需要使用setState()。并克隆该数组,以便不会改变先前的状态。最后,使用setState()的函数形式更好,此时您的下一个状态是从以前的状态计算出来的。

handleClick(index) { 
    this.setState((prevState) => { 
    // make a copy 
    let fieldClicksArray = prevState.fieldClicksArray.slice(); 
    // change one item 
    fieldsClickArray[index] = true; 
    // return next state to be merged 
    return { fieldsClickArray }; 
    }); 
} 

了解更多:https://facebook.github.io/react/docs/state-and-lifecycle.html#using-state-correctly

希望这有助于!

+0

不幸的是在这里。 div获取其红色背景颜色,但它在渲染时发生变化 - 用户没有机会单击它自己,因为在页面呈现div时已经是红色。在onClick我用箭头功能,所以它不应该立即触发,对吧? –