Javascript 使用reactjs在tic tac toe应用程序中渲染图像
我正在尝试使用reactjs创建一个简单的tic-tac-toe应用程序,其中包含两种模式:经典模式和图像模式,在经典模式下,我有显示X和O的选项,而在图像模式下,我有下面提到的两种显示图像的选项。我的文件结构是:Javascript 使用reactjs在tic tac toe应用程序中渲染图像,javascript,reactjs,redux,tic-tac-toe,Javascript,Reactjs,Redux,Tic Tac Toe,我正在尝试使用reactjs创建一个简单的tic-tac-toe应用程序,其中包含两种模式:经典模式和图像模式,在经典模式下,我有显示X和O的选项,而在图像模式下,我有下面提到的两种显示图像的选项。我的文件结构是: src components ChooseGameMode.js choosePlayer.js GameStatus.js Status.js images connery.svg square.svg App.css App
src
components
ChooseGameMode.js
choosePlayer.js
GameStatus.js
Status.js
images
connery.svg
square.svg
App.css
App.js
index.css
index.js
...
以下是我开发的代码:
App.js
ChooseGameMode.js
选择seplayer.js
GameStatus.js
Status.js
当我选择图像模式并选择播放器而不是渲染图像时,它只是将图像文件的路径渲染到应用程序中。我使用require./images/connery.svg来渲染图像。
我可能知道我做错了什么,而且我还没有在状态管理中使用Redux,因为我刚刚学习react和Redux,有人能帮助我如何在这个现有的应用程序中实现Redux,以便状态管理可以以更好的方式处理,而不是将状态作为不同组件的单独道具传递吗?关于如何实现这一点以及任何其他改进或建议的总体想法也将非常有用。另外,正如我建议的那样,这是我的。要使用图像,您不需要修改经典代码,只需要在工作的经典代码中更新渲染器,并删除添加到代码其他部分的图像条件,例如在App.js handleClick中 const connery=require./images/connery.svg;//或从导入connery。/images/connery.svg const square=require./images/square.svg; ... 渲染器{ const isFrontend=this.state.gamemode==='Image' 返回this.state.board.mapbox,索引=> { 这是handleclick指数; }} > {box==X&&isFrontend&} {box==O&&isFrontend&} {!isFrontEnd&&box} ; }
注意:要查看实际图像,您应该确保您的网页包加载程序设置良好,或者使用svg精灵。非常感谢,这确实有效。另外,对于这样的小型应用程序,是否有更好的方法通过使用Redux?IMO来改进应用程序,使用redux会有点过分。但是,如果出于学习目的需要,您可以查看您选择的任何redux教程。例如:您需要对ChooseGameMode单选按钮的工作方式进行一些更改。请参见此处的工作示例:您可以查看以更好地理解单选按钮
import React, { Component } from 'react';
import './App.css';
import Status from'./components/Status';
import GameStatus from'./components/GameStatus';
class App extends Component {
constructor(props){
super(props)
this.state = {
board : Array(9).fill(null),
player : null,
winner : null,
gamemode : null,
/* array to store the ndex */
order_ndex : []
}
}
checkWinner(){
let winLines =
[
["0", "1", "2"],
["3", "4", "5"],
["6", "7", "8"],
["0", "3", "6"],
["1", "4", "7"],
["2", "5", "8"],
["0", "4", "8"],
["2", "4", "6"]
]
this.checkmatch(winLines)
}
checkmatch(winLines){
let board = this.state.board;
for (let index = 0; index < winLines.length; index++) {
const [a,b,c]=winLines[index];
if(board[a] && board[a] === board[b] && board[a] === board[c] ){
alert('You won!');
this.setState({
winner : this.state.player
})
this.state.winner = this.state.player;
}
}
if(!this.state.winner && !board.includes(null)){
this.state.winner = 'None';
alert('Its a Draw!');
}
}
handleClick(index){
//To render images on selecting ImageMode mode
const images ={
connery : require('./images/connery.svg'),
square : require('./images/square.svg')
}
if(this.state.player && !this.state.winner && this.state.gamemode === "Classic"){
let newBoard = this.state.board
if(this.state.board[index]===null){
newBoard[index] = this.state.player
/* push the last index into the array */
this.state.order_ndex.push(index)
this.setState({
board: newBoard,
player: this.state.player==="X" ? "O" : "X"
})
this.checkWinner()
}
}
else{
let newBoard = this.state.board
if(this.state.board[index]===null){
newBoard[index] = this.state.player
/* push the last index into the array */
this.state.order_ndex.push(index)
this.setState({
board: newBoard,
player: this.state.player=== images.connery ? images.square : images.connery
})
this.checkWinner()
}
}
}
setPlayer(player){
this.setState({player})
}
setGameMode(gamemode){
console.log(gamemode)
this.setState({gamemode})
}
renderBoxes(){
return this.state.board.map(
(box, index) =>
<div className="box" key={index}
onClick={()=> {this.handleClick(index)}}>
{box}
</div>
)
}
reset(){
this.setState({
board : Array(9).fill(null),
player : null,
winner : null,
gamemode : null,
order_ndex : []
})
}
undo() {
let ndex = this.state.order_ndex.pop()
let newBoard = this.state.board
let prev = newBoard[ndex]
newBoard[ndex] = null
this.setState({
board: newBoard,
player: prev
})
}
render() {
return (
<div className="container">
<h1>Tic Tac Toe App</h1>
<GameStatus
gamemode ={this.state.gamemode}
setGameMode = {(e)=> this.setGameMode(e)}
/>
<Status
player={this.state.player}
setPlayer={(e) => this.setPlayer(e)}
winner = {this.state.winner}
/>
<div className="board">
{this.renderBoxes()}
</div>
<div className="btn">
<button className='reset' onClick = {() => this.reset()}> Reset </button>
<div className="divider"/>
<button className='reset' disabled ={this.state.winner} onClick = {() => this.undo()}> Undo </button>
</div>
</div>
);
}
}
export default App;
import React, { Component } from 'react';
class ChooseGameMode extends Component{
handleForm(e){
e.preventDefault();
this.props.gamemode(e.target.gamemode.value);
}
render(){
return (
<form onSubmit={(e)=> this.handleForm(e)}>
<label>
Classic
<input type="radio" name="gamemode" value="Classic"/>
</label>
<label>
Frontenddevlandia
<input type="radio" name="gamemode" value="Frontenddevlandia"/>
</label>
<input type="submit" value="Submit" />
</form>
)
}
}
export default ChooseGameMode;
import React, { Component } from 'react';
class Player extends Component{
handleForm(e){
e.preventDefault();
this.props.player(e.target.player.value);
}
render(){
return (
<form onSubmit={(e)=> this.handleForm(e)}>
<label>
Player X
<input type="radio" name="player" value="X"/>
</label>
<label>
Player O
<input type="radio" name="player" value="O"/>
</label>
<input type="submit" value="Start" />
</form>
)
}
}
export default Player;
import React, { Component } from 'react';
import ChooseGameMode from'./ChooseGameMode';
class GameStatus extends Component {
handleSetGameMode(e){
this.props.setGameMode(e)
}
render(){
return (this.props.gamemode ?
<h3>You are playing the {this.props.gamemode} mode</h3> :
<ChooseGameMode gamemode={(e) => this.handleSetGameMode(e)} />
)
}
}
export default GameStatus;
import React, { Component } from 'react';
import Player from'./choosePlayer';
class Status extends Component {
handleSetPlayer(e){
this.props.setPlayer(e)
}
renderHtml(){
if (this.props.winner){
return (<h2>Winner is {this.props.winner}</h2>)
} else {
return this.props.player ?
<h2>Next player is {this.props.player}</h2> :
<Player player={(e) => this.handleSetPlayer(e)} />
}
}
render(){
return (<span>{this.renderHtml()}</span>)
}
}
export default Status;