澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

澳门直营react-native-dva-starter: 集成 dva 和 react-navigation 规范应用项景的 React Native 实例

现行反革命的花色要求相当粗略,当步入三个页面包车型大巴时候,要是没登陆,则跳转到登入页面,假诺登陆了则直接到相应页面。

澳门直营,react项目中落实登入注册简单凶横感悟

前言

本课程是应用 create-react-native-app 创造基于 dva,react-native,antd 的 react-navigation 综合案例

有关的 react-navigation的安顿请参照他事他说加以考查
上边用到了 修饰器 @connect(卡塔尔 请参照他事他说加以考查 阮大伯的教程 http://es6.ruanyifeng.com/
后生可畏旦对 dva 不是很领悟 请仿照效法
或然官方文档https://github.com/Sawyer-china/dva
正文案例地址:https://github.com/Sawyer-china/react-navigation-dva-antd
现行反革命咱们就从头一步一步的创设 如遇到难点可 增多 qq群:218618405 进行咨询

koa2写的花色,使用koa-passport,koa-session,依照koa-passport的

全局安装react官方推荐脚手架 create-react-app

倘令你感到该随笔对您有扶持加个向往,github 加个 start 多谢
isAuthenticated()来判断是否登录。

这篇文章写的很好:===》https://segmentfault.com/a/1190000011557953

我的其中一个路由代码;
controllers:

exports.renderUserList = async (ctx, next) => {
    if (ctx.isAuthenticated()) {
        console.log(ctx.state.user)
        console.log(ctx)
        let data = await userDao.userList()
        await ctx.render('userList', {
            title: '员工列表',
            csrf: ctx.csrf,
            data: data
        })
    }else {
        ctx.redirect('/login')
    }
}
npm install create-react-app -g

1. 开立项目 react-native-dva-antd

澳门网上唯一授权赌城,create-react-native-app 的设置格局本人就不在演说,假设有标题应接 + QQ群举行讯问

$ create-react-native-app react-native-dva-antd

跻身工程目录

$ cd react-native-dva-antd 

运行

$ yarn start  
// 如果遇到管理员权限问题:
// error: EACCES: permission denied, open '/Users/ectouch/.expo/log'  
// 使用 sudo yarn start

应用 expo 扫码查看项目运维效果

router.js:

创建react项目

2. 引进我们须求的底蕴包

$ yarn add dva react-navigation@1.0.0beta.27 antd-mobile react-redux react-native-vector-icons react-dom --save

注:react-navigation 版本请以 react-navigation@1.0.0beta.27为准,版本高了会有意外的图景时有发生

router.get('/userList', User.renderUserList)
create-react-app react-login-register

3. 创建 Home 页面

在根目录上面成立 containers 的公文夹然后 创制 Home.js 文件 并写入以下代码

import React, { Component } from 'react'
import { StyleSheet, View, Text } from 'react-native'
import { connect } from 'react-redux'
import { Button } from 'antd-mobile'
import Ionicons from 'react-native-vector-icons/Ionicons'

// @connect()  es7 的语法 修饰器 如果对这个不是很了解请看 阮大爷的 教程  http://es6.ruanyifeng.com/
@connect()
class Home extends Component {
    static navigationOptions = {
        title: 'Home',
        tabBarLabel: '首页',
        tabBarIcon: ({ tintColor, focused }) =>
            // focused 当前 tab 被选择  !focused  未被选中
            // tintColor tabNavigator 传入的配置颜色
            <Ionicons
                name={focused ? 'ios-home' : 'ios-home-outline'}
                size={26}
                style={{ color: tintColor }}
            />
    }

    render() {
        return (
            <View style={styles.container}>
                <Text style={{ marginBottom: 20 }}>这是首页</Text>
                <Button type="warning">default</Button>
            </View>
        )
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center'
    },
    icon: {
        width: 32,
        height: 32
    }
})

export default Home

创建 Cart.js, Category.js, Search.js, User.js 页面 请查看
github: https://github.com/Sawyer-china/react-navigation-dva-antd

passport.js:

步向项目并运营

4. 在根目录创立 router.js

import React, { PureComponent } from 'react'
import {
    BackHandler,
    Animated,
    Easing,
    View,
    Text,
    StyleSheet,
    ActivityIndicator
} from 'react-native'

import {
    StackNavigator,
    TabNavigator,
    TabBarBottom,
    addNavigationHelpers
} from 'react-navigation'

import { NavigationActions } from '../utils'

import { connect } from 'react-redux'

import Home from './containers/Home'
import Cart from './containers/Cart'
import User from './containers/User'
import Category from './containers/Category'
import Search from './containers/Search'

