mirror of
https://github.com/facebook/docusaurus.git
synced 2025-12-29 05:12:52 +00:00
chore: add pages/tictactoe.js to test reactDOM
This commit is contained in:
parent
d9def2865a
commit
1eef464fc0
|
|
@ -1,4 +1,5 @@
|
|||
import React from 'react';
|
||||
import TicTacToe from './tictactoe';
|
||||
import {Link} from 'react-router-dom';
|
||||
|
||||
export default class Home extends React.Component {
|
||||
|
|
@ -11,7 +12,10 @@ export default class Home extends React.Component {
|
|||
));
|
||||
return (
|
||||
<div>
|
||||
<ul>Available Routes{routeLinks}</ul>
|
||||
<h2> Available Urls </h2>
|
||||
<ul>{routeLinks}</ul>
|
||||
<h2> Play some TicTacToe </h2>
|
||||
<TicTacToe />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,165 @@
|
|||
import React from 'react';
|
||||
|
||||
const square = {
|
||||
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'
|
||||
};
|
||||
|
||||
const boardRow = {
|
||||
clear: 'both',
|
||||
content: '',
|
||||
display: 'table'
|
||||
};
|
||||
|
||||
const game = {
|
||||
display: 'flex',
|
||||
flexDirection: 'row'
|
||||
};
|
||||
|
||||
function Square(props) {
|
||||
return (
|
||||
<button style={square} onClick={props.onClick}>
|
||||
{props.value}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
class Board extends React.Component {
|
||||
renderSquare(i) {
|
||||
return (
|
||||
<Square
|
||||
value={this.props.squares[i]}
|
||||
onClick={() => this.props.onClick(i)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
<div style={boardRow}>
|
||||
{this.renderSquare(0)}
|
||||
{this.renderSquare(1)}
|
||||
{this.renderSquare(2)}
|
||||
</div>
|
||||
<div style={boardRow}>
|
||||
{this.renderSquare(3)}
|
||||
{this.renderSquare(4)}
|
||||
{this.renderSquare(5)}
|
||||
</div>
|
||||
<div style={boardRow}>
|
||||
{this.renderSquare(6)}
|
||||
{this.renderSquare(7)}
|
||||
{this.renderSquare(8)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Game extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
history: [
|
||||
{
|
||||
squares: Array(9).fill(null)
|
||||
}
|
||||
],
|
||||
stepNumber: 0,
|
||||
xIsNext: true
|
||||
};
|
||||
}
|
||||
|
||||
handleClick(i) {
|
||||
const history = this.state.history.slice(0, this.state.stepNumber + 1);
|
||||
const current = history[history.length - 1];
|
||||
const squares = current.squares.slice();
|
||||
if (calculateWinner(squares) || squares[i]) {
|
||||
return;
|
||||
}
|
||||
squares[i] = this.state.xIsNext ? 'X' : 'O';
|
||||
this.setState({
|
||||
history: history.concat([
|
||||
{
|
||||
squares: squares
|
||||
}
|
||||
]),
|
||||
stepNumber: history.length,
|
||||
xIsNext: !this.state.xIsNext
|
||||
});
|
||||
}
|
||||
|
||||
jumpTo(step) {
|
||||
this.setState({
|
||||
stepNumber: step,
|
||||
xIsNext: step % 2 === 0
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
const history = this.state.history;
|
||||
const current = history[this.state.stepNumber];
|
||||
const winner = calculateWinner(current.squares);
|
||||
|
||||
const moves = history.map((step, move) => {
|
||||
const desc = move ? 'Go to move #' + move : 'Go to game start';
|
||||
return (
|
||||
<li key={move}>
|
||||
<button onClick={() => this.jumpTo(move)}>{desc}</button>
|
||||
</li>
|
||||
);
|
||||
});
|
||||
|
||||
let status;
|
||||
if (winner) {
|
||||
status = 'Winner: ' + winner;
|
||||
} else {
|
||||
status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');
|
||||
}
|
||||
|
||||
return (
|
||||
<div style={game}>
|
||||
<div>
|
||||
<Board squares={current.squares} onClick={i => this.handleClick(i)} />
|
||||
</div>
|
||||
<div style={{marginLeft: '10px'}}>
|
||||
<div>{status}</div>
|
||||
<ol>{moves}</ol>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default Game;
|
||||
Loading…
Reference in New Issue