Compare commits

..

3 Commits

Author SHA1 Message Date
laktionov-as 8cc72afd7b final 2026-05-28 19:16:14 +03:00
laktionov-as a520406547 useCallback with React.memo 2026-05-26 21:28:43 +03:00
laktionov-as 38f7195ed4 useCallback 2026-05-26 21:17:42 +03:00
4 changed files with 39 additions and 63 deletions
-11
View File
@@ -8,7 +8,6 @@
"name": "store-client", "name": "store-client",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"immer": "^11.1.8",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0" "react-dom": "^19.1.0"
}, },
@@ -2055,16 +2054,6 @@
"node": ">= 4" "node": ">= 4"
} }
}, },
"node_modules/immer": {
"version": "11.1.8",
"resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz",
"integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==",
"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://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
-1
View File
@@ -10,7 +10,6 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"immer": "^11.1.8",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0" "react-dom": "^19.1.0"
}, },
+38 -42
View File
@@ -1,49 +1,45 @@
import React, { useState, useEffect } from 'react' import React, { useMemo, useCallback, useState } from 'react'
import { produce } from 'immer'
function App() { const TodoItem = React.memo(({ item, onToggle, onDelete }) => {
const [tasks,setTasks] = useState([]) console.log(`rendred ${item.id}`);
const [input,setInput] = useState('') return <li>
{item.name}
const addTask = () => { <button onClick={() => onToggle(item.id)}>Done</button>
if(!input.trim()) return <button onClick={() => onDelete(item.id)}>remove</button>
</li>
setTasks(currentTasks => produce(currentTasks, draft => {
draft.push({
id: Date.now(),
text: input.trim(),
done: false
}) })
}))
setInput('') function ItemList({ items }) {
}
const toggleTask = id => { const handleToggle = useCallback(id => {
setTasks(currentTask => produce(currentTask, draft => { items.done = true;
const task = draft.find(t => t.id === id) console.log(`Item ${id} done`)
if(task) { console.log(id)
task.done = !task.done },[]);
}
})) const handleDelete = useCallback(id => {
} items.pop(id);
const removeTask = id => { },[]);
setTasks(currentTask => produce(currentTask, draft => {
const index = draft.findIndex(t => t.id === id)
if (index !== -1)
draft.splice(index,1)
}))
}
return ( return (
<> <>
<h1>Практика по созданию списка задач</h1> <h3>List items</h3>
<input value={input} onChange={e=>setInput(e.target.value)} /> {items.map(item => (
<button onClick={addTask}>Добавить</button> <TodoItem key={item.id} item={item}
<ul>{tasks.map(({id,text,done}) => ( onToggle={handleToggle} onDelete={handleDelete} />
<li key={id} style={{ textDecoration: done ? 'line-through' : 'none'}}> ))}
<input type="checkbox" checked={done} onChange={()=> toggleTask(id)} /> </>
{text} )
<button onClick={() => removeTask(id)}>Удалить</button> }
</li>
))}</ul> function App() {
return (
<>
{/* Добавьте тестовый контент для проверки */}
<h1>Hello, React!</h1>
<ItemList items={[
{id:1,name:'Первый',done:false},
{id:2,name:'Второй',done:false}
]} />
</> </>
) )
} }
-8
View File
@@ -1,8 +0,0 @@
export function MyComponent() {
return (
<>
<h1>Hello</h1>
</>
)
}
export default MyComponent