zoukankan      html  css  js  c++  java
  • 【水滴石穿】rn_antd_dva_reactnavigation

    这个项目好像就是记录了一个数据的流向,大体思想好像是这个
    项目地址:https://github.com/Yangzhuren/rn_antd_dva_reactnavigation
    先看效果
    第一个页面会显示第二个页面点击的值

    第二个页面

    先来看代码
    根index.js引用的不是app.js组件而是在自定义的组件里面

    //index.js
    /**
     * @format
     */
    
    import {AppRegistry} from 'react-native';
    import App from './js';
    import {name as appName} from './app.json';
    
    AppRegistry.registerComponent(appName, () => App);
    

    js中的项目

    //js/index.js
    import React, {Component} from 'react'
    import {InputItem, List, Provider} from "@ant-design/react-native";
    import Pages from './pages'
    import dva from "dva";
    import {registerModels} from "./models";
    import createMemoryHistory from "history/createMemoryHistory";
    
    class Root extends Component {
        constructor(props) {
            super(props);
        }
    
    
        render() {
            return (
                <Provider>
                    <Pages/>
                </Provider>
            )
        }
    }
    
    const app = dva({
        history:createMemoryHistory(),
        initialState: {},
        onError: function (e) {
            console.log("dva onError", e)
        }
    })
    
    registerModels(app)
    
    app.router(() => <Root/>)
    
    const App = app.start()
    
    export default App
    

    上面的引用了pages组件

    页面一进去,应该进入的是page1页面然后再进去page2页面
    看代码

    //js/pages/index.js
    //根据代码执行顺序可知道先执行page1
    import React, {Component} from 'react'
    import {createStackNavigator, createAppContainer} from 'react-navigation'
    import Page1 from "./page1";
    import Page2 from "./page2";
    
    const Pages = createStackNavigator({
        page1: {
            screen: Page1
        },
        page2: {
            screen: Page2
        }
    })
    
    export default createAppContainer(Pages)
    

    page1页面组件

    //js/pages/page1/index.js
    import React, {Component} from 'react'
    import {Button, Flex} from "@ant-design/react-native"
    import Actions from './actions'
    import {connect} from 'dva'
    
    class Page1 extends Component {
    
        constructor(props) {
            super(props)
            new Actions(this)
        }
    
        render() {
            const {clickCount} = this.props.userInfo
            return (
                <Flex align={"center"} justify={"center"} style={{flex: 1}}>
                    <Button onPress={this.clicked}>go page2 and click count:{clickCount}</Button>
                </Flex>
            )
        }
    }
    
    function mapStateToProps(state) {
        return {userInfo: state.user}
    }
    
    export default connect(mapStateToProps)(Page1)
    

    这个有意思,定一个action组件,然后点击可以跳转第二个页面

    //js/pages/page1/actions.js
    import {BaseAction} from '../../common'
    
    export default class Actions extends BaseAction {
        clicked() {
            this.props.navigation.navigate('page2')
        }
    }
    
    //js/pages/page2/index.js
    import React, {Component} from 'react'
    import {Button} from "@ant-design/react-native"
    import Actions from './actions'
    import {createAction} from "../../actions";
    import {connect} from 'dva';
    
    class Page2 extends Component {
        constructor(props) {
            super(props)
            new Actions(this)
            this.state = {
                clickCount: 0
            }
        }
    
        render() {
            const {clickCount} = this.state
            return (
                <Button onPress={this.clicked}>page2 click counts:{clickCount}</Button>
            )
        }
    }
    
    function mapStateToProps(state) {
        return {userInfo: state.user}
    }
    
    export default connect(mapStateToProps)(Page2)
    
    //js/pages/page2/actions.js
    import {BaseAction} from '../../common'
    import {createAction} from "../../actions";
    
    export default class Actions extends BaseAction {
        clicked() {
            const {clickCount} = this.state
            this.setState({
                clickCount: clickCount + 1
            },()=>{
                const userAction = createAction('user/checkUser')({clickCount: this.state.clickCount})
                this.props.dispatch(userAction)
            })
        }
    }
    

    关于models里面有一点不理解

    //js/models/index.js
    import User from './User'
    import {DvaInstance} from "dva";
    
    export function registerModels(app: DvaInstance) {
        app.model(User)
    }
    
    //js/models/User.js
    // 里面就是dva的一些基本方法吗
    import {createAction} from '../actions'
    
    export default {
        namespace: 'user',
        state: {
            name: '',
            mobile: '',
            clickCount: 0
        },
        reducers: {
            getUserInfo(state, {payload}) {
                return {...state, ...payload}
            }
        },
        effects: {
            * checkUser({payload}, {call, put}) {
                yield put(
                    createAction('getUserInfo')({
                        ...payload
                    })
                )
            }
        }
    }
    
  • 相关阅读:
    Netty相关知识积累
    Java内存管理
    使用nginx-upload-module搭建文件上传服务器
    mysql 5.7自动安装脚本
    CDH5集群搭建
    Linux常用命令
    编译原理要点四
    编译原理要点三
    编译原理要点二:
    编译原理要点
  • 原文地址:https://www.cnblogs.com/smart-girl/p/10880265.html
Copyright © 2011-2022 走看看