한꺼번에 모든 데이터를 가지고 페이지를 이동하는것은 상식적으로 느릴 수 밖에 없다.
이동하는 페이지에 필요한 데이터만 가지고 오는 기능이 필요한 이유!
Card.js
import React from 'react';
import {View, Image, Text, StyleSheet,TouchableOpacity} from 'react-native'
//MainPage로 부터 navigation 속성을 전달받아 Card 컴포넌트 안에서 사용
export default function Card({content,navigation}){
return(
//카드 자체가 버튼역할로써 누르게되면 상세페이지로 넘어가게끔 TouchableOpacity를 사용
<TouchableOpacity style={styles.card} onPress={()=>{navigation.navigate('DetailPage',{idx:content.idx})}}>
<Image style={styles.cardImage} source={{uri:content.image}}/>
<View style={styles.cardText}>
<Text style={styles.cardTitle} numberOfLines={1}>{content.title}</Text>
<Text style={styles.cardDesc} numberOfLines={3}>{content.desc}</Text>
<Text style={styles.cardDate}>{content.date}</Text>
</View>
</TouchableOpacity>
)
}
.
.
.
DetailPage.js
import React,{useState,useEffect} from 'react';
import { StyleSheet, Text, View, Image, ScrollView,TouchableOpacity,Alert,Share } from 'react-native';
import * as Linking from 'expo-linking';
import {firebase_db} from "../firebaseConfig"
export default function DetailPage({navigation,route}) {
.
.
.
useEffect(() => {
.
.
.
//넘어온 데이터는 route.params에 들어 있습니다.
const { idx } = route.params;
firebase_db
.ref("/tip/" + idx)
.once("value")
.then((snapshot) => {
let tip = snapshot.val();
setTip(tip);
});
}, []);
.
.
.
navigation.navigate('DetailPage',{idx:content.idx})
찜하기 버튼을 누르면 해당 데이터가 저장이 되고, 저장한 데이터를 출력해본다.
expo install expo-constants
DetailPage.js
.
.
.
import { firebase_db } from "../firebaseConfig";
import Constants from "expo-constants";
export default function DetailPage({ navigation, route }) {
const [tip, setTip] = useState({
idx: 9,
category: "재테크",
title: "렌탈 서비스 금액 비교해보기",
image: "https://firebasestorage.googleapis.com/v0/b/sparta-image.appspot.com/o/l~~",
desc: "요즘은 정수기, 공기 청정기, 자동차나 장난감 등 다양한 대여서비스가 활발합니다~~",
date: "2020.09.09",
});
.
.
.
useEffect(() => {
.
.
.
//넘어온 데이터는 route.params에 들어 있습니다.
const { idx } = route.params;
firebase_db
.ref("/tip/" + idx)
.once("value")
.then((snapshot) => {
let tip = snapshot.val();
setTip(tip);
});
}, []);
const like = () => {
const user_id = Constants.installationId;
firebase_db.ref(`/like/${user_id}/${tip.idx}`).set(tip, function (error) {
console.log(error);
Alert.alert("찜하기 완료!");
});
};
.
.
.
<TouchableOpacity style={styles.button} onPress={() => like()}>
<Text style={styles.buttonText}>팁 찜하기</Text>
</TouchableOpacity>
특정 카드를 클릭하여 들어간 상세페이지는 firebase_db에서 해당 카드 데이터만 가져와서 출력한다.
이 카드 데이터를 "팁 찜하기" 버튼을 눌러서 저장하는 작업이다.
const user_id = Constants.installationId;
firebase_db.ref(`/like/${user_id}/${tip.idx}`).set(tip, function (error) {
console.log(error);
Alert.alert("찜하기 완료!");
});