代码之家  ›  专栏  ›  技术社区  ›  bos570

使用react钩子更新本地状态

  •  0
  • bos570  · 技术社区  · 7 年前

    我正在学习如何使用钩子,但在理解如何使用本地组件状态时仍有一些困难。

    在下面的组件中,我获取数据以显示为列表。我将其存储在本地州并显示列表。

    现在,我想从列表中删除一个项目,并更新显示数据的本地状态中的当前变量,并删除刚才删除的一个项目。

    问题:在这种情况下,如何使用局部状态变量 feeds deleteFeed 方法,以便更新列表。在基于类的组件中,我可以使用 this.state.feeds

    import React, { useState, useEffect } from 'react'
    import ReactDOM from 'react-dom'
    
    import * as FeedsAPI from '../../../lib/feeds/FeedsAPI'
    
    import FeedsList from './components/FeedsList'
    import AddNewFeed from './components/AddNewFeed'
    import DSPageLoader from '../../../components/DSPageLoader/DSPageLoader'
    import FeedCard from './components/FeedCard'
    
    const AddNewFeedCard = FeedCard(AddNewFeed)
    
    export default function Feeds (params) {
        const[feeds, setFeeds] = useState([])
        const[providers, setProviders] = useState([])
        const[loading, setLoading] = useState(true)
        const[error, setError] = useState(false)
    
        /**
         * Method used run after evey lifecycle event
         */
        useEffect( () => {      
            Promise.all(
                [
                    FeedsAPI.getFeeds('id', 732),
                    FeedsAPI.getFeedProviders()
                ]
            )
            .then( response => {
                setFeeds(response[0])
                setProviders(response[1])
                setLoading(false)
            })
            .catch( error => {setLoading(false); setError(error)})
        }, [])
    
        /** 
         * Update feeds in local state 
         * 
         * @param feed single feed object 
         */
        const updateFeed = (feed) => console.log(feed)
    
        /**
         * Delete feed
         * 
         * @param feedId 
         */
        const deleteFeed = (feedId) => {
            FeedsAPI.deleteFeed(feedId)
            .then( response => { 
                let updatedFeeds = feeds.filter( feed => feed.id != feedId )
                setFeeds(feeds)
            })
            .catch( error => console.log(error))
        }
    
        /* TODO: Refactor this to use with page loading HOC */
        if (loading) {
            return <DSPageLoader/>
        }
    
        return (
            <div className="container">
                <FeedsList 
                    feeds={feeds} 
                    providers={providers}
                    updateFeed={updateFeed}
                    deleteFeed={deleteFeed}
                    />
                <AddNewFeedCard />
            </div>
        )
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Sujit.Warrier    7 年前

    很简单,只要在使用变量feed之前定义了它,就可以使用变量feed。您正确地使用了它,但出现了一个错误,即更新时没有将状态设置为updated feeds变量

     let updatedFeeds = feeds.filter( feed => feed.id != feedId )
     setFeeds(updatedFeeds) // you were setting it to the old unchanged feeds variable
    

    记住filter函数从不修改原始变量它总是创建一个被修改的新对象