【发布时间】:2021-08-05 15:31:16
【问题描述】:
我是新来的原生反应,目前正在与无限滚动列表视图作斗争。这是一个日历列表,需要根据所选公司进行更改(作为道具给出)。问题是:prop(以及 myCompany 状态已更改,但在 _loadMoreAsync 方法中,prop.company 和 myCompany 都保留了它们的初始值。
import * as React from 'react';
import { FlatList } from 'react-native';
import * as Api from '../api/api';
import InfiniteScrollView from 'react-native-infinite-scroll-view';
function CalenderFlatList(props: { company: any }) {
const [myCompany, setMyCompany] = React.useState(null);
const [data, setData] = React.useState([]);
const [canLoadMore, setCanLoadMore] = React.useState(true);
const [startDate, setStartDate] = React.useState(undefined);
let loading = false;
React.useEffect(() => {
setMyCompany(props.company);
}, [props.company]);
React.useEffect(() => {
console.log('set myCompany to ' + (myCompany ? myCompany.name : 'undefined'));
_loadMoreAsync();
}, [myCompany]);
async function _loadMoreAsync() {
if ( loading )
return;
loading = true;
if ( myCompany == null ) {
console.log('no company selected!');
return;
} else {
console.log('use company: ' + myCompany.name);
}
Api.fetchCalendar(myCompany, startDate).then((result: any) => {
// code is a little more complex here to keep the already fetched entries in the list...
setData(result);
// to above code also calculates the last day +1 for the next call
setStartDate(lastDayPlusOne);
loading = false;
});
}
const renderItem = ({ item }) => {
// code to render the item
}
return (
<FlatList
data={data}
renderScrollComponent={props => <InfiniteScrollView {...props} />}
renderItem={renderItem}
keyExtractor={(item: any) => '' + item.uid }
canLoadMore={canLoadMore}
onLoadMoreAsync={() => _loadMoreAsync() }
/>
);
}
我不明白为什么myCompany 在_loadMoreAsync 中根本没有更新,而startDate 正确更新并准确加载日历的下一个条目。
在 prop company 更改后,我希望得到以下输出:
将 myCompany 设置为 companyName
使用公司公司名称
但是我得到了:
将 myCompany 设置为 companyName
没有选择公司!
我尝试稍微减少代码以将其剥离到最重要的部分。对此有何建议?
【问题讨论】:
-
这没有意义。如果这是真的,您可以将公司转入
_loadMoreAsync(company)。但我认为这不可能发生。因为您可以将所有算法移至React.useEffect。 -
你对什么是反应状态有点困惑,我是说因为适当的加载是用错误的方法管理的。也许如果您可以通过最小可重现示例重现问题,我们可以帮助您更好地理解您的问题
-
@windmaomao 没错,如果我将所有内容都移到
React.useEffect中,它就像一个魅力。如果我将company传递给_loadMoreAsync,它也可以工作。问题是我还需要从React.useEffect外部访问_loadMoreAsync。否则 FlatList 的 onLoadMoreAsync 属性将无权访问。所以我的例子不正确,因为在更改props.company之后,我可以设法产生正确的输出,但是如果我从另一个地方调用_loadMoreAsync,它仍然使用myCompany的初始值。 -
我认为问题只出现在
FlatList的onLoadMoreAsync属性中。这有可能使用某种缓存吗?如果我用onLoadMoreAsync={() => { console.log(myCompany); }}替换它,它只会打印出初始值,但不会更新myCompany的当前状态。
标签: reactjs react-native use-effect use-state