-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathApp.js
104 lines (94 loc) · 3.09 KB
/
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import React from 'react';
import {StyleSheet, Text, View, FlatList, AsyncStorage } from 'react-native';
import Header from './app/components/Header';
import Subtitle from './app/components/Subtilte';
import Input from './app/components/Input';
import Listitem from './app/components/Listitem';
export default class App extends React.Component {
constructor(props){
super(props);
this.state={
inputValue:'',
todos:[]
}
}
//redering: react가 기본적으로 화면에 보여주는것(다른말로 mount)
componentWillMount(){ //component가 화면에 보여지기 전에 data를 가져오겠다.
this.getData()
}
storeData=() =>{
AsyncStorage.setItem('@todo:state', JSON.stringify(this.state));
}
getData=() =>{
AsyncStorage.getItem('@todo:state').then((state)=>{
if(state !== null){
this.setState(JSON.parse(state));//받아온 state가 string이니까 object형식으로 바꿔줌
}
})
}
_makeTodoItem = ({item, index})=>{
return (
<Listitem
name = {item.title}
iscomplete = {item.iscomplete}
changecomplete = {() =>{ //익명함수에 화살표함수임
const newTodo = [...this.state.todos]; //지금 가지고 있는 todoe를 새로운 todo에 넣어줘라
newTodo[index].iscomplete = !newTodo[index].iscomplete
this.setState({todos:newTodo}, this.storeData)
}}
deleteItem = {() =>{
const newTodo = [...this.state.todos]; //지금까지의 목록을 모두 newtodo에 저장
newTodo.splice(index,1) //??
this.setState({todos:newTodo}, this.storeData) //삭제된 상태의 리스트를 현재 상태에 저장
}} />
);
}
_changeText=(value) =>{
this.setState({inputValue:value});
}
_addTodoIem=() =>{
if(this.state.inputValue !== ""){
const prevTodo = this.state.todos;
const newTodo = {title : this.state.inputValue, iscomplete : false}; //이 todo는 super(props)의 todo로 들어감
this.setState({
inputValue:'', //input창 새로고침
todos : prevTodo.concat(newTodo) //concat 원래있던 리스트에 새로운 리스트 이어붙임
}, this.storeData);
}
}
render(){
return (
<View style={styles.container} >
<View style={styles.headercenter}>
<Header/>
</View>
<View style={styles.subtitleposition}>
<Subtitle title="해야할 일" />
<Input
value={this.state.inputValue}
changeText = {this._changeText}
addTodoItem = {this._addTodoIem}/>
</View>
<View style={styles.subtitleposition}>
<Subtitle title="해야 할 일 목록" />
<FlatList
data = {this.state.todos}
renderItem = {this._makeTodoItem}
keyExtractor = {(item, index)=>{return '$(index)'}}/>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container:{
flex: 1, //view라는 컴포넌트의 위치??
backgroundColor: '#fff',
},
headercenter:{
alignItems:"center",
},
subtitleposition:{
marginLeft:50,
}
});