Reactjs React钩子,用于重新呈现由异步递归函数更新的状态
我正在构建一个react应用程序,它可以解决数独板问题,并可视化解决算法 我试图将类组件转换为功能组件,但不确定如何使状态更改生效 问题代码是:Reactjs React钩子,用于重新呈现由异步递归函数更新的状态,reactjs,react-hooks,react-component,react-functional-component,use-state,Reactjs,React Hooks,React Component,React Functional Component,Use State,我正在构建一个react应用程序,它可以解决数独板问题,并可视化解决算法 我试图将类组件转换为功能组件,但不确定如何使状态更改生效 问题代码是: async solve() { await this.sleep(0); const board = this.state.board; for (let row = 0; row < 9; row++) { for (let col = 0; col < 9; col++) { if
async solve() {
await this.sleep(0);
const board = this.state.board;
for (let row = 0; row < 9; row++) {
for (let col = 0; col < 9; col++) {
if (board[row][col] !== 0) {
// can't change filled cells
continue;
}
// try 1 to 9 for the empty cell
for (let num = 1; num <= 9; num++) {
if (App.isValidMove(board, row, col, num)) {
// valid move, try it
board[row][col] = num;
this.setState({ board: board });
if (await this.solve()) {
return true;
} else {
// didn't solve with this move, backtrack
board[row][col] = 0;
this.setState({ board: board });
}
}
}
// nothing worked for empty cell, must have deprived boards solution with a previous move
return false;
}
}
// all cells filled
return true;
}
async solve(){
等待这个。睡眠(0);
const board=this.state.board;
for(设行=0;行<9;行++){
for(设col=0;col<9;col++){
如果(板[行][列]!==0){
//无法更改已填充的单元格
继续;
}
//空单元格尝试1到9
对于(让num=1;num setBoard(board),[board])
)。此未编译,获取错误React Hook“useffect”可能会执行多次…
useReducer
,但是我的问题是:
- 这甚至可以转换为功能组件吗
- 如果是,我应该使用什么钩子,它是否需要重新设计我的
函数solve()
- 将其从类组件转换为功能组件是最好的方法吗
const{useState,useffect}=React;
const getCell=(板)=>{
常量行=board.findIndex((行)=>
行.部分((单元格)=>!单元格.已选中)
);
如果(行==-1){
返回[-1,-1,false];
}
const col=board[row].findIndex((单元格)=>!cell.checked);
返回[行、列、真];
};
常量初始状态=[
[{checked:false},{checked:false}],
[{checked:false},{checked:false}],
];
常量应用=()=>{
const[board,setBoard]=使用状态(initialState);
useffect(()=>{
常量计时器=设置超时(
() =>
立根板((板)=>{
常量[行、列、集]=getCell(板);
如果(设置){//我们需要设置板吗(有移动)
const boardCopy=[…board];
boardCopy[行]=[…板[行]];
董事会副本[行][列]={
…董事会副本[行][col],
核对:对,
};
回执;
}
//这将返回与传入的相同的结果
//所以应用程序不会重新渲染,因为
//不会改变
return board;//由于set为false,所以没有向左移动
}),
1000
);
return()=>clearTimeout(计时器);
}[董事会];
返回(
立板条(初始状态)}>
重置
{board.map((行,i)=>(
{row.map(({checked},i)=>(
{选中?'X':'O'}
))}
))}
);
};
ReactDOM.render(,document.getElementById('root');
你可以在每次棋盘更改时使用一个效果。该效果将运行。当没有更多移动时,棋盘将不会更改,该效果将不再运行 下面是一个如何做到这一点的示例:
const{useState,useffect}=React;
const getCell=(板)=>{
常量行=board.findIndex((行)=>
行.部分((单元格)=>!单元格.已选中)
);
如果(行==-1){
返回[-1,-1,false];
}
const col=board[row].findIndex((单元格)=>!cell.checked);
返回[行、列、真];
};
常量初始状态=[
[{checked:false},{checked:false}],
[{checked:false},{checked:false}],
];
常量应用=()=>{
const[board,setBoard]=使用状态(initialState);
useffect(()=>{
常量计时器=设置超时(
() =>
立根板((板)=>{
常量[行、列、集]=getCell(板);
如果(设置){//我们需要设置板吗(有移动)
const boardCopy=[…board];
boardCopy[行]=[…板[行]];
董事会副本[行][列]={
…董事会副本[行][col],
核对:对,
};
回执;
}
//这将返回与传入的相同的结果
//所以应用程序不会重新渲染,因为
//不会改变
return board;//由于set为false,所以没有向左移动
}),
1000
);
return()=>clearTimeout(计时器);
}[董事会];
返回(
立板条(初始状态)}>
重置
{board.map((行,i)=>(
{row.map(({checked},i)=>(
{选中?'X':'O'}
))}
))}
);
};
ReactDOM.render(,document.getElementById('root');
让它与useState
hook一起工作
问题是我没有正确复制板;需要使用const boardCopy=[…board];
(而不是const boardCopy=board
)
.让它与useState
hook一起工作
问题是我没有正确复制板;需要使用const boardCopy=[…board];
(而不是const boardCopy=board
)
.嘿,你试过用useAncyEffect
代替useAncyEffect吗?每当我有这样的异步钩子时,我就用这个npm包嘿,你试过用useAncyEffect
代替useAncyEffect吗?每当我有这样的异步钩子时,我就用这个npm包