はじめに
- ReactNativeでHooksを利用するにあたり覚えたことを下記にまとめました。
Hookが利用できるバージョン
- expoではReactHookがSDK33以降から対応している。
- ReactNativeは0.59から対応している
React 16.8.0 がフックをサポートする最初のバージョンです。アップグレードの際は、React DOM を含むすべてのパッケージの更新を忘れないようにしてください。React Native は React Native 0.59 リリース以降でフックをサポートします。
Hookの機能
- useEffectでマウント時だけ実行した場合、第二引数は[]を指定する
空の配列 [] を渡すと、この副作用がコンポーネント内のどの値にも依存していないということを React に伝えることになります。つまり副作用はマウント時に実行されアンマウント時にクリーンアップされますが、更新時には実行されないようになります。
- コンポーネントがアンマウントされるときにクリーンアップが必要な場合、returnでクリーンアップ関数を返します
useEffect(() => {
const timer = setTimeout(() =>{
setArticles(dummyArticles)
}, 2000)
return () => clearTimeout(timer)
},[])
app.jsonにapplication独自の設定を追加する
- 'expo-constants'をインストールする
expo install expo-constants
- 'app.json'のextraを追加する
{
"expo": {
"name": "test",
"slug": "test",
"platforms": ["ios", "android", "web"],
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"extra": {
"apiKey": "ssss451a7df0d51addsafafa43f08bff9afdfasdfasd8c2e8d26064"
}
}
}
- app.jsonを設定した場合、expoを再起動する docs.expo.io docs.expo.io
Function / Class Componentの違い
(1)Class Component - state - ライフサイクル(ComponentdDidMountなど)
export default class App extends React.Componet {
constructor(props) {
super(props)
// HooksでいうuseState
this.state = {
articles: []
}
}
// HooksでいうuseEffectの部分
async componentDimMount() {
this.fetchArticles(URL);
}
fetchArticles = async () => {
try {
const response = await axios.get(URL)
this.setState({ articles: response.data.articles })
} catch (error) {
console.error(error)
}
}
render() {
}
}
(2) Function Component - UseState - UseEffect - 記述が簡単に書ける - 動作としても少し早い
※上記のClass ComponentをFunction Componentで記述している
export default App = () => {
const [articles, setArticles] = useState([])
useEffect(() => {
fetchArticles()
},[])
const fetchArticles = async () => {
try{
const response = await axios.get(URL)
setArticles(response.data.articles)
console.log(response)
} catch(error){
console.log(error)
}
}
return (
);
}