使用AsyncStorage保存列表

iLightFPS

因此,我制作了一个“记事本”应用程序,并希望将用户编写的文本等保存下来,因此当用户退出该应用程序时,该文本不会被重置。

我是本机新手,经过几次Google搜索后,我需要AsyncStorage吗?做到这一点。但真的不知道该怎么做。

import React, { useState } from 'react';
import { 
StyleSheet, 
Text, 
View, 
FlatList, 
TouchableWithoutFeedback, 
TouchableOpacity,
Keyboard,
AsyncStorage
} from 'react-native';
import Header from './components/header';
import ListItem from './components/listitem';
import AddList from './components/addlist';

export default function App() {

    const [todos, setTodos] = useState([

    ]);

    const pressHandler = (key) => {
      setTodos((prevTodos) => {
      return prevTodos.filter(todo => todo.key != key);
     });
    }

    const submitHandler = (text) => {
      if(text.length > 0) {
        setTodos((prevTodos) => {
        return [
       { text: text, key: Math.random().toString() },
      ...prevTodos
     ];
   })
   } 
  }

 return (
  <TouchableWithoutFeedback onPress={() => {
    Keyboard.dismiss();
   }}>
  <View style={styles.container}>
    <Header />
     <View style={styles.content}>
      <AddList  submitHandler={submitHandler} />
       <View style={styles.todoList}>
        <FlatList 
          data={todos}
            renderItem={({ item }) => (
            <ListItem item={item} pressHandler={pressHandler} />
           )}
        />
      </View>
     </View>
   </View>
 </TouchableWithoutFeedback>
  );
  }

一个新问题,无处不在,在不触及代码的情况下就解决了

    const pressHandler = key =>
      setTodos(prevTodos => {
       const newTodos = prevTodos.filter(todo => todo.key !== key);

      storeTodosInAsync(newTodos);

      console.log(prevTodos);
    return newTodos;

    });


const submitHandler = text => {
  if (text.length > 0) {
      const key = Math.random().toString();
        setTodos(prevTodos => {
        const newTodos = [{ text, key }, ...prevTodos];

        storeTodosInAsync(newTodos);
        console.log(newTodos);
        return newTodos;
     });
   }
 };
詹姆士

您可以使用AsyncStorage将数据存储到本地存储或从本地存储加载数据。需要注意的一件事是数据必须是字符串,因此诸如对象之类的不是字符串的东西都需要进行字符串化处理。您可以JSON.stringify(...)用来执行此操作。然后,当您取回字符串时,可以使用JSON.parse(...)将其转换回一个对象。

因此,要将您当前的代码转换为可以自动加载保存的待办事项并始终保存最新代码的内容,可以编写以下代码:

import React, { useState, useEffect } from 'react';
import {
  StyleSheet,
  Text,
  View,
  FlatList,
  TouchableWithoutFeedback,
  TouchableOpacity,
  Keyboard,
  AsyncStorage,
  Button
} from 'react-native';
import Header from './components/header';
import ListItem from './components/listitem';
import AddList from './components/addlist';

export default function App() {
  const [todos, setTodos] = useState([]);

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

  const pressHandler = key => {
    console.log('Todos BEFORE delete');
    console.log(todos);

    const newTodos = todos.filter(todo => todo.key !== key);

    console.log('Todos AFTER delete');
    console.log(todos);

    setTodos(newTodos);
    storeTodosInAsync(newTodos);
  };

  const submitHandler = text => {
    if (text.length === 0) return;

    const key = Math.random().toString();

    console.log('Todos BEFORE submit');
    console.log(todos);

    const newTodos = [{ text, key }, ...todos];

    console.log('Todos AFTER submit');
    console.log(todos);

    setTodos(newTodos);
    storeTodosInAsync(newTodos);
  };

  const asyncStorageKey = '@todos';

  const storeTodosInAsync = newTodos => {
    const stringifiedTodos = JSON.stringify(newTodos);

    AsyncStorage.setItem(asyncStorageKey, stringifiedTodos).catch(err => {
      console.warn('Error storing todos in Async');
      console.warn(err);
    });
  };

  const restoreTodosFromAsync = () => {
    AsyncStorage.getItem(asyncStorageKey)
      .then(stringifiedTodos => {
        console.log('Restored Todos:');
        console.log(stringifiedTodos);

        const parsedTodos = JSON.parse(stringifiedTodos);

        if (!parsedTodos || typeof parsedTodos !== 'object') return;

        setTodos(parsedTodos);
      })
      .catch(err => {
        console.warn('Error restoring todos from async');
        console.warn(err);
      });
  };

  return (
    <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
      <View style={styles.container}>
        <Header />
        <View style={styles.content}>
          <AddList submitHandler={submitHandler} />
          <View style={styles.todoList}>
            <FlatList
              data={todos}
              renderItem={({ item }) => <ListItem item={item} pressHandler={pressHandler} />}
            />
          </View>
        </View>
      </View>
    </TouchableWithoutFeedback>
  );
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用pickle保存列表

麻烦用AsyncStorage保存值

使用 Codable 或 userDefaults 保存列表

React-Native AsyncStorage使用iPhone Simulator在哪里将数据保存在磁盘上?

如何以及在哪里使用AsyncStorage保存整个Redux存储

在 _onRefresh 中使用 AsyncStorage?

使用React Native AsyncStorage存储列表:是多个键还是一个?

React Native AsyncStorage保存多个项目

在 AsyncStorage React Native 上保存对象数组

使用lapply在列表中使用名称保存从列表生成的图

在 AndroidStudio 上使用 SharedPreferences 保存列表

保存使用pwalk生成的ggplots列表

保存列表内容以备下次使用

列表渲染 React Native 之前的 AsyncStorage

AsyncStorage使用Promise中的boolean

使用循环从更大的列表中保存新列表

在AsyncStorage中保存一组项目

保存多个项目时AsyncStorage无法正常工作

保存清单列表插入列表的另一个列表,但使用Python的变化

当我尝试在React Native中使用AsyncStorage保存值时,但是当我尝试检索值时,我有{“ _U”:0,“ _V”:0,“ _W”:null,“ _X”:null}

为什么使用 AsyncStorage.setItem 是不行的?

使用 AsyncStorage 存储表单的多个值

使用API和AsyncStorage数据构建ListView

使用AsyncStorage反应本机/故障获取项目

尝试使用AsyncStorage时应用崩溃

使用mapply保存时保留列表元素的名称

使用流从列表中保存字符串

是否可以使用列表或数组保存笔画?

如何使用颤振在 Firebase Firestore 中保存对象列表