【问题标题】:TypeError: undefined is not an object (evaluating 'data.filter') - React NativeTypeError: undefined is not an object (evalating 'data.filter') - React Native
【发布时间】:2020-04-02 05:28:04
【问题描述】:

我是 React/编程新手,在获取/显示数据时遇到了麻烦。我的代码返回以下错误。提前感谢您的帮助。

TypeError: TypeError: undefined is not an object (evalating 'data.filter')

  import useFetch from 'react-fetch-hook'

  const { data } = useFetch('http://192.168.2.94:3000/list-categories')

  const locations = props.navigation.getParam('locationId')

  const displayedCategories = data.filter(      // ERROR HERE
    cat => cat.locId.indexOf(locations) >= 0
  )

  const renderGridItem = itemData => {
    return (
      <CategoryGridTile
        image={itemData.item.image}
        title={itemData.item.title}
      />
    )
  }

  return (
    <FlatList
      keyExtractor={(item, index) => item.id}
      data={displayedCategories}
      renderItem={renderGridItem}
    />
  )
}

【问题讨论】:

标签: javascript reactjs react-native fetch


【解决方案1】:

我认为一开始没有数据所以请使用默认分配

  const { data = [] } = useFetch('http://192.168.2.94:3000/list-categories')

更新

  const displayedCategories = data.filter(
    cat => cat && cat.locId && cat.locId.indexOf(locations) >= 0
  )

【讨论】:

  • 感谢您的回答。但是这次我收到了这个错误:“TypeError: cat.locId.indexOf is not a function. (In 'cat.locId.indexOf(locations)', 'cat.locId.indexOf' is undefined)”
  • @Gezginrocker 请更改 displayedCategories 功能
【解决方案2】:

useFetch 会返回一个 isLoading 标志以及数据,您必须使用这些数据来显示加载指示器,直到数据可用

const { isLoading, data } = useFetch('http://192.168.2.94:3000/list-categories');
 if(isLoading) {
    return <span>Loading...</span>
 }
 const locations = props.navigation.getParam('locationId')

  const displayedCategories = data.filter(
    cat => cat.locId.indexOf(locations) >= 0
  )

  const renderGridItem = itemData => {
    return (
      <CategoryGridTile
        image={itemData.item.image}
        title={itemData.item.title}
      />
    )
  }

  return (
    <FlatList
      keyExtractor={(item, index) => item.id}
      data={displayedCategories}
      renderItem={renderGridItem}
    />
  )

【讨论】:

  • 感谢您的回答。但是这次我收到了这个错误:“TypeError: cat.locId.indexOf is not a function. (In 'cat.locId.indexOf(locations)', 'cat.locId.indexOf' is undefined)”
  • 能否请您在data.filter之前记录数据并检查返回值是什么