[RN 3-2 프로젝트 개발 1]

2020. 2. 21. 23:06React Native/React Native 일정관리 앱

반응형

하단의 + 버튼을 클릭하면, 입력 창 다이얼로그 띄우면서 뒷배경은 불투명도로 조정

 

- (-) 버튼을 클릭하면 삭제

- 앱이 종료되어도 데이터가 사라지지 않음 (데이터 유지)

 


1. 전역 데이터 저장할 Context 생성


src/Context/TodoListContext/@types/

index.d.ts

 

더보기
interface ITodoListContext {
  todoList: Array<string>;
  addTodoList: (todo: string) => void;
  removeTodoList: (index: number) => void;
}

 


2. 컨텍스트 정의

 

src/Context/TodoListContext/

index.tsx

 

더보기
import React, { createContext, useState, useEffect } from 'react';
import AsyncStorage from '@react-native-community/async-storage';

interface Props {
  children: JSX.Element | Array<JSX.Element>;
}

const TodoListContext = createContext<ITodoListContext>({
  todoList: [],
  addTodoList: (todo: string): void => {},
  removeTodoList: (index: number): void => {},
});

const TodoListContextProvider = ({ children }: Props) => {
  const [todoList, setTodoList] = useState<Array<string>>([]);

  const addTodoList = (todo: string): void => {
    const list = [...todoList, todo];
    setTodoList(list);
    AsyncStorage.setItem('todoList', JSON.stringify(list));
  };

  const removeTodoList = (index: number): void => {
    let list = [...todoList];
    list.splice(index, 1);
    setTodoList(list);
    AsyncStorage.setItem('todoList', JSON.stringify(list));
  };

  const initData = async () => {
    try {
      const list = await AsyncStorage.getItem('todoList');
      if (list !== null) {
        setTodoList(JSON.parse(list));
      }
    } catch (e) {
      console.log(e);
    }
  };

  useEffect(() => {
    initData();
  }, []);

  return (
    <TodoListContext.Provider
      value={{
        todoList,
        addTodoList,
        removeTodoList,
      }}>
      {children}
    </TodoListContext.Provider>
  );
};

export { TodoListContextProvider, TodoListContext };

 


3) 프로바이더 설정 

 

src/

App.tsx

 

더보기
import React from 'react';
import Styled from 'styled-components/native';

import { TodoListContextProvider } from '~/Context/TodoListContext';

import Todo from './Screens/Todo';

const Container = Styled.View`
  flex: 1;
  background-color: #EEE;
`;

const App = () => {
  return (
    <TodoListContextProvider>
      <Container>
        <Todo />
      </Container>
    </TodoListContextProvider>
  );
};

export default App;

5) Todo 컴포넌트


src/Screens/Todo/

index.tsx

 

더보기
import React from 'react';
import Styled from 'styled-components/native';

import TodoListView from './TodoListView';
import AddTodo from './AddTodo';

const Container = Styled.View`
  flex: 1;
`;

interface Props {}

const Todo = ({  }: Props) => {
  return (
    <Container>
      <TodoListView />
      <AddTodo />
    </Container>
  );
};
export default Todo;

 

 

 

 

 

반응형

'React Native > React Native 일정관리 앱' 카테고리의 다른 글

[RN 3-4 프로젝트 개발 3]  (0) 2020.02.22
[RN 3-3 프로젝트 개발 2]  (0) 2020.02.22
[RN 3-1 프로젝트 준비]  (0) 2020.02.21