【问题标题】:TypeError: undefined is not a function (near '...data.map...')TypeError: undefined is not a function ('...data.map...' 附近)
【发布时间】:2021-05-06 03:46:32
【问题描述】:

感谢您的帮助,我更新了我的代码。 当我使用 Expo 启动应用程序时,打开工作正常,但我丢失了未出现在屏幕上的扫描图标。 该图标以前出现过。 这个想法是扫描一些条形码以显示来自产品的相关数据。

这是我的新代码:

import React, { useState, useEffect } from "react";
import {
  StyleSheet,
  Text,
  View,
  FlatList,
  Button,
  AsyncStorage,
} from "react-native";
import { useNavigation } from "@react-navigation/core";
import { TouchableOpacity } from "react-native-gesture-handler";
import { FontAwesome5 } from "@expo/vector-icons";
import { MaterialCommunityIcons } from "@expo/vector-icons";
import { ActivityIndicator } from "react-native-paper";

function ProductsScreen() {
  const navigation = useNavigation();
  const [data, setData] = useState([]);
  const [isLoading, setisLoading] = useState(true);

  useEffect(() => {
    const fetchData = async () => {
      const data = await AsyncStorage.getItem("userData");

      setData(data);
      setisLoading(false);
    };
    fetchData();
  }, []);

  console.log(data);
  return isLoading ? (
    <ActivityIndicator />
  ) : (
    <>
      {data ? (
        <FlatList
          data={dataArray}
          keyExtractor={(item) => item.name}
          renderItem={({ item }) => (
            <>
              <Text>{item.brand}</Text>

              <View style={styles.scan}>
                <MaterialCommunityIcons
                  name="barcode-scan"
                  size={40}
                  color="black"
                  onPress={() => {
                    navigation.navigate("CameraScreen");
                  }}
                />
              </View>
            </>
          )}
        />
      ) : null}
    </>
  );
}
export default ProductsScreen;

谢谢你的cmets。

【问题讨论】:

  • 确保AsyncStorage.getItem("userData"); 正在返回一些东西,而且看起来你可能需要JSON.parse()
  • 您希望userData 项目包含什么?似乎它可能是未定义的,你没有考虑这种情况。
  • data.map中没有return,把花括号改成圆括号或者在前加上return语句
  • 您的key={index} 将呈现为文本,因为它位于标签之外。你需要&lt;React.Fragment key={index}&gt;,而不是仅仅&lt;&gt;,或者更好,而不是索引使用来自data对象的唯一ID。

标签: javascript reactjs react-native


【解决方案1】:

你可以使用 ? (可选链接)在映射之前确认数据不会产生未定义。

data?.map((data, index) => {return <>....</>}

【讨论】:

    【解决方案2】:

    你需要从data.map函数返回来渲染数组项

    return isLoading ? (
        <ActivityIndicator />
      ) : (
       <>
        {data?.map((data, index) => {
          return <View key ={index}>
            <Text> {data.products_name_fr} </Text>
            <Text> {data.brands} </Text>
            <Text> {data.image_url} </Text>
            <View style={styles.scan}>
              <MaterialCommunityIcons
                name="barcode-scan"
                size={40}
                color="black"
                onPress={() => {
                  navigation.navigate("CameraScreen");
                }}
              />
            </View>
          </View>;
        })}
        </>
      );

    或者是return的简写

    return isLoading ? (
        <ActivityIndicator />
      ) : (
      <>
        data?.map((data, index) => (
          <View key ={index}>
            <Text> {data.products_name_fr} </Text>
            <Text> {data.brands} </Text>
            <Text> {data.image_url} </Text>
            <View style={styles.scan}>
              <MaterialCommunityIcons
                name="barcode-scan"
                size={40}
                color="black"
                onPress={() => {
                  navigation.navigate("CameraScreen");
                }}
              />
            </View>
          </View>;
        ))
       </> 
      );

    【讨论】:

    • 感谢您的留言。
    • 我试过了,但我仍然有同样的错误信息(未定义不是函数('...data.map'附近)
    • 我的屏幕上显示了同样的错误:TypeError: undefined is not a function('near ...data.map...')。请问有什么办法解决这个问题吗?
    • 请检查我更新的答案,尝试一下,如果您仍然遇到问题,请使用更新的代码更新您的问题。
    • 谢谢托尼,我刚刚更新了我的代码。谢谢你的帮助。我使用了 FlatList 方法,它可以工作,但我丢失了一个珍贵的图标来扫描我的产品
    【解决方案3】:

    我像这样更改了我的代码,但我遇到了同样的错误。此外,从 const styles=Stylesheet.create 开始的部分代码似乎没有激活

    import React, { useState, useEffect } from "react";
    import { StyleSheet, Text, View, Button, AsyncStorage } from "react-native";
    import { useNavigation } from "@react-navigation/core";
    import { TouchableOpacity } from "react-native-gesture-handler";
    import { FontAwesome5 } from "@expo/vector-icons";
    import { MaterialCommunityIcons } from "@expo/vector-icons";
    import { ActivityIndicator } from "react-native-paper";
    import axios from "axios";
    
    function ProductsScreen() {
      const navigation = useNavigation();
      const [data, setData] = useState([]);
      const [isLoading, setisLoading] = useState(true);
    
      useEffect(() => {
        const fetchData = async () => {
          const data = await AsyncStorage.getItem("userData");
    
          setisLoading(false);
          setData(data);
        };
        fetchData();
      }, []);
    
      return isLoading ? (
        <ActivityIndicator />
      ) : (
        <>
          {data?.map((data, index) => {
            return (
              <>
                key ={index}
                <Text> {data.products_name_fr} </Text>
                <Text> {data.brands} </Text>
                <Text> {data.image_url} </Text>
                <View style={styles.scan}>
                  <MaterialCommunityIcons
                    name="barcode-scan"
                    size={40}
                    color="black"
                    onPress={() => {
                      navigation.navigate("CameraScreen");
                    }}
                  />
                </View>
              </>
            );
          })}
        </>
      );
    
      const styles = StyleSheet.create({
        products: {
          alignItems: "center",
          justifyContent: "center",
        },
    
        scan: {
          marginLeft: 30,
          position: "absolute",
          bottom: 0,
          right: 20,
          marginBottom: 60,
          marginRight: 30,
          padding: 10,
          borderRadius: 10,
          backgroundColor: "#ff9234",
        },
      });
    }
    export default ProductsScreen;
    
    

    【讨论】:

      【解决方案4】:

      我稍微更改了我的代码,但我得到了另一种类型的错误:不变违规:文本字符串必须在组件内呈现。我将非常感谢您的 cmets 和支持来解决此问题

      return isLoading ? (
          <ActivityIndicator />
        ) : (
          <>
            data?.map((data, index) => (
            <>
              <Text> {data.products_name_fr} </Text>
              <Text> {data.brands} </Text>
              <Text> {data.image_url} </Text>
              <View style={styles.scan}>
                <MaterialCommunityIcons
                  name="barcode-scan"
                  size={40}
                  color="black"
                  onPress={() => {
                    navigation.navigate("CameraScreen");
                  }}
                />
              </View>
            </>
            ))
          </>
        );
      }
      

      【讨论】:

      • 不要发表新评论,刚刚更新了您的问题。
      【解决方案5】:

      在useEffect中,将数据设置为数组。示例

      const = [data, setData] = useState([]); // do this in your state
      
      setData([data]); //do this in your useEffet hook
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 2021-06-21
        • 1970-01-01
        • 2014-08-15
        • 2015-01-14
        相关资源
        最近更新 更多