App.tsx
import "./App.css";
import { useState, useRef, useEffect } from "react";
import Editor from "./components/Editor";
interface Todo {
id: number;
content: string;
}
function App() {
const [todos, setTodos] = useState<Todo[]>([]);
const idRef = useRef(0);
const onClickAdd = (text: string) => {
setTodos([
...todos,
{
id: idRef.current++,
content: text,
},
]);
};
useEffect(() => {
console.log(todos);
}, [todos]);
return (
<div className="App">
<h1>Todo</h1>
<Editor onClickAdd={onClickAdd}>
<div>child</div>
</Editor>
</div>
);
}
export default App;
Editor.tsx
import { ReactElement, useState } from "react";
interface Props {
onClickAdd: (text: string) => void;
children: ReactElement;
}
export default function Editor(props: Props) {
// "" 를 초기값으로해서 string 타입으로 자동 추론해줌
const [text, setText] = useState("");
const onChangeInput = (e: React.ChangeEvent<HTMLInputElement>) => {
setText(e.target.value);
};
const onClickButton = () => {
props.onClickAdd(text);
setText("");
};
return (
<div>
<input value={text} onChange={onChangeInput} />
<button onClick={onClickButton}>추가</button>
</div>
);
}
