#概要
createContextで生成したコンテキストの初期値に非同期で取得したデータを入れたいです。
#コード
interface ContextProps { Login:boolean, UID:string, ExamStatus: string, userID: string, FamilyName: string, GivenName: string, } const initialObject = { Login: false, UID: '', ExamStatus: '', userID: '', FamilyName: '', GivenName: '' } export const LoginContext = React.createContext<[ContextProps, (arg0: ContextProps)=>void]>([ initialObject, () => {}, ]); export default function LoginContextProvider(props:any){ const userInfo = userPool.getCurrentUser(); const [state, setAuth] = React.useState(()=>{ if(userInfo){ return({ ...initialObject, Login: true, UID: userInfo.getUsername(), FamilyName: '', GivenName: '' }) }else{ return({ ...initialObject, }) } }) React.useEffect(()=>{ const r_data = { FamilyName:'', GivenName: '' } async function fetch(){ await Amplify.API.get("API","/items/object/CustomerData/"+state.UID,{headers:{},response: true}) .then((res:any) => { setAuth({ ...state, ...r_data, ExamStatus: res.data.Status, userID: res.data.UserName }) }) } if(userInfo){ userInfo.getSession(()=>{}) userInfo.getUserAttributes((_,attr):any=>{ if(attr){ r_data.FamilyName = attr!.find((val) => val.getName() === "family_name")!.getValue(); r_data.GivenName = attr!.find((val) => val.getName() === "family_name")!.getValue(); } }) fetch() } },[]) console.log(state) return( <LoginContext.Provider value={[state, setAuth]}> {props.children} </LoginContext.Provider> )
#抱えている問題
APIがPromiseになっている為、useEffectで囲んで使用しています。これを下記のように初期化を行った時に入っている状態にしたいのですが、コールバックの中にuseEffectを定義出来ない為、困っています。
const [state, setAuth] = React.useState(()=>{ if(userInfo){ return({ ...initialObject, Login: true, UID: userInfo.getUsername(), FamilyName: '', GivenName: '' }) //ここにAPIから取得したデータを入れたい } })
アドバイスお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/13 06:40