我需要狀態變數來記錄使用者作答的情況,而且要在App每個頁面都可使用,這時就要使用useContext了!
React提供createContext與useContext函數,可利用他們來建立全域變數分享到全部頁面。
首先,新增一個名為stores的資料夾,然後在裡面建立progressstore.js檔案,並將createContext與usestate匯入。
import React, { createContext, useState} from "react";
接下來,利用createContext建立一個StoreContext,用以儲存狀態變數。
export const StoreContext = createContext();
再來宣告StoreProvider用以傳遞狀態變數,且讓StoreProvider接受一個children元件。在StoreProvider內將需要用到的狀態變數完成宣告,並且宣告一個store物件用來儲存狀態變數。最後將children放在回覆的標籤 StoreContext.Provider之中,並設定參數Value的值為要傳遞給children元件的參數。
*小提醒:要注意store中的陣列宣告方式喔!
import locationData from '../json/location.json';
import contactData from '../json/contact.json';
import meData from '../json/me.json';
export const StoreProvider = ({ children }) => {
const [me, setMe] = useState(meData);
const [locations, setlocations] = useState(locationData.locationList);
const [contact, setcontact] = useState(contactData.contactList);
const [isLogin, setIsLogin] = useState(false);
const [ordernum,setordernum]=useState(0);
const store ={
meState: [me, setMe],
locationsState:[locations, setlocations],
contactState:[contact, setcontact],
isLoginState: [isLogin, setIsLogin],
ordernumState:[ordernum,setordernum]
};
return (
<StoreContext.Provider value={store}>
{children}
</StoreContext.Provider>
);
};
*小提示:me.json的內容為使用者的各項目初始狀態,例如:名字、學號、答題情況、登入與否等。
開啟App.js檔案,利用StoreProvider元件將App元件包起來,即完成將狀態變數設定為全域狀態變數。
//App.js的部分程式碼
import {StoreProvider} from "./src/stores/progressstore";
const App = () => {
<NavigationContainer>
<MainTabNavigator />
</NavigationContainer>
}
export default () => {
return (
<StoreProvider>
<App />
</StoreProvider>
)
};
全域變數的使用下篇以更改暱稱來做解釋~