我的App.js中有两个容器,状态在Redux存储中维护。
<StartGameContainer/>
<GameContainer/>
我的应用程序的状态有一个名为“ gameStatus”的属性,该属性设置为false。我尝试使用此属性在
GameContainer
中呈现我的组件(如果为true)。当我单击StartGameContainer
中的“开始”按钮时,此属性设置为true。当应用最初呈现时,它会注意到此属性为false。当我单击开始按钮时,它不会渲染
GameContainer
中的内容。我怎么能做到这一点或弄错了这个布局?编辑
GameContainer.js
const mapStateToProps = state => (
{
board: state.boardGame.board,
gameStatus: state.boardGame.gameStatus
}
);
const mapDispatchToProps = dispatch => {
return {
initGame: () => {
dispatch(allActions.initGame())
},
selectCol : (val) => {
dispatch(allActions.dropTile(val))
}
}
};
const GameContainer = connect(mapStateToProps, mapDispatchToProps)(GridCells);
class GridCells extends Component {
componentDidMount() {
this.props.initGame();
}
render() {
if(this.props.gameStatus){
return (
<div className="game">
<table>
<thead>
</thead>
<tbody>
{this.props.board.map((row, i) => (
<RowCells key={i} row={row} select={this.props.selectCol}/>
))}
</tbody>
</table>
</div>
)
}else{
return(<div></div>)
}
}
}
StartGameContainer.js
const mapDispatchToProps = dispatch => {
return{
pickPlayer: (currPlayer) => {
dispatch(allActions.setPlayer(currPlayer))
}
}
};
const StartGameContainer = connect(null, mapDispatchToProps)(StartGame);
class StartGame extends Component{
constructor(props){
super(props);
this.players = ['myself', 'service'];
this.selectedVal = 1;
}
selectedPlayer(event){
this.selectedVal = event.target.value === 'myself' ? 1 : 2;
}
render(){
let options = this.players.map((val) => {
return (<option key={val} value={val}>{val}</option>)
});
return(
<div className='startGame'>
<select name="players" id="players" onChange={this.selectedPlayer.bind(this)}>
{options}
</select>
<button onClick= {() => {this.props.pickPlayer(this.selectedVal)}}>Start Game</button>
</div>
)
}
}
最佳答案
不能完全确定您的Redux逻辑是什么样子...但是您押注您的问题是由于对hoisting的工作方式产生了误解。
尝试将两个连接代码行都放在类定义下面:
class StartGame extends Component{ ... }
const StartGameContainer = connect(null, mapDispatchToProps)(StartGame)
查看此SO answer关于如何悬挂而不初始化JS类的信息。
“在定义类之前使用类绝不是一个好主意”
这是一个简化的示例,可以帮助您更好地理解为什么代码没有引发错误,但是也无法正常工作。请考虑以下代码段:
function logYourClass() {
console.log(yourClass)
var yourClass = 'all the class details'
}
logYourClass()
如果运行此命令,则会发现
undefined
被记录下来,并且不会抛出“未定义yourClass
” ReferenceError。这是因为上面的代码等效于编写:function logYourClass() {
var yourClass
console.log(yourClass)
yourClass = 'all the class details'
}
logYourClass()
还值得注意的是,未悬挂ES6
let
和const
声明。尝试用以下任何一个关键字替换上面代码中的var
,您将看到Uncaught ReferenceError。function logYourClass() {
console.log(yourClass)
const yourClass = 'all the class details'
}
logYourClass()
关于javascript - 根据逻辑React/Redux渲染容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51959159/