【发布时间】:2021-06-18 12:45:08
【问题描述】:
我需要调用 Dropbox api 两次。第一个 useEffect 获取名称和路径,然后将它们推送到上下文中的空白数组中。然后我需要第二个 useEffect 触发,它依赖于从第一个 useEffect 填充的数组。我曾尝试使用 useState 并创建加载和 setLoading,然后将 useEffect 的内部包裹在 if(loading) 中,但这不起作用,因为我猜它只会在安装组件时尝试触发。第一个完成后如何让第二个 useEffect 运行?
const [user, setUser] = useContext(UserContext);
首次使用效果:
useEffect(() => {
var myHeaders = new Headers();
myHeaders.append(
'Authorization',
'Bearer XXXXXXXXXXXXXXX',
);
myHeaders.append('Content-Type', 'application/json');
var raw = JSON.stringify({path: `/${user.username}`});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow',
};
fetch('https://api.dropboxapi.com/2/files/list_folder', requestOptions)
.then(response => response.json())
.then(data => {
let tmpArray = [];
let tmpArrayTwo = [];
for (var i = 0; i < data.entries.length; i++) {
tmpArray.push(data.entries[i].name);
tmpArrayTwo.push(data.entries[i].path_lower);
}
setUser({
...user,
imageNames: tmpArray,
imagePaths: tmpArrayTwo,
});
})
.catch(error => console.log('error', error));
}, []);
第二次使用效果:
useEffect(() => {
let tmpArray = [];
var myHeaders = new Headers();
myHeaders.append(
'Authorization',
'Bearer XXXXXXXXXXXXXX',
);
myHeaders.append('Content-Type', 'application/json');
for (var i = 0; i < user.imagePaths.length; i++) {
var raw = JSON.stringify({path: `/${user.imagePaths[i]}`});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow',
};
fetch(
'https://api.dropboxapi.com/2/files/get_temporary_link',
requestOptions,
)
.then(response => response.json())
.then(data => {
tmpArray.push(data.link);
})
.catch(error => console.log('error', error));
}
console.log(tmpArray);
setUser({
...user,
imageLinks: tmpArray,
});
}, []);
我认为它与依赖数组有关,但我放入其中的所有内容(如 user、setUser)都会给我一个无限循环,并且 user.imagePaths 的 console.log 会一直记录为 []。我知道 user.imagePaths 在第一个 useEffect 之后填充,但第二个 useEffect 不断为 user.imagePaths.length 循环未定义。
【问题讨论】:
标签: reactjs react-native react-hooks dropbox-api use-effect