Optimización de Búsquedas con Throttle y Debounce en Next.js
Clase 2 de 10 • Curso de Next.js: Optimización y Manejo de Grandes Datasets
Contenido del curso
Clase 2 de 10 • Curso de Next.js: Optimización y Manejo de Grandes Datasets
Contenido del curso
Nathaly Stefani Riaño Bejarano
Jose Rafael Oliva Montes
Elioenai Garcia
Walter Omar Barrios Vazquez
Mario Josué Tavarez Mendoza
Reynaldo Francisco Moreno Briceño
Jhunior Eduardo Guevara Lázaro
Jhoan Stiven Zamora Caicedo
Reynaldo Francisco Moreno Briceño
Samuel Miranda Martínez
La herramienta que menciona el profesor en el minuto 11 se puede encontrar en https://tomekdev.com/posts/throttle-vs-debounce-on-real-examples
Gracias
Archivos base de la clase.
pages/search.tsx
import { useState, ChangeEventHandler, useEffect } from 'react' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { useTranslation } from 'next-i18next' import { GetStaticProps } from 'next' import { OutlinedInput, InputLabel, InputAdornment, FormControl, } from '@ui/FormField' import { SearchIcon } from '@ui/icon/Search' import { Typography } from '@ui/Typography' import { Layout } from '@components/Layout' import { PlantCollection } from '@components/PlantCollection' import { searchPlants, QueryStatus } from '@api' export const getStaticProps: GetStaticProps = async ({ locale }) => ({ props: await serverSideTranslations(locale!), }) export default function Search() { const { t } = useTranslation(['page-search']) const [term, setTerm] = useState('') const [status, setStatus] = useState<QueryStatus>('idle') const [results, setResults] = useState<Plant[]>([]) const updateTerm: ChangeEventHandler<HTMLInputElement> = (event) => setTerm(event.currentTarget.value) const emptyResults = status === 'success' && results.length === 0 useEffect(() => { if (term.trim().length < 3) { setStatus('idle') setResults([]) return } setStatus('loading') // Pagination not supported... yet searchPlants({ term, limit: 10, }).then((data) => { setResults(data) setStatus('success') }) }, [term]) return ( <Layout> <main className="pt-16 text-center"> <div className="max-w-5xl mx-auto mb-6"> <FormControl fullWidth className="" variant="outlined"> <InputLabel htmlFor="search-term-field">{t('term')}</InputLabel> <OutlinedInput id="search-term-field" value={term} onChange={updateTerm} startAdornment={ <InputAdornment position="start"> <SearchIcon /> </InputAdornment> } labelWidth={100} /> </FormControl> </div> <div> {emptyResults ? ( <Typography variant="body1">{t('notFound', { term })}</Typography> ) : null} </div> <div> {!emptyResults ? ( <PlantCollection plants={results} variant="square" /> ) : null} </div> </main> </Layout> ) }
components/Header/Header.tsx
import { PropsWithChildren } from 'react' import Link, { LinkProps } from 'next/link' import { useTranslation } from 'next-i18next' import { NavBar } from '@ui/NavBar' import { Button } from '@ui/Button' import { PreviewModeBanner } from './PreviewModeBanner' import { TopArea } from './TopArea' export function Header() { const { t } = useTranslation(['common']) return ( <> <PreviewModeBanner /> <div className='px-8 py-3'> <TopArea /> </div> <div className="mx-auto" style={{ maxWidth: '98%' }}> <NavBar title="🌿 Plantpedia"> <div> <NavLink href="/top-stories">{t('topStories')}</NavLink> </div> <NavLink href="/search">{t('search')}</NavLink> </NavBar> </div> </> ) } function NavLink({ children, ...linkProps }: PropsWithChildren<LinkProps>) { return ( <Link {...linkProps} passHref> <Button color="inherit" variant="text" component="a"> {children} </Button> </Link> ) }
¿Por qué optimizar?
Invocar una función menos veces.
Proteger y optimizar recursos.
No me gusta la idea de seguir la saga de next, en lo particular me gustaría más que para futuros cursos no se tuviera ligado a un proyecto de un curso anterior.
Lo hacen de esta manera para que el estudiante no se pierda y ande saltando entre cursos, ademas te estan dando un proyecto funcional el cual puedes adoptar con otro contenido y facilmente puedes incluir en tu portafolio.
Esto es por escalones, no puedes ir al escalon 3 sin antes pasar por el 1 y el 2.. Porque necesitas conocimiento previo.
Los archivos y el comando mostrados en los recursos no corresponden con lo que el profesor muestra...
ya para este nivel hemos pasado por muchos cursos, tanto de react como de html css y maquetacion... ya a este nivel deberias ser capaz de buscar tu mismo, no cuesta nada ir al repositorio, buscar la etiqueta y si te falta algo lo copias....
el comando que el utiliza es yarn porque tiene instalado ese gestor de paquetes, alomejor tu tienes npm..
no es hate, pero ya a este nivel no esperemos que nos den todo en bandeja de plata. saludos
Se puede cambiar
labelWidth={100}
Por
label={t('term')}