|
1 | | -import Callout from 'nextra-theme-docs/callout' |
| 1 | +import Link from 'next/link' |
2 | 2 |
|
3 | 3 | # useSelect |
4 | 4 |
|
5 | | -<Callout> |
6 | | - When using a dynamic `filter`, you must ... |
7 | | -</Callout> |
| 5 | +Performs vertical filtering with SELECT. |
| 6 | + |
| 7 | +```js highlight=4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 |
| 8 | +import { useSelect } from 'react-supabase' |
| 9 | + |
| 10 | +function Page() { |
| 11 | + const [ |
| 12 | + { count, data, error, fetching }, |
| 13 | + selectTodos, |
| 14 | + ] = useSelect( |
| 15 | + 'todos', |
| 16 | + // Passing optional options |
| 17 | + { |
| 18 | + columns: 'id, name, description', |
| 19 | + filter: (query) => query.eq('status', 'completed'), |
| 20 | + options: { |
| 21 | + count: 'exact', |
| 22 | + head: false, |
| 23 | + }, |
| 24 | + }, |
| 25 | + ) |
| 26 | + |
| 27 | + if (error) return <div>{error.message}</div> |
| 28 | + if (fetching) return <div>Loading todos</div> |
| 29 | + if (data?.length === 0) return <div>No todos</div> |
| 30 | + |
| 31 | + return ... |
| 32 | +} |
| 33 | +``` |
| 34 | +
|
| 35 | +## Dynamic filtering |
| 36 | +
|
| 37 | +When using dynamic filters, you must make sure filters aren't recreated every render. Otherwise, your request can get stuck in an infinite loop. |
| 38 | +
|
| 39 | +The easiest way to avoid this is to create dynamic filters with the [`useFilter`](/documentation/data/use-filter) hook: |
| 40 | +
|
| 41 | +```js |
| 42 | +import { useState } from 'react' |
| 43 | +import { useFilter, useSelect } from 'react-supabase' |
| 44 | + |
| 45 | +function Page() { |
| 46 | + const [status, setStatus] = useState('completed') |
| 47 | + const filter = useFilter( |
| 48 | + (query) => query.eq('status', status), |
| 49 | + [status], |
| 50 | + ) |
| 51 | + const [{ data }] = useSelect('todos', { filter }) |
| 52 | + |
| 53 | + return ... |
| 54 | +} |
| 55 | +``` |
0 commit comments