54
loading...
This website collects cookies to deliver better user experience
import { FormEvent, KeyboardEvent, useState } from "react";
import { render } from "react-dom";
interface TODO {
id: string;
text: string;
done: boolean;
}
const App = () => {
const [input, setInput] = useState("");
const [todos, setTodos] = useState<TODO[]>([]);
const done = todos.filter((todo) => todo.done);
const notDone = todos.filter((todo) => !todo.done);
const createTodo = (text: string) => {
setTodos([...todos, { id: `${Math.random()}`, text, done: false }]);
};
const removeTodo = (todoId: string) => {
setTodos(todos.filter((todo) => todo.id !== todoId));
};
const setTodoDone = (todoId: string, done: boolean) => {
const newTodoList = todos.map((todo) => {
if (todo.id === todoId) {
return { ...todo, done };
}
return todo;
});
setTodos(newTodoList);
};
const addTodo = () => {
if (input) {
createTodo(input);
setInput("");
}
};
const onInput = (event: FormEvent<HTMLInputElement>) => {
const target = event.target as HTMLInputElement;
setInput(target.value);
};
const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
if (event.key === "Enter") {
addTodo();
}
};
return (
<div>
<input value={input} onInput={onInput} onKeyDown={onKeyDown} />
<button onClick={addTodo}>Add</button>
<div>
<b>Todo:</b>
{notDone.map((todo) => {
return (
<div key={todo.id}>
{todo.text}
<button onClick={() => setTodoDone(todo.id, true)}>Done</button>
</div>
);
})}
</div>
<div>
<b>Done:</b>
{done.map((todo) => {
return (
<div key={todo.id}>
{todo.text}
<button onClick={() => removeTodo(todo.id)}>Remove</button>
<button onClick={() => setTodoDone(todo.id, false)}>Undo</button>
</div>
);
})}
</div>
</div>
);
};
render(<App />, document.getElementById("app"));
import { For, render } from "solid-js/web";
import { createMemo, createSignal } from "solid-js";
interface TODO {
id: string;
text: string;
done: boolean;
}
const App = () => {
const [todos, setTodos] = createSignal<TODO[]>([]);
const [input, setInput] = createSignal("");
const doneTodos = createMemo(() => todos().filter((todo) => todo.done));
const undoneTodos = createMemo(() => todos().filter((todo) => !todo.done));
const createTodo = (text: string) => {
setTodos([...todos(), { id: `${Math.random()}`, text, done: false }]);
};
const removeTodo = (todoId: string) => {
setTodos(todos().filter((todo) => todo.id !== todoId));
};
const setTodoDone = (todoId: string, done: boolean) => {
setTodos(
todos().map((todo) => {
if (todo.id === todoId) {
return { ...todo, done };
}
return todo;
})
);
};
const addTodo = () => {
const currentInput = input();
if (currentInput) {
createTodo(currentInput);
setInput("");
}
};
const onInput = (event: InputEvent) => {
const target = event.target as HTMLInputElement;
setInput(target.value);
};
const onKeydown = (event: KeyboardEvent) => {
if (event.key === "Enter") {
addTodo();
}
};
return (
<div>
<input value={input()} onInput={onInput} onKeyDown={onKeydown} />
<button onClick={addTodo}>Add</button>
<div>
<b>Todo:</b>
<For each={undoneTodos()}>
{(todo) => {
return (
<div>
{todo.text}
<button onClick={() => setTodoDone(todo.id, true)}>Done</button>
</div>
);
}}
</For>
</div>
<div>
<b>Done:</b>
<For each={doneTodos()}>
{(todo) => {
return (
<div>
{todo.text}
<button onClick={() => removeTodo(todo.id)}>Remove</button>
<button onClick={() => setTodoDone(todo.id, false)}>
Undo
</button>
</div>
);
}}
</For>
</div>
</div>
);
};
render(() => <App />, document.getElementById("app"));
createMemo()
function, or the <For/>
loop component.createMemo()
. In Solid, updates are separate from components, which only serve a role of code organization.<For/>
component - it’s yet another performance optimization. Like many other flow control components in Solid, <For/>
allows the library to better control and optimize the rendering compared to the traditional .map()
method. Of course, you’re still free to use it, but <For/>
will provide better performance.