add immerJs example
This commit is contained in:
11
react-advanced-tag1/package-lock.json
generated
11
react-advanced-tag1/package-lock.json
generated
@@ -8,6 +8,7 @@
|
|||||||
"name": "react-advanced-tag1",
|
"name": "react-advanced-tag1",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"immer": "^10.1.1",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"react-router-dom": "^7.5.0",
|
"react-router-dom": "^7.5.0",
|
||||||
@@ -3465,6 +3466,16 @@
|
|||||||
"node": ">= 4"
|
"node": ">= 4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/immer": {
|
||||||
|
"version": "10.1.1",
|
||||||
|
"resolved": "https://bin.sbb.ch/artifactory/api/npm/npm/immer/-/immer-10.1.1.tgz",
|
||||||
|
"integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/immer"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/import-fresh": {
|
"node_modules/import-fresh": {
|
||||||
"version": "3.3.1",
|
"version": "3.3.1",
|
||||||
"resolved": "https://bin.sbb.ch/artifactory/api/npm/npm/import-fresh/-/import-fresh-3.3.1.tgz",
|
"resolved": "https://bin.sbb.ch/artifactory/api/npm/npm/import-fresh/-/import-fresh-3.3.1.tgz",
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
"prettier": "prettier ./src --write"
|
"prettier": "prettier ./src --write"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"immer": "^10.1.1",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"react-router-dom": "^7.5.0",
|
"react-router-dom": "^7.5.0",
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import ComponentWrapperPage from './pages/ComponentWrapperPage'
|
|||||||
import ZustandCounterPage from './pages/ZustandCounterPage'
|
import ZustandCounterPage from './pages/ZustandCounterPage'
|
||||||
import ModalPage from './pages/ModalPage'
|
import ModalPage from './pages/ModalPage'
|
||||||
import { HocPage } from './pages/HocPage'
|
import { HocPage } from './pages/HocPage'
|
||||||
|
import ImmerPage from './pages/ImmerPage'
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
@@ -25,6 +26,7 @@ function App() {
|
|||||||
<Route path="/modalpage" element={<ModalPage />} />
|
<Route path="/modalpage" element={<ModalPage />} />
|
||||||
<Route path="/zustandcounterpage" element={<ZustandCounterPage />} />
|
<Route path="/zustandcounterpage" element={<ZustandCounterPage />} />
|
||||||
<Route path="/hoc" element={<HocPage />} />
|
<Route path="/hoc" element={<HocPage />} />
|
||||||
|
<Route path="/immer" element={<ImmerPage />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</MainLayout>
|
</MainLayout>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ export default function Navigation() {
|
|||||||
<li>
|
<li>
|
||||||
<a href="/hoc">HOC</a>
|
<a href="/hoc">HOC</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/immer">Immer</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import { produce } from 'immer'
|
||||||
|
import { useState } from 'react'
|
||||||
|
|
||||||
|
export default function ImmerExercise() {
|
||||||
|
const [user, setUser] = useState({
|
||||||
|
name: 'Alice',
|
||||||
|
|
||||||
|
address: {
|
||||||
|
city: 'Wonderland',
|
||||||
|
|
||||||
|
zip: '12345',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const updateUser = () => {
|
||||||
|
// this is "normal" way to update state in objects
|
||||||
|
setUser((prevUser) => ({
|
||||||
|
...prevUser,
|
||||||
|
address: {
|
||||||
|
...prevUser.address,
|
||||||
|
city: 'New Wonderland',
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateUserWithImmer = () => {
|
||||||
|
// immer way
|
||||||
|
setUser((prevUser) =>
|
||||||
|
produce(prevUser, (draft) => {
|
||||||
|
draft.address.city = 'New Wonderland'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<p>
|
||||||
|
{user.address.city}: {user.name}
|
||||||
|
</p>
|
||||||
|
<button onClick={updateUser}>Update User</button>
|
||||||
|
<button onClick={updateUserWithImmer}>Update User with immerJs</button>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -44,9 +44,11 @@ export default function RefExercise(): React.ReactElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleChangeSubmit = () => {
|
const handleChangeSubmit = () => {
|
||||||
|
// This is a bad way to handle form submission
|
||||||
const strasse = document.querySelector(
|
const strasse = document.querySelector(
|
||||||
'input[name="strasse"]'
|
'input[name="strasse"]'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
|
// This is a bad way to handle form submission
|
||||||
const city = document.querySelector(
|
const city = document.querySelector(
|
||||||
'input[name="city"]'
|
'input[name="city"]'
|
||||||
) as HTMLInputElement
|
) as HTMLInputElement
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ import { createRoot } from 'react-dom/client'
|
|||||||
import './index.css'
|
import './index.css'
|
||||||
import App from './App.tsx'
|
import App from './App.tsx'
|
||||||
import { BrowserRouter } from 'react-router-dom'
|
import { BrowserRouter } from 'react-router-dom'
|
||||||
|
import { enableMapSet } from 'immer'
|
||||||
|
|
||||||
|
enableMapSet()
|
||||||
|
|
||||||
createRoot(document.getElementById('root')!).render(
|
createRoot(document.getElementById('root')!).render(
|
||||||
<StrictMode>
|
<StrictMode>
|
||||||
|
|||||||
10
react-advanced-tag1/src/pages/ImmerPage.tsx
Normal file
10
react-advanced-tag1/src/pages/ImmerPage.tsx
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import ComponentWrapper from '../common/components/ComponentWrapper/ComponentWrapper'
|
||||||
|
import ImmerExercise from '../common/components/exercises/ImmerExercise'
|
||||||
|
|
||||||
|
export default function ImmerPage() {
|
||||||
|
return (
|
||||||
|
<ComponentWrapper title="Immer">
|
||||||
|
<ImmerExercise />
|
||||||
|
</ComponentWrapper>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user