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')}