const Loading = () =>
    <View style={styles.container}>
        <ActivityIndicator />
    </View>

const styles = StyleSheet.create({
    container: {
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center'
    }
})

const HomeNavigator = TabNavigator(
    {
        Home: { screen: Home },
        Category: { screen: Category },
        Cart: { screen: Cart },
        User: { screen: User }
    },
    {
        tabBarComponent: TabBarBottom,
        tabBarPosition: 'bottom',
        swipeEnabled: false,
        animationEnabled: false,
        lazyLoad: true,
        tabBarOptions: {
            activeTintColor: '#ff0000'
        }
    }
)

const AppNavigation = StackNavigator(
    {
        Home: {
            screen: HomeNavigator
        },
        Search: { screen: Search }
    },
    {
        headerMode: 'screen'
    }
)
@connect(({ router }) => ({ router }))
class Router extends PureComponent {
    render() {
        const { dispatch, app, router } = this.props
        const navigation = addNavigationHelpers({ dispatch, state: router })
        return <AppNavigation navigation={navigation} />
    }
}

export function routerReducer(state, action = {}) {
    return AppNavigation.router.getStateForAction(action, state)
}

export default Router

并创建 models/router.js 的 model 和 utils/dva.js 请参考github 地址
router文件是 router 的相干音信
dva 是启用那一个类型的文本

const passport = require('koa-passport')
const User = require('../models/user')
const log4js = require('koa-log4')
const logger = log4js.getLogger('passport')
const LocalStrategy = require('passport-local').Strategy
const md5 = require('md5')

passport.use(new LocalStrategy(
    /**
     * @param username 用户输入的用户名
     * @param password 用户输入的密码
     * @param done 验证验证完成后的回调函数,由passport调用
     */
    function (username, password, done) {
        User.findOne({username: username},function (err,result) {
            if (result !== null) {
                if (result.password === md5(password)) {
                    return done(null, doPassword(result),'登录成功')
                } else {
                    return done(null, false, '密码错误')
                }
            } else {
                return done(null, false, '用户不存在')
            }
        }).catch(function (err) {
            logger.error(err.message)
            return done(null, false, {message: err.message})
        })
    }
))

// serializeUser 在用户登录验证成功以后将会把用户的数据存储到 session 中
passport.serializeUser(function (user, done) {
    done(null, user)
})

// deserializeUser 在每次请求的时候将从 mongodb 中读取用户对象
passport.deserializeUser(function (id, done) {
    console.log(id)
    User.findById(id, function (err, user) {
        done(err, doPassword(user))
    })
    // done(null, user)
})

//隐藏密码,相当于是去掉密码的用户信息保存在session里
function doPassword(user) {
    if(user) {
        user.password = ''
        return user
    } else {
        return null
    }
}

module.exports = passport
npm start

5. 修改 根目录 App.js 文件

import React, { Component } from 'react'

import dva from './utils/dva'
import Router from './router'

// import appModel from './models/app'
import routerModel from './models/router'

const app = dva({
    initialState: {},
    models: [routerModel],
    onError(e) {
        console.log('onError', e)
    }
})

const App = app.start(<Router />)

export default App

 

澳门网上唯一授权赌城 1

6. 什么样进展页面跳转

打开Home.js页面

<Button
    type="warning"
    onClick={() => {
       this.props.dispatch(
            NavigationActions.navigate({ routeName: 'Search' })
       )
    }}
>
    点我到搜索页面
</Button>

 

image.png

6. Ionicons 的运用方式

Ionicons 是叁个字体库 使用办法如下所示:
事实上打包时您要求集成该字体包才或许正确的打包 应用 ,
切切实实用法可百度 react-native-vector-icons

......
import Ionicons from 'react-native-vector-icons/Ionicons' 
// 因为我们在创建项目的时候已经安装了该包了,所以可以直接引入
......
class Home extends Component {
    static navigationOptions = {
        header: null,
        tabBarLabel: '首页',
        tabBarIcon: ({ tintColor, focused }) =>
            // focused 当前 tab 被选择  !focused  未被选中
            // tintColor tabNavigator 传入的配置颜色
            <Ionicons
                name={focused ? 'ios-home' : 'ios-home-outline'}
                size={26}
                style={{ color: tintColor }}
            />
    }
......
}

问题:目前用

设置此demo中各样依赖

7. 在案例中达成登陆退出的基本原理

(登陆页面大家会用到地面存储的效果与利益)
设置有reactnative 粤语网提供的地面存款和储蓄插件

$ npm install react-native-storage --save

