2017-06-19 30 views
1

我获取数据。获取数据在我<code>componentDidMount()</code>方法阵营与本土<code>fetch(url, ...)</code>“只能更新一安装或安装组件”

所以我的课看起来像

class Posts extends Component { 
    state = { 
    posts: [] 
    }; 

    componentDidMount() { 
    fetch('https://...').then(res => res.json()).then(res => { 
     this.setState({ posts: res.posts }); 
    } 
    } 

    render() { 
    return <FlatList data={this.state.posts} ... />; 
    } 
} 

它工作得很好,直到所有我开始使用reduxredux-persist

现在我得到警告Warning: Can only update a mounted or mounting component. ...

我不明白为什么会这样,因为如果它被称为在componentDidMount应该安装。

我想知道是否需要中止取数componentWillUnmount或者如果我应该实际将数据提取到redux存储区而不是只将数据临时存储在“本地组件”中。当我打开大多数其他应用程序时,似乎数据已在我打开应用程序时加载 - 这是由于非常快速的数据检索还是将数据保存在持久存储中?

我看过一些项目,他们在componentDidMount里面使用if (this.isMounted) { .. },但是据我了解这个方法的生命周期,这个组件总是在这个时候挂载。此外,似乎isMounted已弃用。

我在做什么错?这个问题只发生在我启动应用程序时,所以如果我导航到另一条路线然后返回到这条路线没有问题。

回答

2

由于fetch是异步,当数据到达时,组件可能不被安装。当你的then中的箭头函数被调用时,该组件已经完成安装并可能继续渲染。这是Promise的性质。

class Posts extends Component { 
    state = { 
    posts: [] 
    }; 

    componentDidMount() { 
    this.mounted = true; 
    fetch('https://...').then(res => res.json()).then(res => { 
     if(this.mounted) this.setState({ posts: res.posts }); 
    } 
    } 

    componentWillUnmount() { 
    this.mounted = false; 
    } 

    render() { 
    return <FlatList data={this.state.posts} ... />; 
    } 
} 
+0

感谢:

你应该确保在设置它的状态,这样的组件仍然安装!有用!但是这个方法对我来说似乎有点奇怪。用redux取数据会有意义吗? – Jamgreen

+1

当我使用redux时,我这样做,但它并不总是有道理的。是的,终极版将免费为您担心安装(因为'connect'),但话又说回来了,现在你需要卸载时,可能(取决于您是否想缓存与否)从内存中清除数据。 还有其他的方法少了混乱,而不是承诺保持它在全球范围的状态(这并不总是适合)来获取这些数据。我最喜欢的是“重组”。 –

+0

为什么这不是最好的方法思考食物:https://reactjs.org/blog/2015/12/16/ismounted-antipattern.html – Martin

相关问题