【发布时间】:2021-12-30 19:39:58
【问题描述】:
代码
PrizeHistory.js
...
const PrizeHistory = () => {
const [history, setHistory] = useState([]);
useEffect(() => {
async function getHistory () {
try {
let result = await sqliteInterface.getAllPrizes(db, prizeTable);
result == null ? console.log("res is null") : setHistory(result);
console.log("result" + result);
console.log("history" + history);
} catch (err) {
console.log(err);
}
}
getHistory();
}, [history])
return (
<View style={styles.body}>
<Text style={styles.text}>Prize History</Text>
</View>
);
}
getAllPrizes
getAllPrizes(db, tableName) {
return new Promise((resolve, reject) => {
db.transaction((tx) => {
tx.executeSql(
`SELECT * FROM ${tableName};`,
[],
(tx, res) => {
let len = res.rows.length;
let results = [];
if(len > 0) {
for(i = 0; i < res.rows.length; i++) {
results.push(res.rows.item(i));
}
}
console.log("resolving promise now");
resolve(JSON.stringify(results));
},
(error) => {
reject(Error(`SQLite getAllPrizes: failed to get '*' from ${tableName}: ` + error));
}
);
});
});
}
目标
当页面挂载时,将历史状态设置为数据库中的数据。我最初尝试过这个:
useEffect(() => {
async function getHistory () {
try {
let result = await sqliteInterface.getAllPrizes(db, prizeTable);
result == null ? console.log("res is null") : setHistory(result);
console.log("result" + result);
console.log("history" + history);
} catch (err) {
console.log(err);
}
}
getHistory();
}, [])
但它从未正确设置我的历史变量。我刚得到一个空数组(这是我最初将历史状态设置为的)。我希望历史变量等于历史console.log() 中的结果变量,但事实并非如此。
所以我把useEffect()改成了这样:
useEffect(() => {
async function getHistory () {
try {
let result = await sqliteInterface.getAllPrizes(db, prizeTable);
result == null ? console.log("res is null") : setHistory(result);
console.log("result" + result);
console.log("history" + history);
} catch (err) {
console.log(err);
}
}
getHistory();
}, [history])
这段代码正确地更改了历史变量,但我预计它会进入无限循环......但它没有?这是我的逻辑
-
useEffect()具有[history]作为依赖项 - onMount,
history设置为默认值[] -
useEffect()看到history已设置并开始运行 -
useEffect()重置history -
useEffect()应该重新开始,因为它会重置history变量本身 - 无限重复 3-5...
但它不会无限重复......
我的问题
- 当
[history]设置为它的依赖项时,为什么useEffect()没有无限运行 - 为什么
useEffect()没有在挂载时正确设置我的历史变量,而它有[]作为它的依赖项。
【问题讨论】:
-
你为什么期望 useEffect() 无限运行。 “历史”是一个状态变量。难道不应该只在变量“history”更新时才执行吗?
标签: javascript reactjs react-hooks use-effect