【发布时间】:2020-09-14 10:56:38
【问题描述】:
我坚持使用 Firebase 身份验证。这就是问题所在。
- 我有两个组件登录和应用程序。第一个只是呈现带有登录名和密码输入的表单。第二个包含路由器和登录组件的功能。
- 在路由器中,我有下一个逻辑:如果用户登录,则呈现具有自动访问权限的页面,否则呈现登录页面。
- 第一次一切正常,我创建了新用户,它被添加到 firebase,我被重定向到私人页面。
- 麻烦。现在登录页面加载正常,但在我在其中一个输入应用程序中输入任何内容后,我会将我重定向到私人页面。每个输入都是受控元素,因此我在输入中键入的每个符号都会更改状态并导致重新渲染。但我不明白为什么它会将我重定向到私人页面。
我希望它以另一种方式工作:如果用户已登录应用程序根本不应该向他显示腰部页面,如果用户未登录应用程序应该只向他显示登录页面。
为什么应用会以这种方式工作以及如何解决?
App.js
import React, {Component} from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
import { Layout } from 'antd';
import AddStock from './components/stocksDB/addStock';
import { Typography, Menu } from 'antd';
import 'antd/dist/antd.css';
import './App.css';
import AddClient from './components/clients/addClient.js';
import PifForm from './components/clients/pif/pifForm';
import KuaForm from './components/clients/pif/kuaForm';
import firebase from './firebase.js';
import {Login} from './components/login.js'
const { Title } = Typography;
const {Header, Footer, Content} = Layout;
class App extends Component {
constructor(props){
super(props);
this.state = {
login: '',
password: ''
}
}
handleChange = (event) => {
const target = event.target;
const name = target.name;
this.setState({
[name]: target.value
}, () => {console.log(name, this.state)})
};
signUp = () => {
firebase.auth().createUserWithEmailAndPassword(this.state.login, this.state.password).catch(function(error) {
console.log(error);
})
};
signIn = () => {
firebase.auth().signInWithEmailAndPassword(this.state.login, this.state.password).catch(function(error) {
console.log(error);
})
};
onFinishFailed = errorInfo => {
console.log('Failed:', errorInfo);
};
render() {
let user = firebase.auth().currentUser;
if (user) {
return (
<Router>
<Layout theme='dark'>
<Header mode="horizontal">
<div className='header-wrapper'>
<Title level={2} style={{"color": "rgb(166 173 180)"}}>Оберіть функцію:</Title>
<Menu theme="dark" mode="horizontal" defaultSelectedKeys={['2']}>
<Menu.Item key="1">
<Link to='/stocksList'>Довідник ЦП</Link>
</Menu.Item>
<Menu.Item key="2">
<Link to='/addClients'>Довідник клієнтів</Link>
</Menu.Item>
</Menu>
</div>
</Header>
<Content>
<Switch>
<Route path="/stocksList">
<AddStock/>
</Route>
<Route path="/addClients">
<AddClient/>
</Route>
<Route path="/kuaForm">
<KuaForm/>
</Route>
<Route path="/pifForm">
<PifForm/>
</Route>
</Switch>
</Content>
<Footer>Footer</Footer>
</Layout>
</Router>
)
} else {
return (
<Login signIn={this.signIn} onFinishaedFailed={this.onFinishFailed} handleChange={this.handleChange} signUp={this.signUp} />
)
}
}
}
export default App;
login.js
import React from 'react';
import { Form, Input, Button } from 'antd';
import { Typography } from 'antd';
const { Title } = Typography;
export const Login = (props) => {
const layout = {
labelCol: { span: 8 },
wrapperCol: { span: 16 },
};
const tailLayout = {
wrapperCol: { offset: 8, span: 16 },
};
return (
<div>
<Title level={2} style={{ "color": "rgb(166 173 180)" }}>Для продовження роботи пройдіть автентифікацію.</Title>
<Form
{...layout}
name="basic"
initialValues={{ remember: true }}
onFinish={props.signIn}
onFinishFailed={props.onFinishFailed}
>
<Form.Item
label="Username"
name="username"
rules={[{ required: true, message: 'Please input your username!' }]}
>
<Input name='login' onChange={props.handleChange}/>
</Form.Item>
<Form.Item
label="Password"
name="password"
rules={[{ required: true, message: 'Please input your password!' }]}
>
<Input.Password name='password' onChange={props.handleChange} />
</Form.Item>
<Form.Item {...tailLayout}>
<Button type="primary" htmlType="submit">
Увійти
</Button>
<Button type="primary" htmlType="button" onClick={props.signUp} >
Зареєструватися
</Button>
</Form.Item>
</Form>
</div>
);
};
【问题讨论】:
标签: javascript reactjs firebase firebase-authentication