state ๅ ใฎ้ ๅใฎๆดๆฐ
JavaScript ใฎ้ ๅใฏใใฅใผใฟใใซ๏ผmutable, ๆธใๆใๅฏ่ฝ๏ผใชใใฎใงใใใstate ใซๆ ผ็ดใใๅ ดๅใฏใคใใฅใผใฟใใซ๏ผimmutable, ๆธใๆใไธ่ฝ๏ผใจใใฆๆฑใในใใงใใใชใใธใงใฏใใฎๆใจๅๆงใซใstate ใซไฟๅญใใใ้ ๅใๆดๆฐใใๅ ดๅใฏใๆฐใใ้ ๅใไฝๆใใฆ๏ผใพใใฏๆขๅญใฎ้ ๅใใณใใผใใฆ๏ผใใใฎๆฐใใ้ ๅใง state ใใปใใใใๅฟ ่ฆใใใใพใใ
ใใฎใใผใธใงๅญฆใถใใจ
- React ใฎ state ๅ ใซใใ้ ๅใซๅฏพใ่ฆ็ด ใฎ่ฟฝๅ ใๅ้คใๅคๆดใ่กใๆนๆณ
- ้ ๅๅ ใซใใใชใใธใงใฏใใๆดๆฐใใๆนๆณ
- Immer ใไฝฟใฃใฆ้ ๅใณใใผใฎใใใฎใณใผใใฎๅ้ทใใ็ทฉๅใใๆนๆณ
้ ๅใๆธใๆใใใซๆดๆฐใใ
JavaScript ใซใใใฆใ้
ๅใจใฏๅใชใใชใใธใงใฏใใฎไธ็จฎใงใใใชใใธใงใฏใใฎใจใใจๅๆงใซใReact ใฎ state ๅ
ใซใใ้
ๅใฏใ่ชญใฟๅใๅฐ็จใจใใฆๆฑใๅฟ
่ฆใใใใพใใใใใฏใarr[0] = 'bird'
ใฎใใใชๅฝขใง้
ๅๅ
ใฎ่ฆ็ด ใซๅไปฃๅ
ฅใ่กใฃใฆใฏใชใใใpush()
ใ pop()
ใฎใใใช้
ๅใใใฅใผใใผใทใงใณ๏ผmutation, ๆธใๆใ๏ผใใใกใฝใใใไฝฟใฃใฆใใใใชใใจใใใใจใงใใ
ไปฃใใใซใใใคใงใ้
ๅใๆดๆฐใใใใจใใซใฏใๆฐใใ้
ๅใ state ใปใใฟ้ขๆฐใซๆธกใๅฟ
่ฆใใใใพใใใใใๅฎ็พใใใใใซใstate ใใๅใๅบใใๅ
ใฎ้
ๅใใใfilter()
ใ map()
ใจใใฃใๆธใๆใใ่กใใชใใกใฝใใใๅผใณๅบใใใจใงใๆฐใใ้
ๅใไฝๆใงใใพใใใใใฆใ็ตๆใจใใฆๅพใใใๆฐใใ้
ๅใ state ใซใปใใใใใใจใใงใใพใใ
ไปฅไธใฏใไธ่ฌ็ใช้ ๅๆไฝใฎๅ็ ง่กจใงใใReact ใฎ state ๅ ใฎ้ ๅใๆฑใ้ใซใฏใๅทฆใฎๅใซใใใกใฝใใใ้ฟใใฆใๅณใฎๅใซใใใกใฝใใใไฝฟ็จใใๅฟ ่ฆใใใใพใ :
ไฝฟใใชใ๏ผ้ ๅใๆธใๆใใ๏ผ | ไฝฟใ๏ผๆฐใใ้ ๅใ่ฟใ๏ผ | |
---|---|---|
่ฟฝๅ | push , unshift | concat , [...arr] spread syntax (ไพ) |
ๅ้ค | pop , shift , splice | filter , slice (ไพ) |
่ฆ็ด ็ฝฎๆ | splice , arr[i] = ... ไปฃๅ
ฅๆ | map (ไพ) |
ใฝใผใ | reverse , sort | ๅ ใซ้ ๅใใณใใผ (ไพ) |
ใพใใใฉใกใใฎๅใฎใกใฝใใใไฝฟ็จใงใใใใใซใใฆใใใ Immer ใไฝฟใๆนๆณใใใใพใใ
้ ๅใซ่ฆ็ด ใ่ฟฝๅ
push()
ใฏ้
ๅใฎๆธใๆใใ่กใใพใใใใใฏ้ฟใใในใใงใใ
import { useState } from 'react'; let nextId = 0; export default function List() { const [name, setName] = useState(''); const [artists, setArtists] = useState([]); return ( <> <h1>Inspiring sculptors:</h1> <input value={name} onChange={e => setName(e.target.value)} /> <button onClick={() => { artists.push({ id: nextId++, name: name, }); }}>Add</button> <ul> {artists.map(artist => ( <li key={artist.id}>{artist.name}</li> ))} </ul> </> ); }
ไปฃใใใซใๆขๅญใฎ่ฆ็ด ใฎๆซๅฐพใซๆฐใใ่ฆ็ด ใๅ ใใฃใใๆฐใใ้
ๅใไฝๆใใพใใใใใซใฏ่คๆฐใฎๆนๆณใใใใพใใใใใฃใจใ็ฐกๅใชใฎใฏ ...
ใจใใ้
ๅในใใฌใใๆงๆใไฝฟ็จใใใใจใงใใ
setArtists( // Replace the state
[ // with a new array
...artists, // that contains all the old items
{ id: nextId++, name: name } // and one new item at the end
]
);
ใใใงๆญฃใใๅไฝใใพใใ
import { useState } from 'react'; let nextId = 0; export default function List() { const [name, setName] = useState(''); const [artists, setArtists] = useState([]); return ( <> <h1>Inspiring sculptors:</h1> <input value={name} onChange={e => setName(e.target.value)} /> <button onClick={() => { setArtists([ ...artists, { id: nextId++, name: name } ]); }}>Add</button> <ul> {artists.map(artist => ( <li key={artist.id}>{artist.name}</li> ))} </ul> </> ); }
้
ๅในใใฌใใๆงๆใไฝฟ็จใใใฐใๅ
ใฎ ...artists
ใฎๅ
้ ญใซ่ฆ็ด ใ่ฟฝๅ ใใใใจใใงใใพใ๏ผ
setArtists([
{ id: nextId++, name: name },
...artists // Put old items at the end
]);
ใใฎใใใซใในใใฌใใๆงๆใฏใpush()
ใง้
ๅใฎๆซๅฐพใซ่ฟฝๅ ใใใใจใจ unshift()
ใง้
ๅใฎๅ
้ ญใซ่ฟฝๅ ใใใใจใฎไธกๆนใฎๅฝนๅฒใๆใใใพใใไธ่จใฎใตใณใใใใฏในใง่ฉฆใใฆใฟใฆใใ ใใ๏ผ
้ ๅใใ่ฆ็ด ใๅ้ค
้
ๅใใ่ฆ็ด ใๅ้คใใๆใ็ฐกๅใชๆนๆณใฏใใใใใใฃใซใฟใชใณใฐใใฆๅใ้คใใใๆฐใใ้
ๅใไฝใใใจใงใใใคใพใใใใฎ่ฆ็ด ใๅซใพใชใๆฐใใ้
ๅใ็ๆใใพใใใใใซใฏ filter
ใกใฝใใใไฝฟ็จใใพใใไพใใฐ๏ผ
import { useState } from 'react'; let initialArtists = [ { id: 0, name: 'Marta Colvin Andrade' }, { id: 1, name: 'Lamidi Olonade Fakeye'}, { id: 2, name: 'Louise Nevelson'}, ]; export default function List() { const [artists, setArtists] = useState( initialArtists ); return ( <> <h1>Inspiring sculptors:</h1> <ul> {artists.map(artist => ( <li key={artist.id}> {artist.name}{' '} <button onClick={() => { setArtists( artists.filter(a => a.id !== artist.id ) ); }}> Delete </button> </li> ))} </ul> </> ); }
ไฝๅบฆใ โDeleteโ ใใฟใณใใฏใชใใฏใใฆๅไฝใ็ขบ่ชใใใใใฏใชใใฏใใณใใฉใ่ฆใฆใฟใพใใใใ
setArtists(
artists.filter(a => a.id !== artist.id)
);
ใใใงใartists.filter(a => a.id !== artist.id)
ใจใใใณใผใใฏใartist.id
ใจ็ฐใชใ ID ใๆใค artists
ใฎใฟใฎ้
ๅใไฝๆใใใใจใใๆๅณใงใใ่จใๆใใใจใๅใขใผใใฃในใใฎ โDeleteโ ใใฟใณใฏใ่ฉฒๅฝใขใผใใฃในใใ้
ๅใใใใฃใซใฟใชใณใฐใใฆๅใ้คใใ็ตๆใจใใฆๅพใใใ้
ๅใงๅใฌใณใใผใ่ฆๆฑใใพใใfilter
ใฏๅ
ใฎ้
ๅใๆธใๆใใชใใใจใซๆณจๆใใฆใใ ใใใ
้ ๅใฎๅคๆ
้
ๅใฎไธ้จใพใใฏใในใฆใฎ่ฆ็ด ใๅคๆดใใใๅ ดๅใฏใmap()
ใไฝฟ็จใใฆๆฐใใ้
ๅใไฝๆใงใใพใใmap
ใซๆธกใ้ขๆฐใฏใใใผใฟใใคใณใใใฏใน๏ผใพใใฏใใฎไธกๆน๏ผใซๅบใฅใใฆๅ่ฆ็ด ใซไฝใใใใใๆฑบๅฎใงใใพใใ
ใใฎไพใงใฏใ้
ๅใซ 2 ใคใฎๅใจ 1 ใคใฎๆญฃๆนๅฝขใฎๅบงๆจใๅซใพใใฆใใพใใใใฟใณใๆผใใจใๅใ ใใ 50 ใใฏใปใซไธใซ็งปๅใใพใใใใใฏใmap()
ใไฝฟ็จใใฆๆฐใใใใผใฟใฎ้
ๅใไฝๆใใใใจใง่กใใใพใใ
import { useState } from 'react'; let initialShapes = [ { id: 0, type: 'circle', x: 50, y: 100 }, { id: 1, type: 'square', x: 150, y: 100 }, { id: 2, type: 'circle', x: 250, y: 100 }, ]; export default function ShapeEditor() { const [shapes, setShapes] = useState( initialShapes ); function handleClick() { const nextShapes = shapes.map(shape => { if (shape.type === 'square') { // No change return shape; } else { // Return a new circle 50px below return { ...shape, y: shape.y + 50, }; } }); // Re-render with the new array setShapes(nextShapes); } return ( <> <button onClick={handleClick}> Move circles down! </button> {shapes.map(shape => ( <div key={shape.id} style={{ background: 'purple', position: 'absolute', left: shape.x, top: shape.y, borderRadius: shape.type === 'circle' ? '50%' : '', width: 20, height: 20, }} /> ))} </> ); }
้ ๅๅ ใฎ่ฆ็ด ใฎ็ฝฎๆ
้
ๅๅ
ใฎไธ้จใฎ่ฆ็ด ใ ใใ็ฝฎใๆใใใๅ ดๅใใใใใใพใใarr[0] = 'bird'
ใฎใใใชไปฃๅ
ฅใฏๅ
ใฎ้
ๅใๆธใๆใใฆใใพใใฎใงใไปฃใใใซใใใงใ map
ใไฝฟ็จใใๅฟ
่ฆใใใใพใใ
่ฆ็ด ใ็ฝฎใๆใใใซใฏใmap
ใไฝฟใฃใฆๆฐใใ้
ๅใไฝๆใใพใใmap
ใฎๅผใณๅบใๅ
ใงใฏใ็ฌฌ 2 ๅผๆฐใจใใฆ่ฆ็ด ใฎใคใณใใใฏในใๅใๅใใพใใใใใไฝฟ็จใใฆใๅ
ใฎ่ฆ็ด ๏ผ็ฌฌ 1 ๅผๆฐ๏ผใ่ฟใใใไปใฎใใฎใ่ฟใใใๆฑบๅฎใใพใใ
import { useState } from 'react'; let initialCounters = [ 0, 0, 0 ]; export default function CounterList() { const [counters, setCounters] = useState( initialCounters ); function handleIncrementClick(index) { const nextCounters = counters.map((c, i) => { if (i === index) { // Increment the clicked counter return c + 1; } else { // The rest haven't changed return c; } }); setCounters(nextCounters); } return ( <ul> {counters.map((counter, i) => ( <li key={i}> {counter} <button onClick={() => { handleIncrementClick(i); }}>+1</button> </li> ))} </ul> ); }
้ ๅใธใฎๆฟๅ ฅ
ๅ ดๅใซใใฃใฆใฏใๅ
้ ญใงใ็ต็ซฏใงใใชใ็นๅฎใฎไฝ็ฝฎใซ่ฆ็ด ใๆฟๅ
ฅใใใใใจใใใใพใใใใใ่กใใซใฏใ...
้
ๅในใใฌใใๆงๆใจ slice()
ใกใฝใใใ็ตใฟๅใใใฆไฝฟ็จใงใใพใใslice()
ใกใฝใใใไฝฟ็จใใใจใ้
ๅใฎใในใฉใคในใใๅใๅใใใจใใงใใพใใ่ฆ็ด ใๆฟๅ
ฅใใใซใฏใๆฟๅ
ฅใใคใณใใฎๅใฎในใฉใคในใๆฐใใ่ฆ็ด ใๅ
ใฎ้
ๅใฎๆฎใใฎ้จๅใใใชใ้
ๅใไฝๆใใพใใ
ใใฎไพใงใฏใโInsertโ ใใฟใณใฏๅธธใซใคใณใใใฏใน 1
ใฎๅ ดๆใซๆฟๅ
ฅใ่กใใพใใ
import { useState } from 'react'; let nextId = 3; const initialArtists = [ { id: 0, name: 'Marta Colvin Andrade' }, { id: 1, name: 'Lamidi Olonade Fakeye'}, { id: 2, name: 'Louise Nevelson'}, ]; export default function List() { const [name, setName] = useState(''); const [artists, setArtists] = useState( initialArtists ); function handleClick() { const insertAt = 1; // Could be any index const nextArtists = [ // Items before the insertion point: ...artists.slice(0, insertAt), // New item: { id: nextId++, name: name }, // Items after the insertion point: ...artists.slice(insertAt) ]; setArtists(nextArtists); setName(''); } return ( <> <h1>Inspiring sculptors:</h1> <input value={name} onChange={e => setName(e.target.value)} /> <button onClick={handleClick}> Insert </button> <ul> {artists.map(artist => ( <li key={artist.id}>{artist.name}</li> ))} </ul> </> ); }
้ ๅใธใฎใใฎไปใฎๅคๆด
ในใใฌใใๆงๆใใmap()
ใfilter()
ใชใฉใฎๆธใๆใใ่กใใชใใกใฝใใใไฝฟใฃใฆใใใ ใใงใฏไธๅฏ่ฝใชใใจใใใใพใใไพใใฐใ้
ๅใ้้ ใซใใใใใฝใผใใใใใใใใจใใงใใพใใใJavaScript ใฎ reverse()
ใ sort()
ใกใฝใใใฏๅ
ใฎ้
ๅใๆธใๆใใใใใ็ดๆฅไฝฟใใใจใฏใงใใพใใใ
ใใ ใใๆๅใซ้ ๅใใณใใผใใฆใใใใใฎใณใใผใซๅคๆดใๅ ใใใใจใฏใงใใพใใ
ไพใใฐใๆฌกใฎใใใซใชใใพใใ
import { useState } from 'react'; const initialList = [ { id: 0, title: 'Big Bellies' }, { id: 1, title: 'Lunar Landscape' }, { id: 2, title: 'Terracotta Army' }, ]; export default function List() { const [list, setList] = useState(initialList); function handleClick() { const nextList = [...list]; nextList.reverse(); setList(nextList); } return ( <> <button onClick={handleClick}> Reverse </button> <ul> {list.map(artwork => ( <li key={artwork.id}>{artwork.title}</li> ))} </ul> </> ); }
ใใใงใฏใ[...list]
ในใใฌใใๆงๆใไฝฟใฃใฆใๆๅใซๅ
ใฎ้
ๅใฎใณใใผใไฝๆใใพใใใณใใผใใงใใใใnextList.reverse()
ใ nextList.sort()
ใชใฉใฎใใฅใผใใผใทใงใณๅใฎใกใฝใใใไฝฟใฃใใใnextList[0] = "something"
ใงๅใ
ใฎ่ฆ็ด ใซไปฃๅ
ฅใใใใใใใจใใงใใพใใ
ใใ ใใ้ ๅใใณใใผใใฆใใใใฎไธญใฎๆขๅญใฎใขใคใใ ใ็ดๆฅๅคๆดใใใใจใฏใงใใพใใใใใใฏใใณใใผใๆต ใ (shallow) ่กใใใใใใงใใๆฐใใ้ ๅใซใฏใๅ ใฎ้ ๅใจๅใ่ฆ็ด ใๅซใพใใพใใใใฎใใใใณใใผใใใ้ ๅๅ ใฎใชใใธใงใฏใใๆธใๆใใใจใๆขๅญใฎ state ใๆธใๆใใใใพใใไพใใฐใใใฎใใใชใณใผใใฏๅ้กใใใใพใใ
const nextList = [...list];
nextList[0].seen = true; // Problem: mutates list[0]
setList(nextList);
nextList
ใจ list
ใฏ็ฐใชใ 2 ใคใฎ้
ๅใงใใใnextList[0]
ใจ list[0]
ใฏๅใใชใใธใงใฏใใๆใใฆใใพใใใใฎใใใnextList[0].seen
ใๅคๆดใใใใจใงใlist[0].seen
ใๅคๆดใใใพใใใใใฏ state ใฎใใฅใผใใผใทใงใณใงใใใ้ฟใใในใใงใ๏ผ ใใฎๅ้กใฏใใในใใใใ JavaScript ใชใใธใงใฏใใฎๆดๆฐใจๅๆงใฎๆนๆณใง่งฃๆฑบใงใใพใใๅคๆดใๅ ใใใๅใ
ใฎ่ฆ็ด ใใๆธใๆใใไปฃใใใซใณใใผใใใจใใใใจใงใใไปฅไธใง่ชฌๆใใพใใ
้ ๅๅ ใฎใชใใธใงใฏใใๆดๆฐใใ
ใชใใธใงใฏใใฏใๅฎ้ใซใฏ้
ๅใฎใไธญใซใใใใใใงใฏใใใพใใใใณใผใไธญใงใฏใไธญใซใใใใใใซ่ฆใใพใใใ้
ๅๅ
ใฎๅใชใใธใงใฏใใฏใใใใ็ฌ็ซใใๅคใงใใใ้
ๅใฏใใใใใๅ็
งใใใฆใใพใใใใใใlist[0]
ใฎใใใชใในใใใใใฃใผใซใใๅคๆดใใ้ใซๆณจๆใๅฟ
่ฆใช็็ฑใงใใไปใฎไบบใฎใขใผใใฏใผใฏใชในใใใ้
ๅใฎๅใ่ฆ็ด ใๆใใฆใใใใใใใพใใ๏ผ
ใในใใใใ state ใๆดๆฐใใ้ใซใฏใๆดๆฐใใใ็ฎๆใใใใใใฌใใซใพใงใฎใณใใผใไฝๆใใๅฟ ่ฆใใใใพใใใฉใฎใใใซ่กใใฎใ่ฆใฆใฟใพใใใใ
ใใฎไพใงใฏใ2 ใคใฎๅฅใ ใฎใขใผใใฏใผใฏใชในใใๅใๅๆ state ใๆใฃใฆใใพใใใใใใฏ็ฌ็ซใใฆใใใใจใซใชใฃใฆใใใฎใงใใใใใฅใผใใผใทใงใณใ่ตทใใฆใใใใ state ใ่ชคใฃใฆๅ ฑๆใใใไธๆนใฎใชในใใงใใใฏในใใใงใใฏใใใจใใไธๆนใฎใชในใใซๅฝฑ้ฟใใฆใใพใฃใฆใใพใใ
import { useState } from 'react'; let nextId = 3; const initialList = [ { id: 0, title: 'Big Bellies', seen: false }, { id: 1, title: 'Lunar Landscape', seen: false }, { id: 2, title: 'Terracotta Army', seen: true }, ]; export default function BucketList() { const [myList, setMyList] = useState(initialList); const [yourList, setYourList] = useState( initialList ); function handleToggleMyList(artworkId, nextSeen) { const myNextList = [...myList]; const artwork = myNextList.find( a => a.id === artworkId ); artwork.seen = nextSeen; setMyList(myNextList); } function handleToggleYourList(artworkId, nextSeen) { const yourNextList = [...yourList]; const artwork = yourNextList.find( a => a.id === artworkId ); artwork.seen = nextSeen; setYourList(yourNextList); } return ( <> <h1>Art Bucket List</h1> <h2>My list of art to see:</h2> <ItemList artworks={myList} onToggle={handleToggleMyList} /> <h2>Your list of art to see:</h2> <ItemList artworks={yourList} onToggle={handleToggleYourList} /> </> ); } function ItemList({ artworks, onToggle }) { return ( <ul> {artworks.map(artwork => ( <li key={artwork.id}> <label> <input type="checkbox" checked={artwork.seen} onChange={e => { onToggle( artwork.id, e.target.checked ); }} /> {artwork.title} </label> </li> ))} </ul> ); }
ๅ้กใฏใใฎใณใผใใงใใ
const myNextList = [...myList];
const artwork = myNextList.find(a => a.id === artworkId);
artwork.seen = nextSeen; // Problem: mutates an existing item
setMyList(myNextList);
myNextList
ใจใใ้
ๅ่ชไฝใฏๆฐใใใใฎใงใใใๅใ
ใฎ่ฆ็ด ใใฎใใฎใฏๅ
ใฎ myList
้
ๅใจๅใใงใใใใฎใใใartwork.seen
ใๅคๆดใใใใจใงใๅ
ใฎใขใผใใฏใผใฏใๅคๆดใใใพใใใใฎใขใผใใฏใผใฏใฏ yourList
ๅ
ใซใๅญๅจใใใใใใใฐใ็บ็ใใพใใใใฎใใใชใใฐใฏ็่งฃใใใฎใ้ฃใใใใจใใใใพใใใๅนธใใซใ state ใฎใใฅใผใใผใทใงใณใใ้ฟใใฆใใใฐใ่ตทใใใใซๆธใฟใพใใ
ใใฅใผใใผใทใงใณใใใใซใๅคใ่ฆ็ด ใๆดๆฐใใใ่ฆ็ด ใจ็ฝฎใๆใใใซใฏใmap
ใไฝฟ็จใงใใพใใ
setMyList(myList.map(artwork => {
if (artwork.id === artworkId) {
// Create a *new* object with changes
return { ...artwork, seen: nextSeen };
} else {
// No changes
return artwork;
}
}));
ใใใงใ...
ใฏใชใใธใงใฏใใฎในใใฌใใๆงๆใงใใใใชใใธใงใฏใใฎใณใใผใไฝๆใใใใใซไฝฟใใใพใใ
ใใฎใขใใญใผใใงใฏใๆขๅญใฎ state ใฎ่ฆ็ด ใๆธใๆใใชใใใใใใฐใฏไฟฎๆญฃใใใฆใใพใใ
import { useState } from 'react'; let nextId = 3; const initialList = [ { id: 0, title: 'Big Bellies', seen: false }, { id: 1, title: 'Lunar Landscape', seen: false }, { id: 2, title: 'Terracotta Army', seen: true }, ]; export default function BucketList() { const [myList, setMyList] = useState(initialList); const [yourList, setYourList] = useState( initialList ); function handleToggleMyList(artworkId, nextSeen) { setMyList(myList.map(artwork => { if (artwork.id === artworkId) { // Create a *new* object with changes return { ...artwork, seen: nextSeen }; } else { // No changes return artwork; } })); } function handleToggleYourList(artworkId, nextSeen) { setYourList(yourList.map(artwork => { if (artwork.id === artworkId) { // Create a *new* object with changes return { ...artwork, seen: nextSeen }; } else { // No changes return artwork; } })); } return ( <> <h1>Art Bucket List</h1> <h2>My list of art to see:</h2> <ItemList artworks={myList} onToggle={handleToggleMyList} /> <h2>Your list of art to see:</h2> <ItemList artworks={yourList} onToggle={handleToggleYourList} /> </> ); } function ItemList({ artworks, onToggle }) { return ( <ul> {artworks.map(artwork => ( <li key={artwork.id}> <label> <input type="checkbox" checked={artwork.seen} onChange={e => { onToggle( artwork.id, e.target.checked ); }} /> {artwork.title} </label> </li> ))} </ul> ); }
ไธ่ฌ็ใซใฏใไฝๆใใใฐใใใฎใชใใธใงใฏใไปฅๅคใฏๆธใๆใใฆใฏใใใพใใใๆฐใใใขใผใใฏใผใฏใๆฟๅ ฅใใๅ ดๅใซใใฎๆฐใใ่ฆ็ด ใๆธใๆใใฆใๆงใใพใใใใstate ใซใใงใซๅญๅจใใใใฎใๆฑใๅ ดๅใฏใใณใใผใไฝๆใใๅฟ ่ฆใใใใพใใ
Immer ใไฝฟใฃใฆ็ฐกๆฝใชๆดๆฐใญใธใใฏใๆธใ
้ ๅใใในใใใใฆใใๅ ดๅใๆธใๆใใชใใงๆดๆฐใ่กใใณใผใใฏๅ้ทใซใชใใใกใงใใใชใใธใงใฏใใฎใจใใจๅๆงใงใใใ
- ไธ่ฌ็ใซใฏใstate ใ 2ใ3 ใฌใใซไปฅไธๆทฑใๆดๆฐใใๅฟ ่ฆใฏใชใใฏใใงใใstate ใชใใธใงใฏใใ้ๅธธใซๆทฑใๅ ดๅใฏใๅฅใฎๆง้ ใซๅๆงๆใใฆใใฉใใใซใใใใจใใงใใพใใ
- state ๆง้ ใๅคๆดใใใใชใๅ ดๅใฏใImmer ใไฝฟ็จใใฆใๆธใใใใใใฅใผใใผใๅใฎๆงๆใง่จ่ฟฐใใคใคใณใใผใ็ๆใใใใจใใงใใพใใ
ไปฅไธใฏใImmer ใไฝฟ็จใใฆๆธใ็ดใใใขใผใใฏใผใฏใชในใใฎไพใงใใ
{ "dependencies": { "immer": "1.7.3", "react": "latest", "react-dom": "latest", "react-scripts": "latest", "use-immer": "0.5.1" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" }, "devDependencies": {} }
Immer ใไฝฟ็จใใใใจใง artwork.seen = nextSeen
ใฎใใใชๆธใๆใใใงใใใใใซใชใใพใใใ
updateMyTodos(draft => {
const artwork = draft.find(a => a.id === artworkId);
artwork.seen = nextSeen;
});
ใใใๅฏ่ฝใชใฎใฏใImmer ใใๆธกใใใ็นๅฅใช draft
ใชใใธใงใฏใใๆธใๆใใฆใใใฎใงใใใๅ
ใฎ state ใฏๆธใๆใใฆใใชใใใใงใใๅๆงใซใdraft
ใฎๅ
ๅฎนใซๅฏพใใฆ push()
ใ pop()
ใชใฉใฎใใฅใผใใผใทใงใณๅใฎใกใฝใใใไฝฟ็จใใใใจใใงใใพใใ
่ฃๅดใงใฏใImmer ใฏๅธธใซใdraft
ใซๅฏพใใฆ่กใฃใๆธใๆใๆไฝใซๅบใฅใใฆใๆฌกใฎ state ใใผใญใใๆง็ฏใใพใใใใใซใใใstate ใๆธใๆใใฆใใพใๅฟ้
ใใใใใคใใณใใใณใใฉใ้ๅธธใซ็ฐกๆฝใซไฟใคใใจใใงใใพใใ
ใพใจใ
- ้ ๅใ state ใซๅ ฅใใใใจใใงใใใใใใใ็ดๆฅๅคๆดใใฆใฏใใใชใใ
- ้ ๅใๅคๆดใใใไปฃใใใซๆฐใใ็ใไฝๆใใstate ใๆดๆฐใใใ
[...arr, newItem]
ใจใใ้ ๅในใใฌใใๆงๆใไฝฟ็จใใฆใๆฐใใ้ ็ฎใๆใค้ ๅใไฝๆใงใใใfilter()
ใmap()
ใไฝฟ็จใใฆใใใฃใซใฟใชใณใฐใใใใใใใใฏๅคๆใใใใขใคใใ ใๅซใๆฐใใ้ ๅใไฝๆใงใใใ- Immer ใไฝฟใฃใฆใณใผใใ็ฐกๆฝใซไฟใคใใจใใงใใใ
ใใฃใฌใณใธ 1/4: ใทใงใใใณใฐใซใผใใฎๅๅใๆดๆฐ
handleIncreaseClick
ใฎใญใธใใฏใๅใใฆใโ+โ ใๆผใใใจใงๅฏพๅฟใใๆฐๅญใๅขใใใใใซใใฆใใ ใใใ
import { useState } from 'react'; const initialProducts = [{ id: 0, name: 'Baklava', count: 1, }, { id: 1, name: 'Cheese', count: 5, }, { id: 2, name: 'Spaghetti', count: 2, }]; export default function ShoppingCart() { const [ products, setProducts ] = useState(initialProducts) function handleIncreaseClick(productId) { } return ( <ul> {products.map(product => ( <li key={product.id}> {product.name} {' '} (<b>{product.count}</b>) <button onClick={() => { handleIncreaseClick(product.id); }}> + </button> </li> ))} </ul> ); }