#reactjs #click
#reactjs #нажмите
Вопрос:
Я пытаюсь React.js и я следовал руководству по созданию игры morpion. Теперь я пытаюсь получить выбор пользователя, на который он нажал, и распечатать столбец и строку. Вот что я сделал до сих пор:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
function Square(props) {
return (
<button
className="square"
onClick={props.onClick}
>
{props.value}
</button>
);
}
class Board extends React.Component {
renderSquare(i) {
return <Square
value={this.props.squares[i]}
onClick={ () => this.props.onClick(i)}
/>;
}
render() {
return (
<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 {
constructor(props) {
super(props);
this.state = {
history: [{
squares: Array(9).fill(null),
choice: null,
}],
stepNumber: 0,
xIsNext: true,
};
}
jumpTo(step){
this.setState({
stepNumber: step,
xIsNext: (step % 2) === 0,
});
}
handleClick(i) {
const history = this.state.history.slice(0, this.state.stepNumber 1);
const current = history[history.length - 1];
const squares = current.squares.slice();
//Si quelqu'un a gagné, on empêche le clic
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,
});
}
render() {
const history = this.state.history;
const current = history[this.state.stepNumber];
const winner = calculateWinner(current.squares);
const choice = (current) => { this.calculateChoice(current.squares) };
const moves = history.map((step, move) => {
const desc = move ?
'Revenir au tour n°' move :
'Revenir au début de la partie';
return (
<li key={move}>
<button onClick={() => this.jumpTo(move)}>{desc}</button>
</li>
);
});
let status;
if (winner){
status = winner ' a gagné';
} else {
status = 'Prochain joueur : ' (this.state.xIsNext ? 'X' : 'O');
}
return (
<div className="game">
<div className="game-board">
<Board
squares={current.squares}
onClick={ (i) => {
this.handleClick(i);
} }
/>
</div>
<div className="game-info">
<div>Coup {choice}</div>
<div>{ status }</div>
<ol>{ moves }</ol>
</div>
</div>
);
}
}
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] amp;amp; squares[a] === squares[b] amp;amp; squares[a] === squares[c]){
return squares[a];
}
}
return null;
}
function calculateChoice(squares){
const lines = [
[0,0],[0,1],[0,2],
[1,0],[1,1],[1,2],
[2,0],[2,1],[2,2],
];
for (let i = 0; i < lines.length; i ){
const [a, b] = lines[i];
return "test ".squares[a];
}
return "test";
}
// ========================================
ReactDOM.render(
<Game />,
document.getElementById('root')
);
Я определил постоянный выбор, куда я хочу поместить выбор пользователя. Затем я вызываю calculateChoice, но при попытке { choice } ничего не отображается. Я не знаю почему. Кроме того, я не знаю, как получить строку и столбец, в которых пользователь нажал. Я создал вкладку с различными вариантами, но затем я не знаю, как сравнить их с квадратом, на который нажал пользователь.
Спасибо
Редактировать: итак, я изменил постоянный выбор:
const choice = calculateChoice(current.squares);
Теперь это работает, я получаю отображение. Но я не знаю, как получить столбец и строку, в которых пользователь щелкнул. Я начал с calculateChoice, но я не знаю, куда я иду с этим.
Чего бы я хотел, так это:
Пользователь нажимает на квадрат. На ‘X’ или ‘O’ влияет квадрат, а затем отображается «выбор», который соответствует (строке, столбцу), где пользователь нажал. Спасибо за любое объяснение того, как это разработать!
Ответ №1:
Это функция, const choice = (current) => { this.calculateChoice(current.squares) };
- Если вы выполняете рендеринг
<div>Coup {choice}</div>
, конечно, он не будет отображать никакого значения, потому что это функция. - Эта функция не вернет правильное значение, потому что она не предназначена для возврата чего-либо. Вы можете либо сделать
const choice = (current) => { return this.calculateChoice(current.squares) };
, либоconst choice = (current) => this.calculateChoice(current.squares);
- Если вы хотите вызвать
this.calculateChoice(current.squares)
, убедитесь, что он находится внутри компонента класса.
Комментарии:
1. Спасибо, это решило одну из двух моих проблем! Я отредактировал свой вопрос с тем, что я решил сделать, чтобы решить эту проблему. Если бы вы могли также предоставить объяснение того, как я мог бы вернуть строку и столбец, на которые нажал пользователь, большое спасибо!