反应本地元素不更新?
React local element not updating?
我有一个具有局部变量的组件
let endOfDocument = false;
我的 useEffect 中有无限滚动功能
useEffect(() => {
const { current } = selectScroll;
current.addEventListener('scroll', () => {
if (current.scrollTop + current.clientHeight >= current.scrollHeight) {
getMoreExercises();
}
});
return () => {
//cleanup
current.removeEventListener('scroll', () => {});
};
}, []);
在我的 getMoreExercises 函数中,我检查我们是否到达了 firebase 中的最后一个文档
function getMoreExercises() {
if (!endOfDocument) {
let ref = null;
if (selectRef.current.value !== 'All') {
ref = db
.collection('exercises')
.where('targetMuscle', '==', selectRef.current.value);
} else {
ref = db.collection('exercises');
}
ref
.orderBy('average', 'desc')
.startAfter(start)
.limit(5)
.get()
.then((snapshots) => {
start = snapshots.docs[snapshots.docs.length - 1];
if (!start) endOfDocument = true; //Here
snapshots.forEach((exercise) => {
setExerciseList((prevArray) => [...prevArray, exercise.data()]);
});
});
}
}
当我将选项更改为另一个类别时,我使用 onChange 方法处理它
function handleCategory() {
endOfDocument = false;
getExercises();
}
我这样做是为了在我们更改类别时重新设置列表,它不再是文档的末尾。但是,endOfDocument 变量不会更新,一旦设置为 true,getMoreExercise 函数的 endOfDocument 值将始终为 true。我以后无法更改它。任何帮助将不胜感激。
假设您使用 setExerciseList
作为反应 useState 挂钩变量。您应该将 useState 用于 endOfDocument 以及 Brian Thompson 在评论中的建议。
import React,{useState} from 'react';
const [endOfDocument,setEndOfDocument] = useState(false);
function handleCategory() {
setEndOfDocument(false);
getExercises();
}
正如@DevLoverUmar 提到的那样,它会正确更新,
但是由于 endOfDocument 基本上从不用于“渲染”任何东西,而只是用于效果的状态,所以我会将其放入 useRef
中以减少不必要的重新渲染。
我有一个具有局部变量的组件
let endOfDocument = false;
我的 useEffect 中有无限滚动功能
useEffect(() => {
const { current } = selectScroll;
current.addEventListener('scroll', () => {
if (current.scrollTop + current.clientHeight >= current.scrollHeight) {
getMoreExercises();
}
});
return () => {
//cleanup
current.removeEventListener('scroll', () => {});
};
}, []);
在我的 getMoreExercises 函数中,我检查我们是否到达了 firebase 中的最后一个文档
function getMoreExercises() {
if (!endOfDocument) {
let ref = null;
if (selectRef.current.value !== 'All') {
ref = db
.collection('exercises')
.where('targetMuscle', '==', selectRef.current.value);
} else {
ref = db.collection('exercises');
}
ref
.orderBy('average', 'desc')
.startAfter(start)
.limit(5)
.get()
.then((snapshots) => {
start = snapshots.docs[snapshots.docs.length - 1];
if (!start) endOfDocument = true; //Here
snapshots.forEach((exercise) => {
setExerciseList((prevArray) => [...prevArray, exercise.data()]);
});
});
}
}
当我将选项更改为另一个类别时,我使用 onChange 方法处理它
function handleCategory() {
endOfDocument = false;
getExercises();
}
我这样做是为了在我们更改类别时重新设置列表,它不再是文档的末尾。但是,endOfDocument 变量不会更新,一旦设置为 true,getMoreExercise 函数的 endOfDocument 值将始终为 true。我以后无法更改它。任何帮助将不胜感激。
假设您使用 setExerciseList
作为反应 useState 挂钩变量。您应该将 useState 用于 endOfDocument 以及 Brian Thompson 在评论中的建议。
import React,{useState} from 'react';
const [endOfDocument,setEndOfDocument] = useState(false);
function handleCategory() {
setEndOfDocument(false);
getExercises();
}
正如@DevLoverUmar 提到的那样,它会正确更新,
但是由于 endOfDocument 基本上从不用于“渲染”任何东西,而只是用于效果的状态,所以我会将其放入 useRef
中以减少不必要的重新渲染。