This appears to be a problem solved by Lifting State Up. useLazyQuery
takes a gql query and options and returns a function to execute the query at a later time. Sounds like you want the child component to update the variables
config parameter.
BrowseMovies
Move
firstLetter
stateBrowseMovies
componentUpdate query parameters/options/config from state
Add
useEffect
to trigger fetch when state updatesPass
firstLetter
state andsetFirstLetter
state updater to child componentconst BrowseMovies = () => { const [firstLetter, setFirstLetter] = useState(''); const [fetchMovies, { data, loading}] = useLazyQuery( BROWSE_MOVIES_BY_LETTER, { variables: { firstLetter } } // <-- pass firstLetter state ); useEffect(() => { if (firstLetter) { fetchMovies(); // <-- invoke fetch on state update } }, [firstLetter]); return ( <div className="browserWrapper"> <h2>Browse Movies</h2> <AlphabetSelect pushLetterToParent={setFirstLetter} // <-- pass state updater selectedLetter={firstLetter} // <-- pass state /> { data && !loading && data.browseMovies.map((movie: any, index: number) => { return ( <div key={index} className="browseRow"> <a className="movieTitle"> {movie.name} </a> </div> ) }) } </div> ) }
AlphabetSelect
Attach
pushLetterToParent
callback todiv
‘sonClick
handlerconst AlphabetSelect = ({ pushLetterToParent, selectedLetter }: any) => { const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ#'; return ( <div className="alphabetSelect"> { letters.split('').map((letter: string) => { return( <div key={letter} className={selectedLetter === letter ? 'letterSelectActive' : 'letterSelect'} onClick={() => pushLetterToParent(letter.toUpperCase())} > {letter} </div> ) }) } </div> ) }
CLICK HERE to find out more related problems solutions.