2016-12-29 64 views
1

我做的React Tic Tac Toe starter tutorial且在一开始的问题....反应教程:状态不工作

每平方米应显示其state.value,有一个的onClick方法,设置状态设置为“X” 。点击时应该更新图形用户界面,但不是......我无法在代码中发现错误,对吗?

class Square extends React.Component { 
    constructor() { 
    super(); 
    this.state = {value: null}; 
    } 
    setState(s) {this.state = s;} 
    render() { 
    return (
     <button className="square" onClick={() => this.setState({value:'X'})}> 
     {this.state.value} 
     </button> 
    ); 
    } 
} 

class Board extends React.Component { 
    renderSquare(i) { 
    return <Square value={i}/>; 
    } 
    render() { 
    const status = 'Next player: X'; 
    return (
     <div> 
     <div className="status">{status}</div> 
     <div className="board-row"> 
      {this.renderSquare(0)} 
      {this.renderSquare(1)} 
      {this.renderSquare(2)} 
     </div> 
     <div className="board-row"> 
      {this.renderSquare(3)} 
      {this.renderSquare(4)} 
      {this.renderSquare(5)} 
     </div> 
     <div className="board-row"> 
      {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('container') 
); 

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; 
} 
+0

你为什么要重写国家本身。你应该更新状态内的属性。试试'this.setState({value:s})'。 – Rajesh

回答

1

删除上面render()方法的行,你的setState()定义。您不必创建此方法,它已经为您创建。

+0

不应该这是一个评论? – Rajesh

+0

谢谢,我不知道。所以'state'属性上的getter和setter会自动设置。这是否适用于'state'之外的其他属性?这是React的特性还是ES6本地特性? – olefrank

+0

@Rajesh为什么它应该是一个评论,当它是他的问题的解决方案? –

1

setState是由反应库本身提供的内部方法。您不需要在代码中覆盖它。

class Square extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    this.state = {value: null}; 
 
    } 
 
    render() { 
 
    return ( 
 
     <button className="square" onClick={() => this.setState({value:'X'})}> 
 
     {this.state.value} 
 
     </button> 
 
    ); 
 
    } 
 
} 
 

 
class Board extends React.Component { 
 
    renderSquare(i) { 
 
    return <Square value={i}/>; 
 
    } 
 
    render() { 
 
    const status = 'Next player: X'; 
 
    return (
 
     <div> 
 
     <div className="status">{status}</div> 
 
     <div className="board-row"> 
 
      {this.renderSquare(0)} 
 
      {this.renderSquare(1)} 
 
      {this.renderSquare(2)} 
 
     </div> 
 
     <div className="board-row"> 
 
      {this.renderSquare(3)} 
 
      {this.renderSquare(4)} 
 
      {this.renderSquare(5)} 
 
     </div> 
 
     <div className="board-row"> 
 
      {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('container') 
 
); 
 

 
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; 
 
}
<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="container"></div>