ฉันกำลังพยายามหาวิธีใช้ผู้ฟัง Firebase เพื่อให้ข้อมูล firestore บนคลาวด์ได้รับการรีเฟรชด้วยการอัพเดต hooks ที่ตอบสนอง
ตอนแรกฉันทำสิ่งนี้โดยใช้องค์ประกอบคลาสที่มีฟังก์ชั่น componentDidMount เพื่อรับข้อมูล firestore
this.props.firebase.db
.collection('users')
// .doc(this.props.firebase.db.collection('users').doc(this.props.firebase.authUser.uid))
.doc(this.props.firebase.db.collection('users').doc(this.props.authUser.uid))
.get()
.then(doc => {
this.setState({ name: doc.data().name });
// loading: false,
});
}
สิ่งนี้จะหยุดลงเมื่อหน้าอัปเดตดังนั้นฉันจึงพยายามหาวิธีย้ายตัวฟังเพื่อโต้ตอบฮุก
ฉันได้ติดตั้งreact-firebase-hooks แล้ว - แม้ว่าฉันไม่สามารถหาวิธีการอ่านคำแนะนำเพื่อให้สามารถใช้งานได้
ฉันมีองค์ประกอบฟังก์ชั่นดังนี้
import React, { useState, useEffect } from 'react';
import { useDocument } from 'react-firebase-hooks/firestore';
import {
BrowserRouter as Router,
Route,
Link,
Switch,
useRouteMatch,
} from 'react-router-dom';
import * as ROUTES from '../../constants/Routes';
import { compose } from 'recompose';
import { withFirebase } from '../Firebase/Index';
import { AuthUserContext, withAuthorization, withEmailVerification, withAuthentication } from '../Session/Index';
function Dashboard2(authUser) {
const FirestoreDocument = () => {
const [value, loading, error] = useDocument(
Firebase.db.doc(authUser.uid),
//firebase.db.doc(authUser.uid),
//firebase.firestore.doc(authUser.uid),
{
snapshotListenOptions: { includeMetadataChanges: true },
}
);
return (
<div>
<p>
{error && <strong>Error: {JSON.stringify(error)}</strong>}
{loading && <span>Document: Loading...</span>}
{value && <span>Document: {JSON.stringify(value.data())}</span>}
</p>
</div>
);
}
}
export default withAuthentication(Dashboard2);
คอมโพเนนต์นี้ถูกหุ้มใน wrapper authUser ที่ระดับเส้นทางดังนี้:
<Route path={ROUTES.DASHBOARD2} render={props => (
<AuthUserContext.Consumer>
{ authUser => (
<Dashboard2 authUser={authUser} {...props} />
)}
</AuthUserContext.Consumer>
)} />
ฉันมีไฟล์ firebase.js ซึ่งเสียบเข้ากับ firestore ดังต่อไปนี้:
class Firebase {
constructor() {
app.initializeApp(config).firestore();
/* helpers */
this.fieldValue = app.firestore.FieldValue;
/* Firebase APIs */
this.auth = app.auth();
this.db = app.firestore();
}
นอกจากนี้ยังกำหนดให้ผู้ฟังทราบเมื่อการเปลี่ยนแปลง authUser:
onAuthUserListener(next, fallback) {
// onUserDataListener(next, fallback) {
return this.auth.onAuthStateChanged(authUser => {
if (authUser) {
this.user(authUser.uid)
.get()
.then(snapshot => {
let snapshotData = snapshot.data();
let userData = {
...snapshotData, // snapshotData first so it doesn't override information from authUser object
uid: authUser.uid,
email: authUser.email,
emailVerified: authUser.emailVerifed,
providerData: authUser.providerData
};
setTimeout(() => next(userData), 0); // escapes this Promise's error handler
})
.catch(err => {
// TODO: Handle error?
console.error('An error occured -> ', err.code ? err.code + ': ' + err.message : (err.message || err));
setTimeout(fallback, 0); // escapes this Promise's error handler
});
};
if (!authUser) {
// user not logged in, call fallback handler
fallback();
return;
}
});
};
จากนั้นในการตั้งค่าบริบท firebase ของฉันฉันมี:
import FirebaseContext, { withFirebase } from './Context';
import Firebase from '../../firebase';
export default Firebase;
export { FirebaseContext, withFirebase };
บริบทถูกตั้งค่าใน wrapper withFirebase ดังนี้:
import React from 'react';
const FirebaseContext = React.createContext(null);
export const withFirebase = Component => props => (
<FirebaseContext.Consumer>
{firebase => <Component {...props} firebase={firebase} />}
</FirebaseContext.Consumer>
);
export default FirebaseContext;
จากนั้นใน HOC ของฉันด้วยการตรวจสอบข้อเท็จจริงฉันมีผู้ให้บริการบริบทดังนี้
import React from 'react';
import { AuthUserContext } from '../Session/Index';
import { withFirebase } from '../Firebase/Index';
const withAuthentication = Component => {
class WithAuthentication extends React.Component {
constructor(props) {
super(props);
this.state = {
authUser: null,
};
}
componentDidMount() {
this.listener = this.props.firebase.auth.onAuthStateChanged(
authUser => {
authUser
? this.setState({ authUser })
: this.setState({ authUser: null });
},
);
}
componentWillUnmount() {
this.listener();
};
render() {
return (
<AuthUserContext.Provider value={this.state.authUser}>
<Component {...this.props} />
</AuthUserContext.Provider>
);
}
}
return withFirebase(WithAuthentication);
};
export default withAuthentication;
ปัจจุบัน - เมื่อฉันลองทำสิ่งนี้ฉันได้รับข้อผิดพลาดในองค์ประกอบ Dashboard2 ที่ระบุว่า:
Firebase 'ไม่ได้ถูกกำหนดไว้
ฉันลอง firebase ตัวพิมพ์เล็กและพบข้อผิดพลาดเดียวกัน
ฉันยังลอง firebase.firestore และ Firebase.firestore ฉันได้รับข้อผิดพลาดเดียวกัน
ฉันสงสัยว่าฉันไม่สามารถใช้ HOC กับองค์ประกอบฟังก์ชั่นได้หรือไม่?
ฉันเห็นแอพตัวอย่างนี้และโพสต์บล็อกนี้แล้ว
ทำตามคำแนะนำในบล็อกฉันสร้าง firebase / contextReader.jsx ใหม่ด้วย:
import React, { useEffect, useContext } from 'react';
import Firebase from '../../firebase';
export const userContext = React.createContext({
user: null,
})
export const useSession = () => {
const { user } = useContext(userContext)
return user
}
export const useAuth = () => {
const [state, setState] = React.useState(() =>
{ const user = firebase.auth().currentUser
return { initializing: !user, user, }
}
);
function onChange(user) {
setState({ initializing: false, user })
}
React.useEffect(() => {
// listen for auth state changes
const unsubscribe = firebase.auth().onAuthStateChanged(onChange)
// unsubscribe to the listener when unmounting
return () => unsubscribe()
}, [])
return state
}
จากนั้นฉันพยายามปิด App.jsx ของฉันในโปรแกรมอ่านนั่นด้วย:
function App() {
const { initializing, user } = useAuth()
if (initializing) {
return <div>Loading</div>
}
// )
// }
// const App = () => (
return (
<userContext.Provider value={{ user }}>
<Router>
<Navigation />
<Route path={ROUTES.LANDING} exact component={StandardLanding} />
เมื่อฉันลองทำสิ่งนี้ฉันได้รับข้อผิดพลาดที่แจ้งว่า:
TypeError: _firebase__WEBPACK_IMPORTED_MODULE_2 __ default.auth ไม่ใช่ฟังก์ชัน
ฉันเห็นโพสต์นี้แล้วจัดการกับข้อผิดพลาดนั้นและได้ลองถอนการติดตั้งและติดตั้งเส้นด้าย มันไม่ต่างอะไรเลย
เมื่อฉันดูแอปสาธิตมันแนะนำบริบทที่ควรสร้างขึ้นโดยใช้วิธีการ 'อินเทอร์เฟซ' ฉันไม่เห็นว่าสิ่งนี้มาจากไหน - ฉันไม่สามารถหาข้อมูลอ้างอิงเพื่ออธิบายในเอกสารประกอบ
ฉันไม่สามารถเข้าใจถึงคำแนะนำอื่น ๆ นอกจากลองใช้สิ่งที่ฉันทำไว้เพื่อเสียบสิ่งนี้
ฉันได้เห็นโพสต์นี้ซึ่งพยายามฟังไฟร์โดยไม่ใช้ react-firebase-hooks คำตอบนั้นกลับไปที่การพยายามหาวิธีใช้เครื่องมือนี้
ฉันได้อ่านคำอธิบายที่ยอดเยี่ยมนี้ซึ่งจะอธิบายวิธีย้ายออกจาก HOCs ไปยังตะขอ ฉันติดอยู่กับวิธีรวมผู้ฟัง firebase เข้าด้วยกัน
ฉันได้เห็นโพสต์นี้ซึ่งให้ตัวอย่างที่เป็นประโยชน์สำหรับวิธีคิดเกี่ยวกับการทำเช่นนี้ ไม่แน่ใจว่าฉันควรพยายามทำสิ่งนี้ใน authListener componentDidMount - หรือในองค์ประกอบ Dashboard ที่พยายามจะใช้
ความพยายามถัดไป ฉันพบโพสต์นี้ซึ่งพยายามแก้ไขปัญหาเดียวกัน
เมื่อฉันพยายามที่จะใช้โซลูชันที่เสนอโดย Shubham Khatri ฉันตั้งค่าการกำหนดค่า firebase ดังนี้:
ผู้ให้บริการบริบทด้วย: import React, {useContext} จาก 'react'; นำเข้า Firebase จาก '../../firebase';
const FirebaseContext = React.createContext();
export const FirebaseProvider = (props) => (
<FirebaseContext.Provider value={new Firebase()}>
{props.children}
</FirebaseContext.Provider>
);
บริบทของ hook นั้นมี:
import React, { useEffect, useContext, useState } from 'react';
const useFirebaseAuthentication = (firebase) => {
const [authUser, setAuthUser] = useState(null);
useEffect(() =>{
const unlisten =
firebase.auth.onAuthStateChanged(
authUser => {
authUser
? setAuthUser(authUser)
: setAuthUser(null);
},
);
return () => {
unlisten();
}
});
return authUser
}
export default useFirebaseAuthentication;
จากนั้นใน index.js ฉันหุ้มแอพไว้ในผู้ให้บริการดังนี้:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App/Index';
import {FirebaseProvider} from './components/Firebase/ContextHookProvider';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
<FirebaseProvider>
<App />
</FirebaseProvider>,
document.getElementById('root')
);
serviceWorker.unregister();
จากนั้นเมื่อฉันพยายามใช้ฟังในองค์ประกอบฉันมี:
import React, {useContext} from 'react';
import { FirebaseContext } from '../Firebase/ContextHookProvider';
import useFirebaseAuthentication from '../Firebase/ContextHook';
const Dashboard2 = (props) => {
const firebase = useContext(FirebaseContext);
const authUser =
useFirebaseAuthentication(firebase);
return (
<div>authUser.email</div>
)
}
export default Dashboard2;
และฉันพยายามใช้เป็นเส้นทางโดยไม่มีส่วนประกอบหรือ wrapper auth:
<Route path={ROUTES.DASHBOARD2} component={Dashboard2} />
เมื่อฉันลองทำสิ่งนี้ฉันได้รับข้อผิดพลาดที่แจ้งว่า:
ข้อผิดพลาดในการนำเข้าที่พยายาม: 'FirebaseContext' ไม่ได้ถูกส่งออกจาก '../Firebase/ContextHookProvider'
ข้อความแสดงข้อผิดพลาดนั้นสมเหตุสมผลเพราะ ContextHookProvider ไม่ส่งออก FirebaseContext - ส่งออก FirebaseProvider - แต่ถ้าฉันไม่พยายามนำเข้าสิ่งนี้ใน Dashboard2 - ฉันไม่สามารถเข้าถึงได้ในฟังก์ชั่นที่พยายามจะใช้
ผลข้างเคียงหนึ่งของความพยายามนี้คือวิธีการสมัครใช้งานของฉันไม่ทำงานอีกต่อไป ตอนนี้จะสร้างข้อความแสดงข้อผิดพลาดที่แจ้งว่า:
TypeError: ไม่สามารถอ่านคุณสมบัติ 'doCreateUserWithEmailAndPassword' ของ null
ฉันจะแก้ปัญหานี้ในภายหลัง - แต่จะต้องมีวิธีที่จะคิดออกว่าจะใช้การตอบสนองกับ firebase ที่ไม่เกี่ยวข้องกับเดือนของวงนี้ผ่านทางหลายล้านที่ไม่ทำงานเพื่อให้ได้รับการตั้งค่าการตรวจสอบขั้นพื้นฐาน มีชุดเริ่มต้นสำหรับ firebase (firestore) ที่ใช้งานร่วมกับ hooks ได้หรือไม่?
ความพยายามครั้งต่อไป ฉันพยายามทำตามวิธีการในหลักสูตร udemyนี้- แต่ใช้เพื่อสร้างรูปแบบการป้อนข้อมูลเท่านั้น - ไม่มีผู้ฟังวางเส้นทางเพื่อปรับกับผู้ใช้ที่ได้รับการรับรองความถูกต้อง
ฉันพยายามติดตามวิธีการในบทช่วยสอน youtubeนี้- ซึ่งมีrepoนี้ใช้งานได้ มันแสดงให้เห็นถึงวิธีการใช้ hooks แต่ไม่ใช่วิธีการใช้บริบท
ความพยายามต่อไป ฉันพบrepo นี้ดูเหมือนจะมีวิธีคิดที่ดีในการใช้ hooks กับ firestore อย่างไรก็ตามฉันไม่สามารถเข้าใจรหัสได้
ฉันโคลนสิ่งนี้ - และพยายามเพิ่มไฟล์สาธารณะทั้งหมดและเมื่อฉันเรียกใช้ - ฉันไม่สามารถรับรหัสเพื่อใช้งานได้ ฉันไม่แน่ใจว่าสิ่งที่หายไปจากคำแนะนำสำหรับวิธีการทำงานนี้เพื่อดูว่ามีบทเรียนในรหัสที่สามารถช่วยแก้ปัญหานี้ได้หรือไม่
ความพยายามต่อไป
ฉันซื้อเทมเพลต divjoy ซึ่งโฆษณาว่าตั้งค่าไว้สำหรับ firebase (มันไม่ได้ติดตั้งสำหรับ firestore ในกรณีที่คนอื่นกำลังพิจารณาสิ่งนี้เป็นตัวเลือก)
เทมเพลตนั้นเสนอ wrapper การรับรองความถูกต้องที่เริ่มต้นการกำหนดค่าของแอป - แต่สำหรับวิธีการรับรองความถูกต้อง - ดังนั้นจึงต้องมีการปรับโครงสร้างใหม่เพื่อให้ผู้ให้บริการบริบทรายอื่นได้รับการยืนยัน เมื่อคุณยุ่งเหยิงในกระบวนการนั้นและใช้กระบวนการที่แสดงในโพสต์นี้สิ่งที่เหลืออยู่คือข้อผิดพลาดในการติดต่อกลับดังต่อไปนี้:
useEffect(() => {
const unsubscribe = firebase.auth().onAuthStateChanged(user => {
if (user) {
setUser(user);
} else {
setUser(false);
}
});
ไม่ทราบว่า firebase คืออะไร นั่นเป็นเพราะมันถูกกำหนดไว้ในผู้ให้บริการบริบท firebase ซึ่งนำเข้าและกำหนด (ในฟังก์ชั่น useProvideAuth ()) เป็น:
const firebase = useContext(FirebaseContext)
ข้อผิดพลาดแจ้งว่า: ไม่มีโอกาสที่จะโทรกลับ
React Hook useEffect มีการพึ่งพาที่ขาดหายไป: 'firebase' อาจรวมมันหรือลบอาร์เรย์การพึ่งพา
หรือถ้าฉันลองและเพิ่ม const นั้นในการติดต่อกลับฉันได้รับข้อผิดพลาดที่แจ้งว่า:
React Hook ไม่สามารถเรียกใช้ "useContext" ในการติดต่อกลับได้ React Hooks จะต้องถูกเรียกในองค์ประกอบของฟังก์ชั่น React หรือฟังก์ชั่น React Hook ที่กำหนดเอง
ความพยายามต่อไป
ฉันลดไฟล์การกำหนดค่า firebase ลงไปเป็นเพียงตัวแปรการตั้งค่า (ฉันจะเขียนผู้ช่วยเหลือในผู้ให้บริการบริบทสำหรับแต่ละบริบทที่ฉันต้องการใช้)
import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
const devConfig = {
apiKey: process.env.REACT_APP_DEV_API_KEY,
authDomain: process.env.REACT_APP_DEV_AUTH_DOMAIN,
databaseURL: process.env.REACT_APP_DEV_DATABASE_URL,
projectId: process.env.REACT_APP_DEV_PROJECT_ID,
storageBucket: process.env.REACT_APP_DEV_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_DEV_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_DEV_APP_ID
};
const prodConfig = {
apiKey: process.env.REACT_APP_PROD_API_KEY,
authDomain: process.env.REACT_APP_PROD_AUTH_DOMAIN,
databaseURL: process.env.REACT_APP_PROD_DATABASE_URL,
projectId: process.env.REACT_APP_PROD_PROJECT_ID,
storageBucket: process.env.REACT_APP_PROD_STORAGE_BUCKET,
messagingSenderId:
process.env.REACT_APP_PROD_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_PROD_APP_ID
};
const config =
process.env.NODE_ENV === 'production' ? prodConfig : devConfig;
class Firebase {
constructor() {
firebase.initializeApp(config);
this.firebase = firebase;
this.firestore = firebase.firestore();
this.auth = firebase.auth();
}
};
export default Firebase;
ฉันมีผู้ให้บริการบริบทรับรองความถูกต้องดังนี้:
import React, { useState, useEffect, useContext, createContext } from "react";
import Firebase from "../firebase";
const authContext = createContext();
// Provider component that wraps app and makes auth object ...
// ... available to any child component that calls useAuth().
export function ProvideAuth({ children }) {
const auth = useProvideAuth();
return <authContext.Provider value={auth}>{children}</authContext.Provider>;
}
// Hook for child components to get the auth object ...
// ... and update when it changes.
export const useAuth = () => {
return useContext(authContext);
};
// Provider hook that creates auth object and handles state
function useProvideAuth() {
const [user, setUser] = useState(null);
const signup = (email, password) => {
return Firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then(response => {
setUser(response.user);
return response.user;
});
};
const signin = (email, password) => {
return Firebase
.auth()
.signInWithEmailAndPassword(email, password)
.then(response => {
setUser(response.user);
return response.user;
});
};
const signout = () => {
return Firebase
.auth()
.signOut()
.then(() => {
setUser(false);
});
};
const sendPasswordResetEmail = email => {
return Firebase
.auth()
.sendPasswordResetEmail(email)
.then(() => {
return true;
});
};
const confirmPasswordReset = (password, code) => {
// Get code from query string object
const resetCode = code || getFromQueryString("oobCode");
return Firebase
.auth()
.confirmPasswordReset(resetCode, password)
.then(() => {
return true;
});
};
// Subscribe to user on mount
useEffect(() => {
const unsubscribe = firebase.auth().onAuthStateChanged(user => {
if (user) {
setUser(user);
} else {
setUser(false);
}
});
// Subscription unsubscribe function
return () => unsubscribe();
}, []);
return {
user,
signup,
signin,
signout,
sendPasswordResetEmail,
confirmPasswordReset
};
}
const getFromQueryString = key => {
return queryString.parse(window.location.search)[key];
};
ฉันยังทำผู้ให้บริการบริบท firebase ดังนี้:
import React, { createContext } from 'react';
import Firebase from "../../firebase";
const FirebaseContext = createContext(null)
export { FirebaseContext }
export default ({ children }) => {
return (
<FirebaseContext.Provider value={ Firebase }>
{ children }
</FirebaseContext.Provider>
)
}
จากนั้นใน index.js ฉันหุ้มแอปในผู้ให้บริการฐานข้อมูล
ReactDom.render(
<FirebaseProvider>
<App />
</FirebaseProvider>,
document.getElementById("root"));
serviceWorker.unregister();
และในรายการเส้นทางของฉันฉันได้ห่อเส้นทางที่เกี่ยวข้องในผู้ให้บริการรับรองความถูกต้อง:
import React from "react";
import IndexPage from "./index";
import { Switch, Route, Router } from "./../util/router.js";
import { ProvideAuth } from "./../util/auth.js";
function App(props) {
return (
<ProvideAuth>
<Router>
<Switch>
<Route exact path="/" component={IndexPage} />
<Route
component={({ location }) => {
return (
<div
style={{
padding: "50px",
width: "100%",
textAlign: "center"
}}
>
The page <code>{location.pathname}</code> could not be found.
</div>
);
}}
/>
</Switch>
</Router>
</ProvideAuth>
);
}
export default App;
ในความพยายามเฉพาะนี้ฉันกลับไปที่ปัญหาที่ตั้งค่าสถานะไว้ก่อนหน้านี้ด้วยข้อผิดพลาดนี้:
TypeError: _firebase__WEBPACK_IMPORTED_MODULE_2 __ default.auth ไม่ใช่ฟังก์ชัน
มันชี้ไปที่บรรทัดของผู้ให้บริการรับรองความถูกต้องว่าเป็นการสร้างปัญหา:
useEffect(() => {
const unsubscribe = firebase.auth().onAuthStateChanged(user => {
if (user) {
setUser(user);
} else {
setUser(false);
}
});
ฉันได้ลองใช้ตัวพิมพ์ใหญ่ F ใน Firebase และสร้างข้อผิดพลาดเดียวกัน
เมื่อฉันลองทำตามคำแนะนำของ Tristan ฉันจะลบสิ่งเหล่านั้นทั้งหมดและลองและกำหนดวิธีการยกเลิกการสมัครของฉันเป็นวิธีที่ไม่แสดง (ฉันไม่รู้ว่าทำไมเขาไม่ใช้ภาษา firebase - แต่ถ้าวิธีของเขาใช้งานได้ฉันจะพยายามให้มากขึ้น เพื่อหาสาเหตุ) เมื่อฉันพยายามใช้วิธีแก้ปัญหาข้อความแสดงข้อผิดพลาดแจ้งว่า:
TypeError: _util_contexts_Firebase__WEBPACK_IMPORTED_MODULE_8 ___ ค่าเริ่มต้น (... ) ไม่ใช่ฟังก์ชัน
คำตอบสำหรับโพสต์นี้แนะนำให้ลบ () จากหลังจากรับรองความถูกต้อง เมื่อฉันลองฉันจะได้รับข้อผิดพลาดที่แจ้งว่า:
TypeError: ไม่สามารถอ่านคุณสมบัติ 'onAuthStateChanged' ของที่ไม่ได้กำหนด
อย่างไรก็ตามโพสต์นี้แนะนำปัญหาเกี่ยวกับวิธีการนำเข้าฐานข้อมูลในไฟล์รับรองความถูกต้อง
ฉันได้นำเข้าเป็น: import Firebase จาก "../firebase";
Firebase เป็นชื่อของคลาส
วิดีโอ Tristan แนะนำเป็นพื้นหลังที่เป็นประโยชน์ แต่ตอนนี้ฉันอยู่ตอนที่ 9 และยังไม่พบส่วนที่ควรจะช่วยแก้ปัญหานี้ ไม่มีใครรู้ว่าจะหาได้ที่ไหน?
NEXT ATTEMPT ถัดไป - และพยายามแก้ไขปัญหาบริบทเท่านั้น - ฉันได้นำเข้าทั้ง createContext และ useContext และพยายามใช้ดังที่แสดงในเอกสารนี้
ฉันไม่สามารถรับข้อผิดพลาดที่แจ้งว่า:
ข้อผิดพลาด: การโทรขอไม่ถูกต้อง สามารถเรียกใช้ Hooks ได้เฉพาะภายในร่างกายของส่วนประกอบฟังก์ชันเท่านั้น สิ่งนี้อาจเกิดขึ้นได้จากสาเหตุใดสาเหตุหนึ่งต่อไปนี้: ...
ฉันได้รับคำแนะนำในลิงค์นี้แล้วเพื่อลองและแก้ไขปัญหานี้และไม่สามารถเข้าใจได้ ฉันไม่มีปัญหาใด ๆ ที่แสดงในคู่มือการแก้ไขปัญหานี้
ปัจจุบัน - คำสั่งบริบทมีลักษณะดังนี้:
import React, { useContext } from 'react';
import Firebase from "../../firebase";
export const FirebaseContext = React.createContext();
export const useFirebase = useContext(FirebaseContext);
export const FirebaseProvider = props => (
<FirebaseContext.Provider value={new Firebase()}>
{props.children}
</FirebaseContext.Provider>
);
ฉันใช้เวลาในการใช้หลักสูตร udemyนี้เพื่อลองและวิเคราะห์องค์ประกอบบริบทและ hooks ของปัญหานี้ - หลังจากดูแล้ว - สิ่งเดียวที่โซลูชันเสนอโดย Tristan ด้านล่างคือวิธี createContext ไม่ได้เรียกอย่างถูกต้องในโพสต์ของเขา มันต้องเป็น "React.createContext" แต่ก็ยังไม่ใกล้ที่จะแก้ปัญหา
ฉันยังคงติดอยู่
ทุกคนสามารถเห็นสิ่งที่ผิดพลาดที่นี่?
export
ไปexport const FirebaseContext
?