부모에서 자식으로 값을 전달하는 건 자식 컴포넌트로 props 전달을 해주면 된다. 그러나 자식에서 부모로 값을 전달할 때는 그 방법이 다르다.
자식 → 부모
1. 먼저 부모 컴포넌트에서 함수를 정의하고 이 함수를 자식 컴포넌트에 props로 내려준다.
⬇️ 부모컴포넌트
import React, { useEffect, useState } from "react";
import styles from "./List.module.css";
import { useImmer } from "use-immer";
import ListItem from "./ListItem";
export default function List() {
const [list, updateList] = useImmer(initalList);
const [input, setIntput] = useState("");
useEffect(() => {
const localData = localStorage.getItem("list");
if (localData) {
updateList(JSON.parse(localData));
}
}, []);
const handleAdd = (e) => {
const title = e.target.value;
updateList((list) => {
list.todos.push({ title });
localStorage.setItem("list", JSON.stringify(list));
});
};
const handleDelete = (title) => {
updateList((list) => {
const index = list.todos.findIndex((todo) => todo.title == title);
list.todos.splice(index, 1);
localStorage.setItem("list", JSON.stringify(list));
});
};
function enterkeyEvent(e) {
if (e.key == "Enter" && e.nativeEvent.isComposing == false) {
e.preventDefault();
setIntput("");
handleAdd(e);
}
}
const textHandler = (e) => {
const inputText = e.target.value;
setIntput(inputText);
};
return (
<div className={styles.container}>
<div className={styles.list_container}>
{list.todos.map((todo, index) => {
return (
todo.title != null && (
<ListItem
handleDelete={handleDelete}
key={index}
index={index}
todo={todo}
/>
)
);
})}
</div>
<div className={styles.input_container}>
<input
className={styles.input}
type="text"
id="todo"
name="todo"
placeholder="input"
onChange={textHandler}
value={input}
onKeyDown={(e) => {
enterkeyEvent(e);
}}
/>
</div>
</div>
);
}
const initalList = {
todos: [
{
},
],
};
2. 그리고 자식 컴포넌트의 데이터를 부모 컴포넌트에게 전달받은 함수의 인자로 자식 컴포넌트에서 전달할 데이터를 전달하게 되면 자식 컴포넌트에서 부모 컴포넌트로 데이터를 전달할 수 있다.
⬇️ 자식 컴포넌트
import React, { useState } from "react";
import styles from "./ListItem.module.css";
export default function ListItem({ handleDelete, todo, index }) {
const [title, setTitle] = useState(todo.title);
return (
<>
<div className={styles.container}>
<p>{todo.title}</p>
<button
key={index}
onClick={() => {
setTitle(title);
handleDelete(title);
}}
>
delete
</button>
</div>
</>
);
}