Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
React native 在异步搜索中设置状态_React Native_Asynchronous_Expo_Algolia - Fatal编程技术网

React native 在异步搜索中设置状态

React native 在异步搜索中设置状态,react-native,asynchronous,expo,algolia,React Native,Asynchronous,Expo,Algolia,我试图用从异步搜索中得到的结果设置一个有状态对象,但我得到了一些错误和奇怪的行为。 我正在使用algoliasearch运行此搜索。这里是pseudo中的代码,如果需要,我可以共享完整的代码,但我认为这并不重要。搜索工作正常,我得到了结果(见下面的评论) 它会导致应用程序表现得很滑稽、卡住,有时甚至崩溃。有时我会遇到这样一个(很长)错误:警告:请报告:挂起的回调次数过多:501。某些挂起的回调可能由于从未从本机代码调用而泄漏:{“1531”:{“module”:“NativeAnimatedMo

我试图用从异步搜索中得到的结果设置一个有状态对象,但我得到了一些错误和奇怪的行为。 我正在使用algoliasearch运行此搜索。这里是pseudo中的代码,如果需要,我可以共享完整的代码,但我认为这并不重要。搜索工作正常,我得到了结果(见下面的评论)

它会导致应用程序表现得很滑稽、卡住,有时甚至崩溃。有时我会遇到这样一个(很长)错误:
警告:请报告:挂起的回调次数过多:501。某些挂起的回调可能由于从未从本机代码调用而泄漏:{“1531”:{“module”:“NativeAnimatedModule”,“method”:“startAnimatingNode”}…
当我注释
setResults(fetchedResultsArray)
并取消注释之前的控制台日志时,它会打印结果,应用程序会正常运行。返回到
setResults(fetchedResultsArray)
时,事情会再次出错。我做了一些错误/非法的事情,但是什么呢? 另一件需要提及的重要事情是,我正在使用Expo SDK 41 beta 2

更新

Patrick,你指出了我做错了什么。让我更深入地向你展示一下我在我的
搜索屏幕
中所做的事情,再次缩写为:

const SearchScreen = () => {
  // I get the initSearch function from a custom hook and you already see above what the function is.
  const [
    initSearch,
    ...
  ] = useSearch();

  // Then I fire the search when the screen loaded
  useLayoutEffect(() => {
    if (region) {
      initSearch({ searchQuery, region, filterOptions, priceOptions });
    }
  }, [filterOptions, initSearch, priceOptions, region, searchQuery]);
  ...
我的自定义挂钩如下所示:

export function useSearch() {
  const [readyToAnimateAfterSearch, setReadyToAnimateAfterSearch] = useState<boolean>(false);
  const [results, setResults] = useState<Result[] | null>(null);

  const setAlert = useStore(useCallback((state) => state.setAlert, []));
  const setProgressBarVisible = useStore(useCallback((state) => state.setProgressBarVisible, []));

  const [radius, setRadius] = useState<number>(0);
  const initSearch = useCallback(
    async ({ searchQuery, region, filterOptions, priceOptions, loadMore = false }) => {
      ...
    },
    [results, setResults, setAlert, setProgressBarVisible]
  );
  return [
    initSearch,
    results,
    setResults,
    radius,
    readyToAnimateAfterSearch,
    setReadyToAnimateAfterSearch,
  ] as const;
导出函数useSearch(){
常量[readyToAnimateAfterSearch,setReadyToAnimateAfterSearch]=useState(false);
const[results,setResults]=useState(null);
const setAlert=useStore(useCallback((state)=>state.setAlert,[]);
const setProgressBarVisible=useStore(useCallback((state)=>state.setProgressBarVisible,[]);
const[radius,setRadius]=useState(0);
const initSearch=useCallback(
异步({searchQuery,region,filterOptions,priceOptions,loadMore=false})=>{
...
},
[结果、setResults、setAlert、setProgressBarVisible]
);
返回[
initSearch,
结果,
setResults,
半径
readyToAnimateAfterSearch,
setReadyToAnimateAfterSearch,
]作为常量;

您可以建议一种替代方法来运行此操作作为答案吗?无需详细说明,这样我就可以了解您将如何处理此操作。谢谢!

我的主要问题是我在
initSearch
函数中使用
结果,而不是使用stateUpdater函数并从数据库中删除
结果eps数组。

不应将副作用直接写入函数组件的主体中。每次重新呈现组件时,即每次调用
setResults()
(及更多)时,您都会触发搜索在这种情况下,从您的异步回调中。@PatrickRoberts好的,我明白您的意思。我更新了我的问题。您能看一下吗?
export function useSearch() {
  const [readyToAnimateAfterSearch, setReadyToAnimateAfterSearch] = useState<boolean>(false);
  const [results, setResults] = useState<Result[] | null>(null);

  const setAlert = useStore(useCallback((state) => state.setAlert, []));
  const setProgressBarVisible = useStore(useCallback((state) => state.setProgressBarVisible, []));

  const [radius, setRadius] = useState<number>(0);
  const initSearch = useCallback(
    async ({ searchQuery, region, filterOptions, priceOptions, loadMore = false }) => {
      ...
    },
    [results, setResults, setAlert, setProgressBarVisible]
  );
  return [
    initSearch,
    results,
    setResults,
    radius,
    readyToAnimateAfterSearch,
    setReadyToAnimateAfterSearch,
  ] as const;