반응형
context/LogContext.js
import {createContext, useState} from 'react';
import React from 'react';
import {v4} from 'uuid';
const LogContext = createContext();
export function LogContextProvider({children}) {
(...)
const onModify = modified => {
const nextLogs = logs.map(log => (log.id === modified.id ? modified : log));
setLogs(nextLogs);
};
// ----추가 ----
const onRemove = id => {
const nextLogs = logs.filter(log => log.id !== id);
setLogs(nextLogs);
};
// ------
return (
<LogContext.Provider value={{logs, onCreate, onModify,onRemove}}> //onRemove 추가
{children}
</LogContext.Provider>
);
}
export default LogContext;
배열의 내장 함수 filter로 특정 Id를 제외한 항목으로만 구성된 새로운 배열을 만들어서
상태값을 업데이트 했습니다.
이제 우측 상단에 삭제 버튼을 눌렀을 때
onRemove함수를 호출 하여 삭제 할 것이며
Alert.alert를 사용하여 사용자에게 한번 더 물어보는 과정을 거치겠습니다.
screens/WriteScreen.js
import React, {useContext, useState} from 'react';
import {
View,
StyleSheet,
KeyboardAvoidingView,
Platform,
Alert,
} from 'react-native'; //Alert 추가
import {SafeAreaView} from 'react-native-safe-area-context';
import WriteHeader from '../components/WriteHeader';
import WriteEditor from '../components/WriteEditor';
import {useNavigation} from '@react-navigation/native';
import LogContext from '../contexts/LogContext';
function WriteScreen({route}) {
(...)
//onRemove 추가
const {onCreate, onModify, onRemove} = useContext(LogContext);
// ---- 추가 -----
const onAskRemove = () => {
Alert.alert(
'삭제',
'정말로 삭제하시겠어요?',
[
{text: '취소', style: 'cancel'},
{
text: '삭제',
onPress: () => {
onRemove(log?.id);
navigation.goBack();
},
style: 'destructive',
},
],
{cancelable: true},
);
};
// ------
(...)
return (
<SafeAreaView style={styles.block}>
<KeyboardAvoidingView
style={styles.avoidingView}
behavior={Platform.OS === 'ios' ? 'padding' : undefined}>
<WriteHeader
onSave={onSave}
//추가
onAskRemove={onAskRemove}
isEditing={!!log}
//--
/>
<WriteEditor
title={title}
body={body}
onChangeTitle={setTitle}
onChangeBody={setBody}
/>
</KeyboardAvoidingView>
</SafeAreaView>
);
}
(...)
export default WriteScreen;
onAskRemove라는 함수를 만들어서 WriteHeader에 Props로 전달했습니다.
이전에 Alert.alert를 사용 할때는 취소버튼의 onPress와 4번째 인자인 옵션 객체에
Alert.alert를 닫을 때 호출하는 함수인 onDismiss에 () => {}와 같이
아무 작업도 하지않는 함수를 넣었지만 생략해도 무방합니다.
추가로 isEditing이라는 값도 전달했습니다.
WriteHeader에서 이 값을 확인하여 삭제 버튼을 보여줄지 말지 결정합니다.
!!log 라는 코드는 log가 유효한 값이라면 true, 그렇지 않으면 false를 전달하겠다는 의미 입니다.
이제 WriteHeader에서 isEditing Props가 true 일 때만 삭제 버튼을 보여주고
이 버튼을 눌렀을 때 onAskRemove를 호출하도록 하겠습니다.
components/WriteHeader.js
(...)
function WriteHeader({onSave, onAskRemove, isEditing}) { //onAskRemove,isEditing 추가
const navigation = useNavigation();
const onGoBack = () => {
navigation.goBack();
};
return (
<View style={styles.block}>
<View style={styles.iconButtonWrapper}>
<TransparentCircleButton
onPress={onGoBack}
name="arrow-back"
color={'#424242'}
/>
</View>
<View style={styles.buttons}>
//수정
{isEditing && (
<TransparentCircleButton
name="delete-forever"
color={'#ef5350'}
hasMarginRight
onPress={onAskRemove}
/>
)}
<TransparentCircleButton
name={'check'}
color={'#009688'}
onPress={onSave}
/>
</View>
</View>
);
}
(...)
이제 항목을 열어 삭제버튼을 누르면 Alert가 정상적으로 나타납니다.

반응형
'코딩생활 > ReactNative' 카테고리의 다른 글
[React Native] 3-11 검색 기능 구현하기 (2) (0) | 2023.03.30 |
---|---|
[React Native] 3-11 검색 기능 구현하기 (1) (0) | 2023.03.27 |
[React Native] 3-9 작성한 글을 WriteScreen으로 열기 (0) | 2023.03.20 |
[React Native] 3-8 스크롤 내렸을 때 글쓰기 버튼 숨기기 (0) | 2023.03.18 |
[React Native] 3-7 Animated로 애니메이션 적용 (0) | 2023.03.17 |
댓글