【问题标题】:React Native FlatList renders data character by characterReact Native FlatList 逐字符呈现数据
【发布时间】:2021-02-07 09:54:32
【问题描述】:

我有一个这样的对象数组:

[
  {"name":"XYZ","price":100,"instock":true},
  {"name":"OTR","price":945,"instock":true},
  {"name":"SLG","price":343,"instock":true}
]

Flatlist renderItem 像这样单独显示每个字符 Output screenshot

我的代码是这样的

<View>
      {cartItems !== [] && (
        <FlatList
          data={cartItems}
          renderItem={({item}) => (
            <View>
              <Text>{item}</Text>
            </View>
          )}
          keyExtractor={(item, index) => index.toString()}
        />
      )}
    </View>

我也试过这个renderItem={({item: {name, price}}) =&gt; ()} 并尝试打印,它没有显示任何内容,当我将它记录到控制台时,它们都未定义

<View>
          {cartItems !== [] && (
            <FlatList
              data={[cartItems]}
              renderItem={({item}) => (
                <View>
                  <Text>{item}</Text>
                </View>
              )}
              keyExtractor={(item, index) => index.toString()}
            />
          )}
        </View>

我也解构了

但它是这样渲染的

[{"name":"XYZ","price":100,"instock":true},
 {"name":"OTR","price":945,"instock":true},
 {"name":"SLG","price":343,"instock":true}]

这是完整的代码

const ManageOrders = () => {


const [cartItems, setCartItems] = useState([]);

  const getItem = async () => {
    try {
      const item = await AsyncStorage.getItem('CartItem');
      // const items = JSON.parse(item); //This gave me error
      setCartItems(item);
    } catch (error) {
      console.log(error);
    }
  };

  useEffect(() => {
    getItem();
  }, []);

//   const data = JSON.parse(cartItems) //This gave me error
  return (
    <>
      <SafeAreaView style={styles.safeAreaView1} />
      <SafeAreaView style={styles.safeAreaView2}>
        <View>
          {cartItems !== [] && (
            <FlatList
              data={cartItems}
              renderItem={({item}) => (
                <View>
                  <Text>{item}</Text>
                </View>
              )}
              keyExtractor={(item, index) => index.toString()}
            />
          )}
        </View>
      </SafeAreaView>
    </>
  );
};

export default ManageOrders;

注意:数据 cartItems 我是从 asyncstorage AsyncStorage.getItem("CartItems") 得到的 谁能帮我解决这个问题??

【问题讨论】:

    标签: react-native react-native-flatlist asyncstorage


    【解决方案1】:

    对我来说,问题是在 REDUX 中保存时我没有将我的 API 转换为 JSON 对象。

    let itemList = JSON.parse(response.data.response.dataList)
    

    我这样做了,错误消失了。

    【讨论】:

      【解决方案2】:

      这就像循环遍历一个对象数组,通过说 {item} 表示数组的每个对象,将 item 添加到文本字段会将整个对象显示为字符串!我假设您只想显示对象中的某个键,例如:让我们将名称添加到文本字段:

       <View>
                {cartItems !== [] && (
                  <FlatList
                    data={[cartItems]}
                    renderItem={({item}) => (
                      <View>
                        <Text>{item.name}</Text>
                      </View>
                    )}
                    keyExtractor={(item, index) => index.toString()}
                  />
                )}
              </View>
      

      注意我们访问了项目对象的属性名(objectName.propertyName)

      【讨论】:

      • item.name 没有显示任何内容,然后我将其记录到控制台并在 undefined 中看到该名称
      • 我现在看到了问题,它是一个对象数组而不是一个对象,所以如果你说 item[0].name 我将得到 items 数组中第一个对象的名称
      • 是的,它是一个对象数组,这就是 FlatList 所期望的 data 道具我按照你说的那样尝试了 item[0].name 仍然未定义:(
      • 你能打印出项目并给我看结果吗?
      【解决方案3】:

      您需要对要显示的字段进行解构...

      renderItem={({item: { name, price }}) =&gt; (

      &lt;Text&gt;{name}&lt;/Text&gt;

      第一种方法 因为你在做什么 -> Text&gt;{item}&lt;/Text&gt; 正在显示你的对象 .toString() 的表示 {"name":"XYZ","price":100,"instock":true}

      编辑 - 第 2 期

      在您的第二种方法中 您将cardItems 传递到数组data={[cartItems]} ...因此,您将带有单个项目(cardItems)的数组填充到您的FlatList ...这将导致该array-的.toString()表示形式of-objects项目

      <View>
        {
        cardItems ? 
          <FlatList
            data={cartItems} // <--- Look at me
            renderItem={({ item: { name } }) => (
              <View>
                <Text>{name}</Text>
              </View>
            )}
            keyExtractor={(item, index) => index.toString()}
          />
        : <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center'}}><Text>Loading</Text></View>}
      </View>
      

      第三期

      如果您通过异步操作获得cardItems...那么您需要先检查它是否存在...而不是它是否有项目...因为起初它将是undefined,那么您的条件cartItems !== [] 将评估为false,并且您的FlatList 将被渲染...

      第 4 期 :))

      您从AsyncStorage 获取数据...它已被字符串化...所以不要忘记先JSON.parse...

      【讨论】:

      • 我做了同样的事情,但是当我 console.log() 时名称未定义,价格也未定义
      • 你是对的@HendEl-Sahil,起初我也在做同样的事情{cartItems},如果你尝试像 item.name 一样访问它,它是未定义的
      • 如果您通过异步操作获得cardItems ...那么您需要先检查它是否存在...而不是如果它有项目...首先它会是undefined,那么你的条件cartItems !== []将评估为false,你的FlatList将被渲染
      • 数据来自 AsyncStorage,FlatList 正在渲染数据,但问题是它没有按预期渲染,而是渲染数据的每个字符(甚至是括号和 qoutes)
      • cartItems 是一个对象数组,我做了JSON.parse(cartItems) 它给了我这个错误SyntaxError: JSON Parse error: Unexpected EOF
      【解决方案4】:

      您需要访问item.name
      并检查cartItems.length

      import React from "react";
      import { Button, FlatList, StyleSheet, Text, View } from "react-native";
      
      const cartItems = [
        { name: "XYZ", price: 100, instock: true },
        { name: "OTR", price: 945, instock: true },
        { name: "SLG", price: 343, instock: true }
      ];
      function App() {
         if (cartItems.length > 0)
          return (
            <View>
              <FlatList
                data={cartItems}
                renderItem={({ item }) => (
                  <View>
                    <Text>{item.name}</Text>
                  </View>
                )}
                keyExtractor={(item, index) => item + index.toString()}
              />
            </View>
          );
      }
      
      export default App;
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 2021-03-25
        • 1970-01-01
        • 2019-10-18
        • 2020-06-20
        • 2021-08-31
        • 2019-06-17
        相关资源
        最近更新 更多