【问题标题】:Simplest way to merge two useState values合并两个 useState 值的最简单方法
【发布时间】:2021-12-13 13:45:32
【问题描述】:

我有一个 react native 钩子,其中 trips 必须在每次将 createdTrips 添加到状态时更新:

        const [trips, setTrips] = useState([]);
        
        function fetchCreatedTrips() {
            try {
                API.graphql(graphqlOperation(onCreateTrip)).subscribe({
                    next: (result) => {
                        console.log(result);
                        const updatedTrips = [...trips, result.value.data.onCreateTrip]
                        setTrips(updatedTrips)
                    }
                })
            } catch (err) { console.log(err) }
        }
    
  

现在,当我第一次打开屏幕时,它会呈现列表中的所有 trips 项目。 但是,使用当前代码,在我创建行程并返回该屏幕后,它当前不会返回所有行程 + 新创建的行程,而是仅返回一个行程,即新创建的行程。我怎样才能返回列表中的所有项目?提前抱歉,我是初学者。

【问题讨论】:

    标签: react-native react-hooks use-state


    【解决方案1】:

    在为效果设置新状态时,您应该包含之前的行程值。您可以使用展开运算符来做同样的事情。

    const createdTrips = [result.value.data.onCreateTrip];
    setTrips([...createdTrips, ...trips]);
    

    或者更好地将新创建的行程合并到updateTrips变量中,然后设置为状态值,

    const udpatedTrips = [...trips,result.value.data.onCreateTrip];
    setTrips(udpatedTrips);
    

    您的代码中的问题是您同时触发了这两个方法,并且可能存在竞争条件,因此您会在屏幕上看到随机更新。

    理想情况下,您需要在 API 调用和状态更新中引入一些一致性。所以首先 fetchTrips()->then->fetchCreatedTrips()。试试下面的代码,我不会立即在 fetchTrips() 中更新状态,而是将结果传递给 fetchCreatedTrips() ,它会完成 API 调用并一起更新状态。

    const [trips, setTrips] = useState([]);
        
    useEffect(() => {
        fetchTrips();
      }, [])
    
    
       async function fetchTrips() {
        try {
          const tripData =  await API.graphql(graphqlOperation(listTrips));
          const trips = tripData.data.listTrips.items
          fetchCreatedTrips(trips);
          
        } catch (err) { console.log(err) }
      }
    
    function fetchCreatedTrips(fetchedTrips) {
        try {
            API.graphql(graphqlOperation(onCreateTrip)).subscribe({
                next: (result) => {
                    console.log(result);
                    const updatedTrips = [...fetchedTrips,...updatedTrips];
                    setTrips(updatedTrips)
                }
            })
        } catch (err) { console.log(err) }
    }
    

    PS:请正确处理异常。

    【讨论】:

    • 它现在显示随机数量的项目,有时会更新,有时不会。我认为我的代码有问题。
    • 在您发布整个代码后,我遇到了这个问题。让我编辑我的解决方案。
    • 谢谢,它现在不再显示任何列表,但让我无法读取未定义的属性 X(对于项目组件)任何想法为什么会发生这种情况? Ps 请检查更新的平面列表代码
    • 我看不出 FlatList 逻辑有什么问题,你能把 MyTripsPostItem 代码贴出来吗?
    • 它似乎给出了这个错误 Cannot read property CreateTrip of undefined
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 2013-09-13
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2014-12-24
    • 2015-11-07
    相关资源
    最近更新 更多