API에서 로드되는 React Native 앱의 동적 배경을 만드는 방법
앱용 이미지를 가져올 수 있는 수많은 멋진 API가 있습니다. 이 가이드에서는 배경 이미지를 로드하기 위해 Pixabay API를 사용할 것입니다. pixabay.com에서 API 키를 가져와야 합니다.
ImageBackground
에서 react-native
요소 가져오기import { ImageBackground} from 'react-native';
ImageBackground를 적용하려는 구성 요소의 상위 요소로 추가하고 스타일을 추가합니다.
export default function SomeComponent(props) {
return (
// rendering ImageBackground element with backgroundImage from state passed as source of the image
<ImageBackground
source={{ uri: backgroundImage }}
style={styles.background}
>
<View style={styles.app}>
</View>
</ImageBackground>
);
}
스타일:
const styles = StyleSheet.create({
background: {
flex: 1,
resizeMode: "cover",
justifyContent: "flex-end"
},
app: {
marginHorizontal: "auto",
maxWidth: 500,
backGroundColor: "transparent"
}
});
일부 기본 이미지가 포함된 이미지의 상태 변수를 가져오고
useState
선언합니다.import {useState} from 'react'
// declare state variable for single background image, initially some image
const [backgroundImage, setBackgroundImage] = useState("https://pixabay.com/get/g5087a1cec28279208368920fd3d30343bf08ca1002b5316e4cdd8fac66e19af31811080dc13c67f0f49c113298c4724166f201a96b48651d0b49efddfea5d2b6_640.jpg");
예를 들어 Pixabay와 같은 일부 API에서 이미지를 가져오는 함수를 추가합니다.
// Please add your api key which you can get from pixabay.com
const pixabayAPIkey='YOUR API KEY'
let newBackground = () => {
// sending request to the API
fetch(
`https://pixabay.com/api/?key=${pixabayAPIkey}&q=cat&orientation=vertical&safesearch=true&per_page=100`
)
.then((data) => {
return data.json();
})
.then((pics) => {
// creating a random number for index to pick one of the images from 100 we will get
let randomImage = parseInt(Math.random() * pics.totalHits);
// set this random image to tbe the current background
setBackgroundImage(pics.hits[randomImage].largeImageURL);
// set all images in state to use later for changing the background
setAllImages(pics.hits);
})
.catch((err) => {
console.log(err);
})
.finally(() => console.log("Finally: ", backgroundImage, allImages.length));
};
// executing the function only on first load once, no need for useEffect
newBackground();
이 함수에서 우리는 이미지 배열을 얻을 것이므로 구성 요소 및 남용 API의 수명 주기 동안 매번 새 요청을 보내는 대신 상태에 저장한 다음 배경을 업데이트하는 데 사용합시다.
모든 이미지를 유지하기 위해 상태 변수를 추가합니다.
// declare state variable for all images we will get from API
const [allImages, setAllImages] = useState([]);
newBackground
에서 setAllImages(pics.hits)
로 업데이트됩니다.이제 첫 번째 렌더링에서 많은 이미지를 가져와 그 중 하나를 현재 배경으로 설정합니다.
확인을 위해 배경을 수동으로 변경하는 버튼을 추가할 수도 있습니다. 사용자 또는 앱에서 만든 일부 이벤트로 버튼을 교체할 수 있습니다.
<Button title="New Kitty" onPress={()=>allImages.length>0&&updateBackground()} />
따라서 최종 코드는 다음과 같습니다.
import React from "react";
// import all the elements we will use from react-native
import { ImageBackground, Button, StyleSheet, View } from "react-native";
// import useState
import { useState } from "react";
function App() {
// declare state variable for single background image, initially some image
const [backgroundImage, setBackgroundImage] = useState("https://pixabay.com/get/g5087a1cec28279208368920fd3d30343bf08ca1002b5316e4cdd8fac66e19af31811080dc13c67f0f49c113298c4724166f201a96b48651d0b49efddfea5d2b6_640.jpg");
// declare state variable for all images we will get from API
const [allImages, setAllImages] = useState([]);
// Please add your api key which you can get from pixabay.com
const pixabayAPIkey='YOUR API KEY'
let newBackground = () => {
// sending request to the API
fetch(
`https://pixabay.com/api/?key=${pixabayAPIkey}&q=cat&orientation=vertical&safesearch=true&per_page=100`
)
.then((data) => {
return data.json();
})
.then((pics) => {
// creating a random number for index to pick one of the images from 100 we will get
let randomImage = parseInt(Math.random() * pics.totalHits);
// set this random image to tbe the current background
setBackgroundImage(pics.hits[randomImage].largeImageURL);
// set all images in state to use later for changing the background
setAllImages(pics.hits);
})
.catch((err) => {
console.log(err);
})
.finally(() => console.log("Finally: ", backgroundImage, allImages.length));
};
// executing the function only on first load once, no need for useEffect
newBackground();
// updating background from state
const updateBackground = () => {
// generating random index
let randomImage = parseInt(Math.random() * (allImages.length - 1));
// setting random image from images array in state to be the current background
setBackgroundImage(allImages[randomImage].largeImageURL);
};
return (
// rendering ImageBackground element with backgroundImage from state passed as source of the image
<ImageBackground
source={{ uri: backgroundImage }}
style={styles.background}
>
<View style={styles.app}>
{/* button to trigger change of the background if we have images in the allImages */}
<Button title="New Kitty" onPress={()=>allImages.length>0&&updateBackground()} />
</View>
</ImageBackground>
);
}
const styles = StyleSheet.create({
background: {
flex: 1,
resizeMode: "cover",
justifyContent: "flex-end"
},
app: {
marginHorizontal: "auto",
maxWidth: 500,
backGroundColor: "transparent"
}
});
export default App;
다음은 코드가 있는 sandbox입니다.
그게 다야 :)
Reference
이 문제에 관하여(API에서 로드되는 React Native 앱의 동적 배경을 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bcncodeschool/how-to-make-a-dynamic-background-for-react-native-apps-loading-from-api-5bf8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)