Hooks NEW code examples - rs-hash/Senior GitHub Wiki
useState
1. Counter
import{useState}from'react';exportdefaultfunctionCounter(){const[count,setCount]=useState(0);functionhandleClick(){setCount(count+1);}return(<buttononClick={handleClick}>
You pressed me {count} times
</button>);}
import{useState}from'react';exportdefaultfunctionMyCheckbox(){const[liked,setLiked]=useState(true);functionhandleChange(e){setLiked(e.target.checked);}return(<><label><inputtype="checkbox"checked={liked}onChange={handleChange}/>
I liked this
</label><p>You {liked ? 'liked' : 'did not like'} this.</p></>);}
4. Form
import{useState}from'react';exportdefaultfunctionForm(){const[name,setName]=useState('Taylor');const[age,setAge]=useState(42);return(<><inputvalue={name}onChange={e=>setName(e.target.value)}/><buttononClick={()=>setAge(age+1)}>
Increment age
</button><p>Hello, {name}. You are {age}.</p></>);}
6. Pass the updater function - +3 works vs passing the next state
import{useState}from'react';exportdefaultfunctionCounter(){const[age,setAge]=useState(42);functionincrement(){setAge(a=>a+1);// works}return(<><h1>Your age: {age}</h1><buttononClick={()=>{increment();increment();increment();}}>+3</button><buttononClick={()=>{increment();}}>+1</button></>);}/* passing the next state wont work */import{useState}from'react';exportdefaultfunctionCounter(){const[age,setAge]=useState(42);functionincrement(){setAge(age+1);// increments by 1}return(<><h1>Your age: {age}</h1><buttononClick={()=>{increment();increment();increment();}}>+3</button><buttononClick={()=>{increment();}}>+1</button></>);}
import{useState}from'react';exportdefaultfunctionCountLabel({ count }){const[prevCount,setPrevCount]=useState(count);const[trend,setTrend]=useState(null);if(prevCount!==count){setPrevCount(count);setTrend(count>prevCount ? 'increasing' : 'decreasing');}return(<><h1>{count}</h1>{trend&&<p>The count is {trend}</p>}</>);}
useMemo
importReact,{useState,useMemo}from'react';constItemList=({ items, filterText })=>{// useMemo to avoid recalculating filteredItems on every renderconstfilteredItems=useMemo(()=>{console.log('Filtering items');returnitems.filter(item=>item.toLowerCase().includes(filterText.toLowerCase()));},[items,filterText]);return(<ul>{filteredItems.map((item,index)=>(<likey={index}>{item}</li>))}</ul>);};constApp=()=>{const[filterText,setFilterText]=useState('');constitems=['Apple','Banana','Cherry','Date','Elderberry'];return(<div><inputtype="text"placeholder="Filter items"value={filterText}onChange={e=>setFilterText(e.target.value)}/><ItemListitems={items}filterText={filterText}/></div>);};exportdefaultApp;
Memo
constApp=()=>{const[count,setCount]=useState(0);const[todos,setTodos]=useState(["todo 1","todo 2"]);constincrement=()=>{setCount(c=>c+1);};return(<><Todostodos={todos}/><hr/><div>
Count: {count}<buttononClick={increment}>+</button></div></>);};import{memo}from"react";constTodos=({ todos })=>{console.log("child render");return(<><h2>My Todos</h2>{todos.map((todo,index)=>{return<pkey={index}>{todo}</p>;})}</>);};exportdefaultmemo(Todos);
import{createContext,useContext,useState}from'react';constThemeContext=createContext(null);exportdefaultfunctionMyApp(){const[theme,setTheme]=useState('light');return(<ThemeContext.Providervalue={theme}><Form/><label><inputtype="checkbox"checked={theme==='dark'}onChange={(e)=>{setTheme(e.target.checked ? 'dark' : 'light')}}/>
Use dark mode
</label></ThemeContext.Provider>)}functionForm({ children }){return(<Paneltitle="Welcome"><Button>Sign up</Button><Button>Log in</Button></Panel>);}functionPanel({ title, children }){consttheme=useContext(ThemeContext);constclassName='panel-'+theme;return(<sectionclassName={className}><h1>{title}</h1>{children}</section>)}functionButton({ children }){consttheme=useContext(ThemeContext);constclassName='button-'+theme;return(<buttonclassName={className}>{children}</button>);}
import{useState,useEffect}from"react";constuseFetch=(url)=>{const[data,setData]=useState([]);// Initialize with an empty arrayuseEffect(()=>{constfetchData=async()=>{try{constresponse=awaitfetch(url);if(!response.ok){thrownewError('Network response was not ok');}constresult=awaitresponse.json();setData(result);}catch(error){console.error("Fetch error:",error);}};fetchData();},[url]);returndata;// Return data directly};importReactfrom'react';importuseFetchfrom'./useFetch';// Ensure the correct path to useFetchconstTodoList=()=>{constdata=useFetch(`https://jsonplaceholder.typicode.com/todos`);return(<><ul>{data.length>0 ? (data.map((item)=>(<likey={item.id}>{item.title}</li>// Use unique key))) : (<li>Loading...</li>// Optional: Display a loading state)}</ul></>);};exportdefaultTodoList;