创设 app models (在models目录下开创 app.js)

export default {
    namespace: 'app',
    state: {
        isLogin: false // 登录状态
    },
    reducers: {

    },
    effects: {
    }
}
isAuthenticated()来判断是否登录只会在单个路由中分别判断,想问下大家有没有办法可以把这个判断是否登录的方法集成成一个方法,然后每个路由去使用。欢迎大家留言!
  npm install antd-mobile -S  // UI框架
  npm install redux -S  // redux
  npm install react-redux -S  // react-redux
  npm install react-router-dom -S  // react路由
  npm install axios -S // react请求交互
  npm install redux-thunk -S // redux中间件 配合redux解决异步问题
  npm install babel-plugin-transform-decorators-legacy -D // 配合react-redux 支持@装饰器
  npm install mongoose -D // 安装mondoose MongoDB数据库插件
  npm install express -S // 基于node开发,搭建请求环境
  npm install babel-plugin-import -S antd-mobile按需加载babel插件
  npm install body-parser -S  后台数据接口用户传进来的参数解析插件
  npm install cookie-parser -S 通过cookie存储用户登录状态
  PS: 合并安装飞起来~

  npm run eject // 释放react关于webpack的封装配置
  sudo brew install mongodb(我这里是mac安装方式,其他平台可百度下)
修正User.js页面 render 函数中的 return

假设页面签到了,就彰显退出登陆开关,不然显示 笔者要登陆

return (
            <View style={styles.container}>
                <Text style={{ marginBottom: 20 }}>会员中心</Text>
                {!isLogin
                    ? <Button
                          type="warning"
                          onClick={() => {
                              this.props.dispatch(
                                  NavigationActions.navigate({
                                      routeName: 'Login'
                                  })
                              )
                          }}
                      >
                          我要登录
                      </Button>
                    : <View>
                          <Text style={{ marginBottom: 20 }}>您已经登录了</Text>
                          <Button
                          type="warning"
                          onClick={() => {
                              console.log('退出成功')
                          }}
                      >
                        退出登录
                      </Button>
                      </View>}
            </View>
        )

在 Login.js 页面中加多 onLogin 方法 调用 models/app.js 中的login 改动状态

...
onLogin = () => {
    this.props.dispatch({ type: 'app/login' })
}
...
<Button type="ghost" onClick={this.onLogin}>
    确认登录
</Button>

删掉 src目录下边全体文件并新建index.js

修改 models/app.js

增加 state状态

state:{
    isLogin: false,
    fetching: false // 加载进度条
}

增加 login 方法

*login({ payload }, { call, put }) {
            yield put({ type: 'updateState', payload: { fetching: true } })
            const login = yield call(authService.login, payload)
            if (login) {
                yield put({
                    type: 'updateState',
                    payload: { isLogin: true, fetching: false }
                })
                yield put(NavigationActions.back())
            }
        }

改过 containers/Login.js 页面扩大活动提示器

import { Button, ActivityIndicator } from 'antd-mobile'

...
render() {
        const { fetching } = this.props
        return (
            <View style={styles.container}>
                <ActivityIndicator
                    text="正在加载"
                    toast={true}
                    color="#ff0000"
                    animating={fetching}
                />
                <Text style={{ marginBottom: 20 }}>我是登录页面</Text>
                <Button type="ghost" onClick={this.onLogin}>
                    确认登录
                </Button>
            </View>
        )
    }
 // index.js
import React from 'react'
import ReactDOM from 'react-dom'

ReactDOM.render(
    <div>Demo</div>,
    document.getElementById('root')
)
日增退出职能

修改 models/app.js 增加logout方法

*logout({ payload }, { call, put }) {
    yield put({ type: 'updateState', payload: { isLogin: false } })
}

澳门网上唯一授权赌城 2

修改 containers/User.js

增加 logout 方法

logout = () => {
    this.props.dispatch({ type: 'app/logout' })
}

改良 退出登录 按钮的风浪

<Button type="warning" onClick={this.logout}>
    退出登录
</Button>

(未完待续...卡塔尔(قطر‎
上边会为大家分享 本地存款和储蓄的采用

image.png

在src目录新建一下文本和文件夹

澳门网上唯一授权赌城 3

image.png

components 放置组件
containers 放置页面
redux 放置redux成分集合文件(定义各个常量,reducers, create actions)
reducer.js 会集redux里面种种文件

本文由澳门网络娱乐游戏平台发布于Web前端,转载请注明出处:澳门直营react-native-dva-starter: 集成 dva 和 react-navigation 规范应用项景的 React Native 实例

相关阅读