先看效果



分析代码我们会发现,它使用了firebase

关于登陆部分应该是实时数据库,应该是他们后端校验的

//app.js
//这里使用了实时数据库
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import firebase from '@firebase/app'
import '@firebase/auth'
import reducers from './reducers';
import LoginForm from './components/LoginForm';
import ReduxThunk from 'redux-thunk';
import Router from './Router'; class App extends Component { componentWillMount() {
const config = {
apiKey: "AIzaSyCjISFhbzv3O7pYWoF2T9_jAitNz7LuOkI",
authDomain: "manager-007.firebaseapp.com",
databaseURL: "https://manager-007.firebaseio.com",
projectId: "manager-007",
storageBucket: "manager-007.appspot.com",
messagingSenderId: "374905155600"
};
firebase.initializeApp(config);
} render() {
const store= createStore(reducers, {}, applyMiddleware(ReduxThunk));
return (
<Provider store = {store} >
<Router/>
</Provider>
);
}
} export default App;
//router.js
import React from 'react';
import { Scene, Router, Actions } from 'react-native-router-flux';
import LoginForm from './components/LoginForm';
import EmployeeList from './components/EmployeeList'
import EmployeeCreate from './components/EmployeeCreate'; const RouterComponent = () => {
return(
<Router>
<Scene key="root" hideNavBar>
<Scene key="auth">
<Scene key="login" component={LoginForm} title="Login" initial/>
</Scene>
<Scene key="main">
<Scene
rightTitle="Add"
onRight={() => Actions.employeeCreate() }
key="employeeList"
component={EmployeeList}
title="Employees"
initial /> <Scene
key="employeeCreate"
component={EmployeeCreate}
title="Create Employee"
/> </Scene> </Scene>
</Router> );
}; export default RouterComponent;
//src/components/LoginForm.js
import React, { Component } from 'react';
import { Text, View } from 'react-native';
import { connect } from 'react-redux';
import { emailChanged, passwordChanged, loginUser } from '../actions';
import { Card, CardSection, Input, Button, Spinner } from './common'; class LoginForm extends Component{ onEmailChange(text){
this.props.emailChanged(text); }
onPasswordChange(text){
this.props.passwordChanged(text);
}
onButtonPress(){
const {email, password } = this.props;
this.props.loginUser({ email, password});
} renderButton()
{
if(this.props.loading)
{
return <Spinner size="large"/>
} return(
<Button onPress={this.onButtonPress.bind(this)}>
Login
</Button>
); } renderError(){
if(this.props.error)
{
return(
<View style={{ backgroundColor: 'white'}}>
<Text style={styles.errorTextStyle}>
{this.props.error}
</Text>
</View>
);
}
} render(){
return (
<Card> <CardSection>
<Input placeholder="Email"
onChangeText={this.onEmailChange.bind(this)}
value={this.props.email}
/>
</CardSection> <CardSection>
<Input
secureTextEntry placeholder="Password"
onChangeText={this.onPasswordChange.bind(this)}
value={this.props.password}
/>
</CardSection> {this.renderError()} <CardSection>
{this.renderButton()}
</CardSection> </Card>
);
}
} const styles = {
errorTextStyle: {
fontSize: 20,
alignSelf: 'center',
color: 'red'
}
} const mapStateToProps = state => {
return {
email: state.auth.email,
password: state.auth.password,
error : state.auth.error,
loading : state.auth.loading
};
};
export default connect(mapStateToProps, { emailChanged, passwordChanged, loginUser })( LoginForm);
//src/components/ListItem.js
import React, { Component } from 'react'; import { Text , TouchableWithoutFeedback, View } from 'react-native'; import { CardSection } from './common';
import { Actions } from 'react-native-router-flux'; class ListItem extends Component { onRowPress() {
Actions.employeeCreate();
}
render() {
const { name } = this.props.employee; return (
<TouchableWithoutFeedback onPress={this.onRowPress.bind(this)}>
<View>
<CardSection>
<Text style ={styles.titleStyle}>
{name}
</Text>
</CardSection>
</View>
</TouchableWithoutFeedback> );
}
} const styles = {
titleStyle:{
fontSize: 18,
paddingLeft: 15
}
} export default ListItem;
//src/components/EmployeeList.js
import _ from 'lodash';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { ListView} from 'react-native';
import { employeesFetch } from '../actions'
import ListItem from './ListItem'; class EmployeeList extends Component {
componentWillMount(){
this.props.employeesFetch();
this.createDataSource(this.props); } componentWillReceiveProps(nextProps){ this.createDataSource(nextProps); } createDataSource({ employees}) {
const ds = new ListView.DataSource({
rowHasChanged: (r1,r2) => r1 !== r2
}); this.dataSource = ds.cloneWithRows(employees); }
renderRow( employee){
return <ListItem employee = {employee} />
} render() {
return(
<ListView
enableEmptySections
dataSource={this.dataSource}
renderRow= {this.renderRow}
/> );
}
} const mapStateToProps = state => {
const employees = _.map(state.employees, (val, uid) => {
return { ...val, uid};
}); return { employees }; }; export default connect(mapStateToProps, {employeesFetch}) (EmployeeList);

import React, { Component } from 'react';
import { Picker, Text } from 'react-native';
import { connect } from 'react-redux';
import { employeeUpdate,employeeCreate } from '../actions';
import {Card, CardSection, Input, Button } from './common'; class EmployeeCreate extends Component{
onButtonPress(){
const {name, phone, shift } = this.props;
this.props.employeeCreate({name, phone, shift: shift || 'Monday'});
}
render() {
return(
<Card>
<CardSection>
<Input
label="Name"
placeholder="Shajedul"
value={this.props.name}
onChangeText={text => this.props.employeeUpdate({prop:'name', value: text})}
/>
</CardSection> <CardSection>
<Input
label="Phone"
placeholder="01628734916"
value={this.props.phone}
onChangeText={text => this.props.employeeUpdate({prop:'phone', value: text})}
/>
</CardSection>
<Text style={styles.pickerTextStyle}>Shift</Text>
<CardSection > <Picker
style={{ flex: 1 }}
selectedValue={this.props.shift}
onValueChange={day => this.props.employeeUpdate({prop: 'shift', value: day})}
>
<Picker.Item label="Monday" value="Monday" />
<Picker.Item label="Tuesday" value="Tuesday" />
<Picker.Item label="Wednesday" value="Wednesday" />
<Picker.Item label="Thursday" value="Thursday" />
<Picker.Item label="Friday" value="Friday" />
<Picker.Item label="Saturday" value="Saturday" />
<Picker.Item label="Sunday" value="Sunday" />
</Picker>
</CardSection> <CardSection>
<Button onPress={this.onButtonPress.bind(this)}>
Create
</Button>
</CardSection>
</Card>
);
}
} const styles = {
pickerTextStyle: {
fontSize: 18,
paddingLeft: 18,
paddingTop: 5,
paddingBottom: 5 }
} const mapStateToProps = (state) => {
const { name, phone, shift } = state.employeeForm;
return { name, phone, shift };
}; export default connect(mapStateToProps, { employeeUpdate, employeeCreate }) (EmployeeCreate);

在action中的处理

import firebase from '@firebase/app';
import '@firebase/auth'
import '@firebase/database'
import { Actions } from 'react-native-router-flux';
import {
EMPLOYEE_UPDATE,
EMPLOYEE_CREATE,
EMPLOYEES_FETCH_SUCCESS
} from './types'; export const employeeUpdate = ({ prop, value }) => {
return {
type: EMPLOYEE_UPDATE,
payload: {prop, value}
}; }; export const employeeCreate = ({ name, phone, shift }) => {
const { currentUser } = firebase.auth(); return(dispatch) =>
{ firebase.database().ref(`/users/${currentUser.uid}/employees`)
.push({ name, phone, shift })
.then(() =>
{
dispatch({ type: EMPLOYEE_CREATE});
Actions.pop();
});
}; }; export const employeesFetch = () =>{
const { currentUser } = firebase.auth();
return(dispatch) => {
firebase.database().ref(`/users/${currentUser.uid}/employees`)
.on('value', snapshot => {
dispatch({ type: EMPLOYEES_FETCH_SUCCESS, payload: snapshot.val() });
});
};
};

用的redux还是有些复杂啊~

项目地址:https://github.com/shajedulislam/LoginScreen_Firabase_ReactNativeApp_Redux

