首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用AsyncStorage将一条记录存储到现有数组中

如何使用AsyncStorage将一条记录存储到现有数组中
EN

Stack Overflow用户
提问于 2019-12-13 16:19:04
回答 2查看 1.1K关注 0票数 1

我有一个现有的数组myItems和项目列表,从API (数组itemsFromApi)获取并呈现为一个Flatlist。我想把每个项目(不是一个项目数组)存储到一个现有的数组中,并将它保存在本地.

我想做的是:

  1. 从api获取项目数组并将其呈现为Flatlist。
  2. 将每个项保存到现有数组myItems (使用useState)
  3. 使用JSON.stringify和JSON.parse通过AsyncStorage

将数组myItems存储为值。

我所拥有的:

  1. 获取项并将其存储到数组myItems中很好。
  2. 在AsyncStorage中只存储一个项,尽管我使用

重新呈现数组myItems存储数组是空的,但AsyncStorage只有一个项。

这是代码的和平:

代码语言:javascript
运行
复制
// Array myItems, where i'd like to store the data
const [myItems, setMyItems] = useState([]); 

// Array of data from api
const [itemsFromApi, setItemsFromApi] = useState([]); 

// Fetch items from API and render it as a Flatlist, works good
const getItems = async () => {
   const response = await api.get('/...');
   setItemsFromApi(response.data)
};

<FlatList 
    data={itemsFromApi}
    keyExtractor = { (item, index) => index.toString() }
    renderItem={({ item })=>{
           return (
             <TouchableOpacity>
                 <Text>{item.id}</Text>
                 <Text>{item.title}</Text>
                 <Button title="Add" onPress={()=>{addItem(item))} />
            </TouchableOpacity>
       )
   }}
 />

// Save fetched items to array myItems
const addItem = (item) => {
   setMyItems([...myItems, item]);
   storeData();
};


// trying to store array myItems using AsyncStorage
 const storeData = async (myItems) => {
        try {
          await AsyncStorage.setItem('STORAGE_KEY', JSON.stringify(myItems));
          Alert.alert('Saved', 'Successful');
        } catch (error) {
            Alert.alert('Error', 'There was an error.')
        }
      };

// trying to retrieve data 
const retrieveData = async () => {
  try {
    const value = await AsyncStorage.getItem('STORAGE_KEY');
      if (value !== null) {
            console.log(JSON.parse(value))
        }
      } catch (error) {
            console.log(error)
      }
        return null;
  };

我肯定做错了什么,但我不明白是什么。提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-14 20:02:50

我找到了解决办法。

它是:

代码语言:javascript
运行
复制
const addItem = (item) => {
   setMyItems([...myItems, item]);
   storeData();
};

修改:

代码语言:javascript
运行
复制
const addItem = (item) => {
   myItems.push(item); // <- Here is the trick
   storeData();
   setMyContacts([...myItems]);
};

当我只设置

  1. 时,屏幕上的列表不会被更新。当我设置setMyContacts([...myItems , item])时,
  2. 会在状态中复制,并在屏幕上显示两次。正确是setMyContacts([...myItems]).
票数 0
EN

Stack Overflow用户

发布于 2019-12-13 19:13:05

使用下面的代码。

代码语言:javascript
运行
复制
<FlatList 
    data={itemsFromApi}
    keyExtractor = { (item, index) => index.toString() }
    renderItem={({ item })=>{
        return (
            <TouchableOpacity>
                <Text>{item.id}</Text>
                <Text>{item.title}</Text>
                <Button title="Add" onPress={()=>{setMyItems([...myItems, item]))} />
            </TouchableOpacity>
        )
    }}
/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59326288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档