【问题标题】:How to render style for child component individually?如何单独渲染子组件的样式?
【发布时间】:2017-09-07 03:56:45
【问题描述】:

我正在阅读 React.js 网站上的反应教程(井字游戏),我想在用户单击每个方块时单独设置它的样式。更具体地说,当轮到玩家 X 时,方块应该变成红色轮到玩家 O 时变成蓝色。我尝试使用道具和状态来改变颜色。但是,react 会更改所有方块,而不是单独更改方块的颜色。

以下是我目前尝试过的。

import React from 'react';
import ReactDOM from 'react-dom';

function Square (props) {

  let style={
    backgroundColor:props.bgColor,
    background:'#fff',
    border: '1px solid #999',
    float: 'left',
    fontSize: '24px',
    fontWeight: 'bold',
    lineHeight: '34px',
    height: '34px',
    marginRight:'-1px',
    marginTop: '-1px',
    padding: 0,
    textAlign:'center',
    width: '34px' 

    }
    return (
      <button className="square" style={style}onClick={props.onClick} >
        {props.value}
      </button>
    );

  }

  class Board extends React.Component {
    constructor() {
      super();

      this.state = {
        squares: Array(9).fill(null),
        xIsNext:true,
        color:'white'
      };
    }

    handleClick=(i)=>e=> {     
      const squares = this.state.squares.slice();

      if(calculateWinner(squares) ||squares[i]){
          return;
      }
      squares[i] = this.state.xIsNext?'X':'O';

      this.setState({squares: squares,
    xIsNext:!this.state.xIsNext});
    }

    renderSquare(i) {
      return (
        <Square
          value={this.state.squares[i]}
          onClick={ this.handleClick(i)}
          bgColor={this.state.xIsNext?'red':'blue'}
        />
      );
    }

    render() {
      const winner = calculateWinner(this.state.squares);
      let status;
      if(winner){
        status ="Winner: "+winner;
      }else{
        status = 'Next player: '+(this.state.xIsNext?'X':'O');
      }
      let boardStyle={        
              clear: 'both',
              content: "",
              display: 'table'        
          }
      return (

        <div>
          <div className="status">{status}</div>
          <div className="board-row" style={boardStyle}>
            {this.renderSquare(0)}
            {this.renderSquare(1)}
            {this.renderSquare(2)}
          </div>
          <div className="board-row" style={boardStyle}>
            {this.renderSquare(3)}
            {this.renderSquare(4)}
            {this.renderSquare(5)}
          </div>
          <div className="board-row" style={boardStyle}>
            {this.renderSquare(6)}
            {this.renderSquare(7)}
            {this.renderSquare(8)}
          </div>
        </div>
      );
    }
  }

  class Game extends React.Component {
    render() {

      return (
        <div className="game">
          <div className="game-board">
            <Board />
          </div>
          <div className="game-info">
            <div>{/* status */}</div>
            <ol>{/* TODO */}</ol>
          </div>
        </div>
      );
    }
  }  
  // ========================================  
  ReactDOM.render(
    <Game />,
    document.getElementById('root')
  );

  function calculateWinner(squares){
    const lines =[
      [0,1,2],
      [3,4,5],
      [6,7,8],
      [0,3,6],
      [1,4,7],
      [2,5,8],
      [0,4,8],
      [2,4,6]
    ];

    for(let i = 0;i<lines.length;i++){
      const [a,b,c] = lines[i];
      if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
        return squares[a];
      }
    }
    return null;

  }

【问题讨论】:

    标签: javascript css reactjs


    【解决方案1】:

    您可以根据自己的值来决定每个方块内的背景颜色。如果是“X”,则将其标记为红色,如果是“O”,则将其标记为蓝色。

    let style={
        backgroundColor: {props.value === 'X' ? 'red' : 'blue'},
    

    【讨论】:

      【解决方案2】:

      您也可以在renderSquare 中执行此操作:

      <Square value={this.state.squares[i]}
              onClick={ this.handleClick(i)}
              bgColor={this.state.squares[i]=='X'?'red':'blue'}/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-14
        • 2019-12-10
        • 1970-01-01
        • 2018-07-08
        • 2021-07-16
        • 2020-12-08
        • 2019-02-24
        • 1970-01-01
        相关资源
        最近更新 更多