首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncStorage.getItem in componentDidMount

AsyncStorage.getItem in componentDidMount
EN

Stack Overflow用户
提问于 2018-01-26 05:19:56
回答 2查看 4K关注 0票数 0

我正在尝试创建一个简单的要做的应用程序来练习React本机,并且当componentDidMount时我很难检索到这些项。

应用程序state

代码语言:javascript
复制
this.state = {
  task: "",
  tasks: []
};

当用户添加一个新任务时,handleAddTask将运行,我将AsyncStorage.setItem附加为setState的回调,以便在状态更新后将任务数组保存到存储中。

代码语言:javascript
复制
handleAddTask = () => {

  let notEmpty = this.state.task.trim().length > 0;
  if (notEmpty) {
    this.setState(
      prevState => {
        return {
          tasks: prevState.tasks.concat(prevState.task)
        };
      },() => {
        AsyncStorage.setItem("tasks", JSON.stringify(this.state.tasks));
      }
    );
  }

};

类似地,当用户点击列表项handleDelete运行时,它会从任务数组中移除选定的任务并更新AsyncStorage

代码语言:javascript
复制
handleDelete = index => {

  this.setState(
    prevState => {
      return {
        tasks: prevState.tasks.filter((place, i) => {
          return i !== index;
        })
      };
    },() => {
      AsyncStorage.setItem("tasks", JSON.stringify(this.state.tasks));
    }
  );

};

但是,我试图从AsyncStorage中提取componentDidMount中的任务数组,如下所示:

代码语言:javascript
复制
componentDidMount() {
  AsyncStorage.getItem("tasks")
    .then(value => {
      this.setState({ "tasks": value });
    })
    .done();
}

显示任务列表的方式是通过一个名为List的组件传递状态:

代码语言:javascript
复制
<List
  listItems={this.state.tasks}
  handleDelete={this.handleDelete}
/>

List.js内部,我正在通过任务数组进行映射:

代码语言:javascript
复制
export default class List extends Component {

  render() {

    const namesOutput = this.props.listItems.map((name, i) => (
      <TouchableOpacity
        key={i}
        onPress={() => this.props.handleDelete(i)}
        activeOpacity={0.6}
        style={styles.listItemContainer}
      >
        <Text style={styles.listItemText}>{name}</Text>
      </TouchableOpacity>
    ));

    return (
      <View style={styles.listContainer}>
        <ScrollView>{namesOutput}</ScrollView>
      </View>
    );
  }

}

我得到了以下错误:

TypeError:未定义不是一个函数(计算'this.props.listItem.map')

我一直在评论行,看看问题出在哪里,我只能假设这是我在componentDidMount中获取条目的方式。

关于异步JavaScript,我遗漏了一些东西吗?而且,当我做JSON.parse时,我必须要做getItem吗?如果有人对我的代码有更多的反馈,我很想了解更多。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-26 06:31:56

保存到存储JSON.stringify()值,然后使用它而不使用JSON.parse()。我认为这才是问题所在。您可以在List组件呈现的断点上停止检查它,然后再映射它的道具,并检测您的props.listItemscomponentDidMount之后不是数组。

票数 1
EN

Stack Overflow用户

发布于 2018-01-26 05:31:55

AsyncStorage返回了一个承诺。因此,当调用检索componentDidMount中的项时,即使在检索值之前,代码也会运行传递.then

我的建议是给listItem一些虚拟对象,这样它就不会在第一次调用时就被定义了。

第二个建议是使用await而不是.then,并在调用listenItem.map时使用助手函数,以便在加载了值之后才调用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48456158

复制
相关文章

相似问题

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