import React from 'react';
const initialData = JSON.parse(localStorage.getItem('components')) || [];
export function App() {
const [componentsData, setComponentsData] = React.useState(initialData);
React.useEffect(() => {
localStorage.setItem('components', JSON.stringify(componentsData));
}, [componentsData]);
function addComponent() {
setComponentsData(prev => [
...prev,
{ id: Math.random().toString(36).slice(2), content: Math.floor(Math.random() * 100) }
]);
}
const components = componentsData.map(item => (
<div key={item.id}>{item.content}</div>
));
return (
<>
<button onClick={addComponent}>click</button>
<div>{components}</div>
</>
);
}
<List>
<List.Item>
<List.Checkbox ...> Some text
</List.Item>
<List.Item>
Some text <List.Checkbox ...>
</List.Item>
<List.Item>
<List.Dropdown ...>
</List.Item>
</List>
import { List } from "@chakra-ui/react"
import { LuCheckCircle, LuCircleDashed } from "react-icons/lu"
const Demo = () => {
return (
<List.Root gap="2" variant="plain" align="center">
<List.Item>
<List.Indicator asChild color="green.500">
<LuCheckCircle />
</List.Indicator>
Lorem ipsum dolor sit amet, consectetur adipisicing elit
</List.Item>
<List.Item>
<List.Indicator asChild color="green.500">
<LuCheckCircle />
</List.Indicator>
Assumenda, quia temporibus eveniet a libero incidunt suscipit
</List.Item>
<List.Item>
<List.Indicator asChild color="green.500">
<LuCircleDashed />
</List.Indicator>
Quidem, ipsam illum quis sed voluptatum quae eum fugit earum
</List.Item>
</List.Root>
)
}
[Error] Origin null is not allowed by Access-Control-Allow-Origin. Status code: 0
[Error] Failed to load resource: Origin null is not allowed by Access-Control-Allow-Origin. Status code: 0 (index-n_ryQ3BS.css, line 0)
// package.json
"scripts": {
// ....
"preview": "vite preview"
// ....
},
export function MainNode() {
const [tasks, setTasks] = useState(predefinedTasks)
const addTask = (listName, task) => {
// ..
// setTasks
// ..
}
const removeTask = (listNaem, taskId) => {
// ...
// setTasks
// ..
}
const moveTask = (fromListName, toListName, taskId) => {
// ..
// setTasks
// ..
}
return (
<main>
<TasksContainer type="Backlog" tasks={tasks.backlog} addTask={addTask}/>
<TasksContainer type="Ready" ... />
<TasksContainer type="InProgress" ... />
<TasksContainer type="Finished" ... />
</main>
)
}
export const TaskContext = createContext();
export const TaskProvider = ({ children }) => {
const [tasks, setTasks] = useState(predefinedTasks)
const addTask = (listName, task) => {
// ..
// setTasks
// ..
}
const removeTask = (listNaem, taskId) => {
// ...
// setTasks
// ..
}
const moveTask = (fromListName, toListName, taskId) => {
// ..
// setTasks
// ..
}
return (
<TaskContext.Provider value={{ tasks, moveTask, addTask }}>
{children}
</TaskContext.Provider>
);
}
const TaskList = ({ listName }) => {
const { tasks, moveTask, addTask } = useContext(TaskContext);
// ....
}
// так не работет
tasks.backlog.push(...)
// так работает
const tasks = {....} // объект с задачами
const updatedTasks = { // создаем новый объект с задачами
...tasks,
[listName]: [...tasks[listName], newTask]
};
setTasks(updatedTasks) // обновляем состояние
fetch("https://jsonplaceholder.typicode.com/users")
.then(response => response.json())
.then(json => console.log(json));