@@ -1658,4 +1658,87 @@ describe('useQueries', () => {
16581658 ) ,
16591659 ) . toBeInTheDocument ( )
16601660 } )
1661+
1662+ it ( 'should not re-run stable combine on unrelated re-render' , async ( ) => {
1663+ const key1 = queryKey ( )
1664+ const key2 = queryKey ( )
1665+
1666+ const client = new QueryClient ( )
1667+
1668+ const spy = vi . fn ( )
1669+
1670+ function Page ( ) {
1671+ const [ unrelatedState , setUnrelatedState ] = React . useState ( 0 )
1672+
1673+ const queries = useQueries (
1674+ {
1675+ queries : [
1676+ {
1677+ queryKey : key1 ,
1678+ queryFn : async ( ) => {
1679+ await sleep ( 10 )
1680+ return 'first result'
1681+ } ,
1682+ } ,
1683+ {
1684+ queryKey : key2 ,
1685+ queryFn : async ( ) => {
1686+ await sleep ( 20 )
1687+ return 'second result'
1688+ } ,
1689+ } ,
1690+ ] ,
1691+ combine : React . useCallback ( ( results : Array < QueryObserverResult > ) => {
1692+ const result = {
1693+ combined : true ,
1694+ res : results . map ( ( res ) => res . data ) . join ( ',' ) ,
1695+ }
1696+ spy ( result )
1697+ return result
1698+ } , [ ] ) ,
1699+ } ,
1700+ client ,
1701+ )
1702+
1703+ return (
1704+ < div >
1705+ < div >
1706+ data: { String ( queries . combined ) } { queries . res }
1707+ </ div >
1708+ < div > unrelated: { unrelatedState } </ div >
1709+ < button onClick = { ( ) => setUnrelatedState ( ( s ) => s + 1 ) } >
1710+ increment
1711+ </ button >
1712+ </ div >
1713+ )
1714+ }
1715+
1716+ const rendered = render ( < Page /> )
1717+
1718+ await vi . advanceTimersByTimeAsync ( 21 )
1719+ expect (
1720+ rendered . getByText ( 'data: true first result,second result' ) ,
1721+ ) . toBeInTheDocument ( )
1722+
1723+ // initial renders: both pending, one pending, both resolved
1724+ expect ( spy ) . toHaveBeenCalledTimes ( 3 )
1725+
1726+ fireEvent . click ( rendered . getByRole ( 'button' , { name : / i n c r e m e n t / i } ) )
1727+
1728+ await vi . advanceTimersByTimeAsync ( 0 )
1729+
1730+ expect ( rendered . getByText ( 'unrelated: 1' ) ) . toBeInTheDocument ( )
1731+
1732+ // combine should NOT re-run for unrelated re-render with stable reference
1733+ expect ( spy ) . toHaveBeenCalledTimes ( 3 )
1734+
1735+ fireEvent . click ( rendered . getByRole ( 'button' , { name : / i n c r e m e n t / i } ) )
1736+
1737+ await vi . advanceTimersByTimeAsync ( 0 )
1738+
1739+ expect ( rendered . getByText ( 'unrelated: 2' ) ) . toBeInTheDocument ( )
1740+
1741+ // still no extra calls to combine
1742+ expect ( spy ) . toHaveBeenCalledTimes ( 3 )
1743+ } )
16611744} )
0 commit comments