[React Native] Todo 앱 - Context & AsyncStorage_2편

2022. 7. 20. 15:37·React Native/TypeScript
반응형

들어가며.

Todo 앱 - Context & AsyncStorage_1편과 이어지는 내용입니다. 

앞선 부분을 보지 않으셨다면 확인하시는 것을 추천드립니다. 

 

4. 개발

10. AddTodo 컴포넌트

import React, {useState} from 'react';

import AddButton from './AddButton';
import TodoInput from './TodoInput';

interface Props {}

const AddTodo = ({}: Props) => {
  const [showInput, setShowInput] = useState<boolean>(false);

  return (
    <>
      <AddButton onPress={() => setShowInput(true)} />
      {showInput && <TodoInput hideTodoInput={() => setShowInput(false)} />}
    </>
  );
};

export default AddTodo;

Todo 데이터를 추가하기 위한 컴포넌트이다. 

 

const [showInput, setShowInput] = useState<boolean>(false);

useState를 사용하여 Todo 추가 버튼을 눌렀을 때, 입력할 수 있는 컴포넌트를 화면에 표시하기 위해서 

showInput이라는 State를 추가했다. 

 

11. AddButton 컴포넌트

import React from 'react';
import styled from 'styled-components/native';

const Container = styled.SafeAreaView`
  position: absolute;
  bottom: 0;
  align-self: center;
  justify-content: flex-end;
`;

const ButtonContainer = styled.TouchableOpacity`
  box-shadow: 4px 4px 8px #999;
`;

const Icon = styled.Image``;

interface Props {
  onPress: () => void;
}

const AddButton = ({onPress}: Props) => {
  return (
    <Container>
      <ButtonContainer onPress={onPress}>
        <Icon source={require('~/Assets/images/add.png')} />
      </ButtonContainer>
    </Container>
  );
};

export default AddButton;

Todo를 입력하기 위해서 화면에 표시하기 위한, AddButton 컴포넌트이다. 

단순한 버튼을 가지고 있는 컴포넌트로 Assets은 마찬가지로 카운터 앱의 이미지를 사용했다. 

 

12. TodoInput 컴포넌트 

import React from 'react';
import styled from 'styled-components/native';

import Background from './Background';
import TextInput from './TextInput';

const Container = styled.KeyboardAvoidingView`
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;

  justify-content: flex-end;
`;

interface Props {
  hideTodoInput: () => void;
}

const TodoInput = ({hideTodoInput}: Props) => {
  return (
    <Container behavior="padding">
      <Background onPress={hideTodoInput} />
      <TextInput hideTodoInput={hideTodoInput} />
    </Container>
  );
};

export default TodoInput;

Todo 추가 버튼을 클릭했을 때, 표시될 TodoInput 컴포넌트이다. 

 

화면을 어둡게 처리할 Background 컴포넌트와 텍스트를 입력받을 TextInput 컴포넌트로 구성되어 있다. 

 

interface Props {
  hideTodoInput: () => void;
}

const TodoInput = ({hideTodoInput}: Props) => {

TodoInput 컴포넌트를 숨기기 위해서 AddTodo 컴포넌트에서 만든 hideTodoInput 함수를 Props를 통해 

전달받았다. 

 

13. Background 컴포넌트

import React from 'react';
import styled from 'styled-components/native';

const Container = styled.TouchableOpacity`
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
`;

const BlackBackground = styled.View`
  background-color: #000;
  opacity: 0.3;

  width: 100%;
  height: 100%;
`;

interface Props {
  onPress: () => void;
}

const Background = ({onPress}: Props) => {
  return (
    <Container onPress={onPress}>
      <BlackBackground />
    </Container>
  );
};

export default Background;

TodoInput 컴포넌트가 활성화되었을 때, 배경을 어둡게 하기 위해서 사용되는 Background 컴포넌트이다. 

 

단순하게 화면에 검은색 배경의 투명도를 가지는 뷰 컴포넌트를 화면에 표시한다. 

또한 전달받은 Props를 통해서 컴포넌트를 선택하면 TodoInput 컴포넌트를 숨기도록 설정했다. 

 

14. TextInput 컴포넌트

import React, {useContext} from 'react';
import styled from 'styled-components/native';

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

const Input = styled.TextInput`
  width: 100%;
  height: 40px;

  background-color: #fff;
  padding: 0px 8px;
`;

interface Props {
  hideTodoInput: () => void;
}

const TextInput = ({hideTodoInput}: Props) => {
  const {addTodoList} = useContext<ITodoListContext>(TodoListContext);

  return (
    <Input
      autoFocus={true}
      autoCapitalize="none"
      autoCorrect={false}
      placeholder={'할 일을 작성해주세요.'}
      returnKeyType="done"
      onSubmitEditing={({nativeEvent}) => {
        addTodoList(nativeEvent.text);
        hideTodoInput();
      }}
    />
  );
};

export default TextInput;

useContext를 사용해서 Context를 사용할 수 있게 설정했다. 

초기값은 TodoListContext를 전달하였고, 데이터 추가를 위해서 addTodoList 함수를 할당받았다. 

 

 

3. 결과물

https://github.com/SeoJaeWan/TodoList

 

GitHub - SeoJaeWan/TodoList

Contribute to SeoJaeWan/TodoList development by creating an account on GitHub.

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React Native > TypeScript' 카테고리의 다른 글

[React Native] Todo 앱 - Context & AsyncStorage_1편  (1) 2022.07.19
[React Native] 카운터 앱 - Props & State  (1) 2022.07.18
'React Native/TypeScript' 카테고리의 다른 글
  • [React Native] Todo 앱 - Context & AsyncStorage_1편
  • [React Native] 카운터 앱 - Props & State
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    덤프
    리액트
    ReactNative
    Babel
    네트워크
    다이소
    redux
    자바스크립트
    react
    바질 키우기
    프로그래머스
    영어독학
    next.js
    네이버 부스트캠프
    Node.js
    타일러영어
    리얼학습일기
    CCNA
    ChatGPT
    알고리즘
    영어회화
    typescript
    식물
    javascript
    리얼클래스
    CSS
    타입스크립트
    Docker
    webpack
    바질
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React Native] Todo 앱 - Context & AsyncStorage_2편
상단으로

티스토리툴바