Tri*_*ner 8 firebase reactjs firebase-authentication react-hooks
我正在使用Firebase我的应用程序对用户进行身份验证。我已经创建了SignIn和SignUp表单,并且可以成功创建新用户并使用存储的用户登录。但是,问题出在维护用户之后,保持用户登录状态Reload。
我在教程中看到的方式是使用HOC类似以下内容的命令检查当前用户是否已登录。
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;
Run Code Online (Sandbox Code Playgroud)
但是,我希望使用新版React Hooks本来消除对的需要HOCs。我已经withFirebase() HOC通过使用React Context和useContext(FirebaseContext)访问的单个实例删除了Firebase。有没有使用新的方式hooks来模拟这个withAuthentication HOC范围内components,我创造?
我正在使用本教程
https://www.robinwieruch.de/complete-firebase-authentication-react-tutorial/
标题为“使用高阶组件进行会话处理”的部分包含这一部分。
谢谢!
您可以编写一个Custom Hook注册效果并返回auth状态的
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;
Run Code Online (Sandbox Code Playgroud)
在任何情况下Component都可以像
const MyComponent = (props) => {
const firebase = useContext(FirebaseContext);
const authUser = useFirebaseAuthentication(firebase);
return (...)
}
Run Code Online (Sandbox Code Playgroud)
Index.jsx 将包含此代码
ReactDOM.render(
<FirebaseProvider>
<App />
</FirebaseProvider>,
document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)
该Firebase Provider的定义如下:
import Firebase from './firebase';
const FirebaseContext = createContext();
export const FirebaseProvider = (props) => (
<FirebaseContext.Provider value={new Firebase()}>
{props.children}
</FirebaseContext.Provider>
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |