美文网首页
THG项目架构

THG项目架构

作者: 李贤立 | 来源:发表于2018-12-06 16:23 被阅读114次

修改了App.js,将其放入src-core-app。
文件都存于src文件夹内,src的根目录是cpu。


image.png

C:core,核心,这是项目的核心代码。目前区分为:

1,app(项目初始化的代码);
2,net(网络请求封装);
3,route(界面的路由)。

后期项目扩大会新增,比如数据库工具、音视频工具、多语言工具等等,不是很常用,但是非常关键的组件。

P:public,公共,这是项目常用的公共部分代码,目前区分为:

1,command(基本组件的封装,成熟的项目里,这一部分将作为基本组件的替代组件);
2,dialog(对话框,分为三种:
      a,Loading(菊花加载框);
      b,Toast(延时消失提示框);
      c,Alert(和用户交互的对话框))
3,image(项目图片)。

后期会随着项目深入而新增,比如选择器、指示器等等自行封装的公共常用的组件。
说明:当前有主题设置的参数(theme.js)、其它数据的参数(parameter.js)、用得到的通知名称(notification.js),已分别建立文件,杜绝项目中出现的魔鬼数字和字符串,将统一在这里面控制。

U:ui,UI界面,展示的界面部分。目前界面分为三大板块:线索(clue)、看板(data)、设置(setting),另加上登录(login)界面,分别建立四个文件夹,根据项目深入会在这些子文件夹内新建子文件夹,用以根据界面迅速定位代码。登录之后进入Home界面,Home里面包含以上三大板块。


image.png

深入说明:
1,用户信息存于src-core-app中的UserInfo.js中,包括用户的手机信息和用户登录之后的账户信息,对外提供接口。

2,网络请求:src-core-net中Client.js是网络请求的中枢。其中配置信息config包含请求的IP地址、端口号等等,我们请求的具体地址由后台提供的请求代码控制。如下:

/**
 * 请求代码
 * @type {{login: string, checkVersion: string, logout: string}}
 */
export const Code = {
    login           : '20011001',// 登录
    checkVersion    : '20011011',// 检测版本
    logout          : '10060004',// 登出(服务代码有改变)
}

网络请求都是POST,提供一个接口:

/**
 * 网络请求
 * @param serverCode
 * @param functionCode
 * @param body
 * @returns {Promise<any>}
 */
export const lyFetch = ({serverCode='2001', functionCode, body})

functionCode由请求代码来控制,比如Code.login

3,路由。对外提供路由名称:

/**
 * 子界面
 * @type {{Login: string, Home: string, Alert: string}}
 */
export const routeName = {
    Login   :   'login',
    Home    :   'home',
    Alert   :   'alter',
}

界面跳转的时候使用(比如routeName.Home)即可跳转到相应的界面。

this.props.navigation.navigate(routeName.Home)

下面有每一个子界面的具体设置

/**
* 子界面设置
*/
export const RootStack = createStackNavigator(
……
)

其中包含了界面跳转过程中产生的几个通知,其名称分别在src-public-notification.js中

    a,新界面将要加载的通知(viewWillAppear);
    b,旧界面将要消失的通知(viewWillDisAppear);
    c,新界面加载完毕的通知(viewDidAppear);
    d,旧界面已经消失的通知(viewDidDisAppear);

携带一个参数,即确定属于哪一个界面,参数的判断标准在于路由的routeName中。
举例如下:

    componentDidMount() {
        this.deEmitter1 = DeviceEventEmitter.addListener(notification.viewDidAppear, (sceneName) => {
            if (sceneName === routeName.Alert) {
                console.log(sceneName+'已经加载')
            }
        })
        this.deEmitter2 = DeviceEventEmitter.addListener(notification.viewWillDisAppear, (sceneName) => {
            if (sceneName === routeName.Alert) {
                console.log(sceneName+'将要消失')
            }
        })
    }

    componentWillUnmount() {
        this.deEmitter1.remove()
        this.deEmitter2.remove()
    }

在这里就可以控制该界面(routeName.Alert)出现和消失。
说明:如果是侧滑返回上一级,旧界面将不会执行viewWillDisAppear。

4,对话框。三种对话框如下:

import {ly_Toast} from "./ESTToast";
import {ly_Alert} from "./ESTAlert";
import {ly_Loading} from "./ESTLoading";
export {ly_Toast, ly_Alert, ly_Loading}

三种对话框在出现的时候都会屏蔽用户的其它操作。

ly_Toast,延时消失的提示框,可以传入消失之后的动作参数,比如点击清理缓存的时候:

onPress={()=>{
        if (this.state.cacheNumber === 0) {
             ly_Toast('无须清理')
        } else {
            ly_Toast('清理成功', () => {
                    this.setState({
                        cacheNumber: 0
                    })
                })
         }
}}

ly_Alert,,交互对话框,可支持必选(只提供“确定”一个选项选择)和可选(提供“取消”和“确认”)。
ly_Loading,菊花加载框。使用时

ly_Loading('show'),表示调出菊花加载框
ly_Loading('hidden'),表示隐藏菊花加载框

说明:调出菊花加载框,正常情况是要手动来隐藏的,一般用于网络请求开始调出,网络请求结束隐藏。不过这里做了处理,即使没有ly_Loading('hidden')的代码,在超时时间(其值在src-public-parameter.js中控制)以后也会自行隐藏。

相关文章

网友评论

      本文标题:THG项目架构

      本文链接:https://www.haomeiwen.com/subject/eweocqtx.html