todo 앱 만들기 (3단계)
React 2021. 7. 1. 15:38import React, { useState } from "react";
import { StyleSheet, Text, View, FlatList, Alert } from "react-native";
import Header from "./components/header";
import TodoItem from "./components/todoItem";
import AddTodo from "./components/addTodo";
export default function App() {
const [todos, setTodos] = useState([
{ text: "buy coffee", key: "1" },
{ text: "create an app", key: "2" },
{ text: "play on the switch", key: "3" },
]);
const pressHandler = key => {
setTodos(prevTodos => {
return prevTodos.filter(todo => todo.key != key);
});
};
const submitHandler = text => {
if (text.length > 3) {
setTodos(prevTodos => {
//https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/rest_parameters
//https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax
return [{ text: text, key: Math.random().toString() }, ...prevTodos];
});
} else {
Alert.alert("OOPS!", "Todos must be over 3 chars long", [
{ text: "Userstood", onPress: () => console.log("alert closed") },
]);
}
};
return (
<View style={styles.container}>
<Header />
<View style={styles.content}>
<AddTodo submitHandler={submitHandler} />
<View style={styles.lists}>
<FlatList
data={todos}
renderItem={({ item }) => (
<TodoItem item={item} pressHandler={pressHandler} />
)}
/>
</View>
</View>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
// alignItems: "center",
// justifyContent: "center",
},
content: {
padding: 40,
},
list: {
marginTop: 20,
},
});
import React, { useState } from "react";
import { StyleSheet, Text, 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",
},
});
import React from "react";
import { StyleSheet, Text, View, 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 from "react";
import { StyleSheet, View, Text } 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: {
fontSize: 20,
textAlign: "center",
color: "#fff",
fontWeight: "bold",
},
});
https://www.youtube.com/watch?v=oVA9JgTTiT0&list=PL4cUxeGkcC9ixPU-QkScoRBVxtPPzVjrQ&index=12
'React' 카테고리의 다른 글
리액트 프로젝트 만들기 (0) | 2022.01.23 |
---|---|
리액트와 컴포넌트 (0) | 2022.01.23 |
todo 앱 만들기 (2단계) (0) | 2021.07.01 |
todo 앱 만들기 (1단계) (0) | 2021.07.01 |
[3장 컴포넌트] 첫 컴포넌트 생성 (0) | 2020.12.01 |