@@ -1810,4 +1810,119 @@ describe('useSWR - local mutation', () => {
1810
1810
[ key , 'inf' , 1 ]
1811
1811
] )
1812
1812
} )
1813
+ it ( 'should support revalidate as a function' , async ( ) => {
1814
+ let value = 0 ,
1815
+ mutate
1816
+ const key = createKey ( )
1817
+ function Page ( ) {
1818
+ mutate = useSWRConfig ( ) . mutate
1819
+ const { data } = useSWR ( key , ( ) => value ++ )
1820
+ return < div > data: { data } </ div >
1821
+ }
1822
+
1823
+ renderWithConfig ( < Page /> )
1824
+ screen . getByText ( 'data:' )
1825
+
1826
+ // mount
1827
+ await screen . findByText ( 'data: 0' )
1828
+
1829
+ act ( ( ) => {
1830
+ // value 0 -> 0
1831
+ mutate ( key , 100 , { revalidate : ( ) => false } )
1832
+ } )
1833
+ await screen . findByText ( 'data: 100' )
1834
+
1835
+ act ( ( ) => {
1836
+ // value 0 -> 1
1837
+ mutate ( key , 200 , { revalidate : ( ) => true } )
1838
+ } )
1839
+ await screen . findByText ( 'data: 200' )
1840
+ await screen . findByText ( 'data: 1' )
1841
+ } )
1842
+
1843
+ it ( 'the function-style relivadate option receives the key and current data' , async ( ) => {
1844
+ let value = 0 ,
1845
+ mutate
1846
+ const key = createKey ( )
1847
+ function Page ( ) {
1848
+ mutate = useSWRConfig ( ) . mutate
1849
+ const { data } = useSWR ( key , ( ) => value ++ )
1850
+ return < div > data: { data } </ div >
1851
+ }
1852
+
1853
+ renderWithConfig ( < Page /> )
1854
+ screen . getByText ( 'data:' )
1855
+
1856
+ // mount
1857
+ await screen . findByText ( 'data: 0' )
1858
+
1859
+ act ( ( ) => {
1860
+ // value 0 -> 0
1861
+ mutate ( key , 100 , { revalidate : ( d , k ) => k === key && d === 200 } ) // revalidate = false
1862
+ } )
1863
+ await screen . findByText ( 'data: 100' )
1864
+
1865
+ act ( ( ) => {
1866
+ // value 0 -> 1
1867
+ mutate ( key , 200 , { revalidate : ( d , k ) => k === key && d === 200 } ) // revalidate = true
1868
+ } )
1869
+ await screen . findByText ( 'data: 200' )
1870
+ await screen . findByText ( 'data: 1' )
1871
+ } )
1872
+
1873
+ it ( 'the function-style relivadate option works with mutate filter' , async ( ) => {
1874
+ const key1 = createKey ( )
1875
+ const key2 = createKey ( )
1876
+ const key3 = createKey ( )
1877
+
1878
+ let mockData = {
1879
+ [ key1 ] : 'page1' ,
1880
+ [ key2 ] : 'page2' ,
1881
+ [ key3 ] : 'page3'
1882
+ }
1883
+ function Page ( ) {
1884
+ const mutate = useSWRConfig ( ) . mutate
1885
+ const { data : data1 } = useSWR ( key1 , ( ) => mockData [ key1 ] )
1886
+ const { data : data2 } = useSWR ( key2 , ( ) => mockData [ key2 ] )
1887
+ const { data : data3 } = useSWR ( key3 , ( ) => mockData [ key3 ] )
1888
+
1889
+ return (
1890
+ < >
1891
+ < div > data1: { data1 } </ div >
1892
+ < div > data2: { data2 } </ div >
1893
+ < div > data3: { data3 } </ div >
1894
+ < button
1895
+ onClick = { ( ) => {
1896
+ // key1 is filtered
1897
+ mutate ( k => k !== key1 , 'updated' , {
1898
+ // only revalidate key3
1899
+ revalidate : ( d , k ) => d === 'updated' && k === key3
1900
+ } )
1901
+ } }
1902
+ >
1903
+ click
1904
+ </ button >
1905
+ </ >
1906
+ )
1907
+ }
1908
+
1909
+ renderWithConfig ( < Page /> )
1910
+
1911
+ // mount
1912
+ await screen . findByText ( 'data1: page1' )
1913
+ await screen . findByText ( 'data2: page2' )
1914
+ await screen . findByText ( 'data3: page3' )
1915
+
1916
+ mockData = {
1917
+ [ key1 ] : '<page1>' ,
1918
+ [ key2 ] : '<page2>' ,
1919
+ [ key3 ] : '<page3>'
1920
+ }
1921
+
1922
+ fireEvent . click ( screen . getByText ( 'click' ) )
1923
+
1924
+ await screen . findByText ( 'data1: page1' )
1925
+ await screen . findByText ( 'data2: updated' )
1926
+ await screen . findByText ( 'data3: <page3>' )
1927
+ } )
1813
1928
} )
0 commit comments