지금까지 배웠던 것들로 todo 리스트 작성
텍스트를 터치하면 삭제되고
textInput을 통해 새로운 텍스트를 추가할 수 있다.
import { StyleSheet, Text, View, FlatList, ScrollView } from "react-native";
import React, { useRef, useState } from "react";
import Header from "./components/header";
import TodoItem from "./components/todoItem";
import AddTodo from "./components/addTodo";
export default function App() {
const [todos, setTodos] = useState([
{ text: "Javascript", key: "1" },
{ text: "Python", key: "2" },
{ text: "C#", key: "3" },
{ text: "Ruby", key: "4" },
{ text: "Kotlin", key: "5" },
{ text: "Swift", key: "6" },
{ text: "Java", key: "7" },
]);
const size = todos.length;
const nextId = useRef(size);
const pressHandler = (key) => {
setTodos((prevTodos) => prevTodos.filter((todo) => todo.key != key));
};
const submitHandler = (text) => {
nextId.current++;
setTodos((prevTodos) => [
...prevTodos,
{ text: text, key: nextId.current.toString() },
]);
};
return (
<ScrollView style={styles.container}>
{/* header */}
<Header />
<View style={styles.content}>
{/* to from */}
<AddTodo submitHandler={submitHandler} />
<View style={styles.list}>
<FlatList
data={todos}
renderItem={({ item }) => (
<TodoItem item={item} pressHandler={pressHandler} />
)}
/>
</View>
</View>
</ScrollView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
// alignItems: "center",
// justifyContent: "center",
},
content: {
padding: 40,
},
list: {
marginTop: 20,
},
});
import React from "react";
import { StyleSheet, Text, View } from "react-native";
export default function Header() {
return (
<View style={styles.header}>
<Text style={styles.title}>My Todos</Text>
</View>
);
}
const styles = StyleSheet.create({
header: {
height: 80,
paddingTop: 38,
backgroundColor: "coral",
},
title: {
textAlign: "center",
color: "#fff",
fontSize: 20,
fontWeight: "bold",
},
});
import React from "react";
import { StyleSheet, Text, TouchableOpacity } from "react-native";
export default function TodoItem({ item, pressHandler }) {
return (
<TouchableOpacity onPress={() => pressHandler(item.key)}>
<Text style={styles.item}>{item.text}</Text>
</TouchableOpacity>
);
}
const styles = StyleSheet.create({
item: {
padding: 16,
marginTop: 16,
borderColor: "#bbb",
borderWidth: 1,
borderStyle: "dashed",
borderRadius: 10,
},
});
import React, { useState } from "react";
import { StyleSheet, View, TextInput, Button } from "react-native";
export default function AddTodo({ submitHandler }) {
const [text, setText] = useState("");
const changeHandler = (val) => {
setText(val);
};
return (
<View>
<TextInput
style={styles.input}
placeholder="new todo..."
onChangeText={changeHandler}
/>
<Button
onPress={() => submitHandler(text)}
title="Add Todo"
color="coral"
/>
</View>
);
}
const styles = StyleSheet.create({
input: {
marginBottom: 10,
paddingHorizontal: 8,
paddingVertical: 6,
borderBottomWidth: 1,
borderBottomColor: "#ddd",
},
});
참고 : https://www.youtube.com/watch?v=oVA9JgTTiT0&list=PL4cUxeGkcC9ixPU-QkScoRBVxtPPzVjrQ&index=12