【问题标题】:TypeError: Object.entries requires that input parameter not be null or undefined in React NativeTypeError:Object.entries 要求输入参数在 React Native 中不能为 null 或未定义
【发布时间】:2023-04-01 02:07:02
【问题描述】:

我正在尝试遍历通过调用 API 获得的对象但是在将数据设置为状态 setNodesData 并从 nodesData 获取数据之后,但是当我尝试这样做时,我收到一条错误消息: TypeError: Object.entries requires that input parameter not be null or undefined in React Native

我也尝试过for(const i in nodesData),但我仍然收到错误消息expression expected

useEffect(() => {
    if (apiHeaders) {
      axios
        .get(
          "https://test-myways-anfhsya-asq.myways.in/api/****",
          {
            headers: apiHeaders,
          }
        )
        .then((res) => {
          console.log("API Call")
          console.log(res?.data);
          setNodesData(res?.data);
        })
        .catch((err)=>{console.log("error:",err)});
    }
  }, [apiHeaders]);

  return (
    
  
      {
      Object?.entries(nodesData).forEach((i) => (
        <View style={{ padding: 5 }}>
          <View
            style={{
              flexDirection: "row",
              alignItems: "center",
            }}
          >
            <TouchableOpacity
               onPress={(props) => props.navigation.navigate("CoursesPlaylistScreen")}
              style={{
                flexDirection: "row",
                alignItems: "center",
                justifyContent: "space-between",
                flex: 1,
              }}
            >
              <View
                style={{
                  flexDirection: "row",
                  justifyContent: "space-between",
                  flex: 1,
                }}
              >
                <Text
                  style={{
                    fontSize: 16,
                    color: "#000000",
                    fontWeight: "bold",
                  }}
                >
                  {i}
                </Text>
              </View>
            </TouchableOpacity>
          </View>

数据:

{
    "week1": {
        "content": [
            {
                "moduleName": "HTML Crash course",
                "moduleVideos": [
                    {
                        "title": "HTML Crash Course For Absolute Beginners",
                        "link": "https://youtu.be/*****",
                        "duration": "01:00:42"
                    }
                ]
            },
            {
                "moduleName": "CSS Crash course",
                "moduleVideos": [
                    {
                        "title": "CSS Crash Course For Absolute Beginners",
                        "link": "https://youtu.be/*****",
                        "duration": "01:25:11"
                    }
                ]
            },

我只想获得几周,但我遇到了错误,我不知道该怎么做。

【问题讨论】:

  • 请编辑您的帖子以仅包含查找问题所需的minimal, reproducible example。附加整个文件 - 超过一百行可能不相关的代码 - 只会让问题更难找到。
  • @EldarB。哦。好的,谢谢我已经编辑了帖子。

标签: javascript reactjs react-native api object


【解决方案1】:

变化:

… Object?.entries(nodesData).map((i) => ( …

收件人:

… nodesData && Object.entries(nodesData).map((i) => ( …

【讨论】:

  • 您能解释一下吗?
【解决方案2】:

问题

该问题可能发生在初始渲染中。您正在尝试将 undefined 转换为对象条目数组。

const [nodesData, setNodesData] = useState(); // <-- undefined initial state!

...

Object?.entries(nodesData).map( ... // <-- blows up with error

测试

const nodesData = undefined;
console.log(Object.entries(nodesData)); // error

const nodesData = {};
console.log(Object.entries(nodesData)); // []

.map.forEach

Object?.entries(nodesData).map( ... 更改为Object?.entries(nodesData).forEach( ... 时的编辑不会返回任何要渲染的内容,因为.forEach 在技术上是无效返回。将该更改恢复为使用 .map

此外,由于条目的每个“值”仍然是一个对象,因此您需要选择要呈现的对象值。如果有嵌套数组,也需要映射到 JSX。

解决方案

提供有效的初始状态。一个空对象就足够了。

const [nodesData, setNodesData] = useState({});

如果在偶然的情况下 nodesData 状态稍后变为未定义,请使用空检查或提供后备值。

  • nodesData &amp;&amp; Object.entries(nodesData).map( ...
  • Object.entries(nodesData || {}).map( ...

理想情况下,您应该保持状态不变,至少始终是一个已定义的对象。

渲染 nodesData 周键

如果您只需要钥匙,那么您可以:

  • 从条目中渲染键(记住条目是键值对数组,即[[key1, value1], [key2, value2], ...]

     Object.entries(nodesData).map(([week, data]) => (
       <View style={{ padding: 5 }}>
         ...
           <Text .... >
             {week} // "week1", "week2", etc...
           </Text>
         ...
       </View>
    
  • 使用Object.keys 获取只是键的数组

     Object.keys(nodesData).map((week) => (
       <View style={{ padding: 5 }}>
         ...
           <Text .... >
             {week} // "week1", "week2", etc...
           </Text>
         ...
       </View>
    

【讨论】:

  • 我已经应用了这个,现在我没有收到错误,但我也没有得到几周的时间。你能帮我吗?我怎样才能从数据中获取周数?我需要更改 {i} 中的某些内容吗?
  • @HarshMishra 是的,我还添加了一个注释。您正在映射的每个元素仍然是一个对象,因此您需要决定要渲染每个“周”对象的哪个部分。例如,i.content 是一个数组,因此您需要将此数组映射到 JSX,并且该数组中的每个元素都有一个可以呈现的 moduleName 字符串和 `moduleVideos` 数组。
  • @HarshMishra 我明白了,也很简单。请参阅解决方案部分中的更新答案。
  • 它有效。真的非常感谢您的帮助。
  • 很好的答案!感谢您的贡献
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2021-01-05
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多