【水滴石穿】LoginScreen_Firabase_ReactNativeApp_Redux的更多相关文章

  1. iOS 开发笔记 -- 各种细枝末节的知识(水滴石穿)

    在此总结整理,遇到的各种的小问题: 1.通过从字典(数组)中取出的NSString的length==0 作为if的判断条件导致的carsh: 由于在字典中通过Key取出值之后直接做了length相关操 ...

  2. 【水滴石穿】react-native-book

    先推荐一个学习的地址:https://ke.qq.com/webcourse/index.html#cid=203313&term_id=100240778&taid=12778558 ...

  3. 【水滴石穿】rnTest

    其实就是一个小的demo,不过代码分的挺精巧的 先放地址:https://github.com/linchengzzz/rnTest 来看看效果 确实没有什么可以说的,不过代码部分还行 先入口文件 / ...

  4. 【水滴石穿】rn_statusbar

    先放项目地址https://github.com/hezhii/rn_statusbar 来看一下效果 咩有感觉很怎么样,看代码 根入口文件 //index.js //看代码我们知道入口是app.js ...

  5. 【水滴石穿】react-native-ble-demo

    项目的话,是想打开蓝牙,然后连接设备 点击已经连接的设备,我们会看到一些设备 不过我这边在开启蓝牙的时候报错了 先放作者的项目地址: https://github.com/hezhii/react-n ...

  6. 【水滴石穿】ReactNative-Redux-Thunk

    老实说,运行出来的项目让人失望,毕竟我想看各种有趣的demo啊- 先放上源码地址:https://github.com/ludejun/ReactNative-Redux-Thunk 我们来一起看看代 ...

  7. 【水滴石穿】mobx-todos

    我觉得代码在有些程序员手里,就好像是画笔,可以创造很多东西 不要觉得创意少就叫没有创意,每天进步一点点,世界更美好 首先源码地址为:https://github.com/byk04712/mobx-t ...

  8. 【水滴石穿】ReactNativeMobxFrame

    项目地址如下:https://github.com/FTD-ZF/ReactNativeMobxFrame 应该可以说的是,项目也只是一个花架子,不过底部的tab稍微改变了 我们一起来看代码 //in ...

  9. 【水滴石穿】react-native-aze

    说个题外话,早上打开电脑的时候,电脑变成彩色的了,锅是我曾经安装的一个chrome扩展,没有经过我的同意开启了 (也许是昨天迷迷糊糊开启了) 上午运行项目都不成功,还以为被黑客攻击了---然后下午就排 ...

随机推荐

  1. List -- 变更列表

    1,一些常见的内建函数 L.append # 加一个 L.extend # 加一串 L.insert(index, item) #固定位置插入 L.[index : index] = sequence ...

  2. 使用 top instance 命令查看运行中 MaxCompute 作业

    我们都知道,在 MaxCompute Console 里,可以使用下面的命令来列出运行完成的 instance 列表. show p|proc|processlist [from <yyyy-M ...

  3. IDEA修改Servlet代码模板

  4. 洛谷p1605--迷宫 经典dfs

    https://www.luogu.org/problemnew/show/P1605 用这种题来复习一下dfs 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问 ...

  5. SpringBooot- 访问时,默认有弹出认证

    SpringBooot- 访问时,默认有弹出认证 springboot启动成功后,访问请求时,默认弹出窗口,需登录认证. 原因: 是由于使用了springsecurity的默认安全策略,解决方案:启动 ...

  6. 如何理解张量tensor

    1 关于张量的四种定义 “张量”在不同的运用场景下有不同的定义. 第一个定义,张量是多维数组,这个定义常见于各种人工智能软件.听起来还好理解.--本文仅解释此种 2 多维数组 从第一个定义:张量是多维 ...

  7. Codeforces 142B(二分染色、搜索)

    要点 会发现本质上棋盘分成了若干个独立集,本集合内的点放不放棋子并不影响其他集合内的 集合的划分方式就是满棋盘跳马步直到全跳过了,然后每个集合就分成两队,我们选人多的那队放棋子,人少那队当禁区 con ...

  8. vue项目 安装和配置sass & main.js引入scss文件报错

    通过npm 安装 cnpm install --save-dev sass-loader cnpm install --save-dev node-sass 在build文件夹下的webpack.ba ...

  9. vue组件与路由的使用步骤

    router:根据不同的地址跳转到不同的页面一.vue-router的使用 1.下载路由模块      npm vue-router --save 2.在router.js中 先引入路由    imp ...

  10. WebGis二次开发包实例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs& ...