我爱编程ReactNative

初识ReactNative及个别实用组件

2018-04-10  本文已影响0人  WindFlyCloud

简述

我是在17年10月份开始接触ReactNative的,当时是听同事说这个语言的开发效率很高,兼容性还不错,恰好公司不是很忙,自己就抽空开始学习React。到目前为止用ReactNative开发了两个项目,感觉ReactNative在开发时确实很实用,就写篇文章,把自己的一些心得和搜集的资料分享一下。每一个程序员都要有开源分享精神 :-D

网站

React Native 中文网 https://reactnative.cn/
ECMAScript 6 入门 http://es6.ruanyifeng.com/
React 教程 http://www.runoob.com/react/react-tutorial.html
npm https://www.npmjs.com/
React/React Native 的ES5 ES6写法对照表 http://bbs.reactnative.cn/topic/15/react-react-native-%E7%9A%84es5-es6%E5%86%99%E6%B3%95%E5%AF%B9%E7%85%A7%E8%A1%A8

第三方库(这些库都可以在GitHub或者npm上搜索到)

"react-native-md5": "^1.0.0",//用于md5加密
"react-native-sqlite-storage": "^3.3.4",//数据库操作
"react-native-storage": "^0.2.2",//本地存储
"jwt-decode": "^2.2.0",//解析jsonwebtoken
"xmldom": "^0.1.27"//处理xml文本
react-native-loading-view //加载遮罩loading
react-native-easy-toast //提示文字视图
npm i react-native-swiper --save //轮播图

console.log的封装

export default class Logger{
    //是否开启日志,true开启,false关闭
    static isDebugger=true;
    static log(obj){
        if(this.isDebugger){
            console.log(obj);
        }
    }

    static warn(obj){
        if(this.isDebugger){
            console.warn(obj);
        }
    }
}

使用方法 Logger.log(obj); Logger.warn(obj);

观察者(广播)组件 可以多个页面同时监听同一事件

/**
 * 全局的监听对象(多线程 高并发的时候可能会有问题 未处理并发情景)
 * 可以多个页面同时监听同一事件
 * componentWillUnmount时或者不需要监听时进行反注册  不执行该步骤否则将导致内存泄漏
 *
 */

class Observer {
    constructor() {
        this.observers = new Map();
    }
    /**
     * 获取注册监听对象的实例
     * @returns {*}
     */
    static getInstance() {
        if (global.observerInstance == undefined) {
            global.observerInstance = new Observer();
        }
        return global.observerInstance;
    }

    /**
     * 注册观察
     * @param key 观察对象类型的可以值(使用字符串表示),不同的key表示监听不同事件  多个地方可以监听同一事件
     * @param callback
     */
    register(key, callback) {
        let observers = global.observerInstance.observers;
        if (observers.has(key)) {
            let listeners = observers.get(key);
            if (!listeners.includes(callback)) {
                listeners.push(callback);
            }
        } else {
            observers.set(key, [callback]);
        }
    }

    /**
     * 通知
     * @param key 观察对象类型的可以值(使用字符串表示 使用注册时传入的值)
     * @param parameters 通知时传递的参数
     */
    notify(key, parameters) {
        let observers = global.observerInstance.observers;
        if (observers.has(key)) {
            let listeners = observers.get(key);
            for (callback of listeners) {
                callback(parameters);
            }
        }
    }

    /**
     *  componentWillUnmount时或者不需要监听时进行反注册  不执行该步骤否则将导致内存泄漏
     * @param key 观察对象类型的可以值(使用字符串表示 使用注册时传入的值)
     * @param callback 传入注册时传入的回调对象
     */
    unRegister(key, callback) {
        let observers = global.observerInstance.observers;
        if (observers.has(key)) {
            let listeners = observers.get(key);
            let index = listeners.indexOf(callback);
            if (index != -1) {
                listeners.splice(index, 1);
            }
        }
    }
}

/**
 * Observer通知对象类型定义
 */
class ObserverConstant {
    static type = {
        loginSuccess: "loginSuccess",//监听登录成功的key
    }
}

module.exports={Observer,ObserverConstant}

观察者(广播)组件的使用

    componentDidMount(){
        //注册监听当登录后,重新请求 刷新用户的信息
        Observer.getInstance().register(ObserverConstant.type.loginSuccess,this.requestUserInfoData);
    }
    componentWillUnmount(){
        //移除监听
        Observer.getInstance().unRegister(ObserverConstant.type.loginSuccess,this.requestUserInfoData);
    }
    requestUserInfoData = ()=>{
        Logger.log('请求用户信息');
    }

发广播

//登录成功发送通知
Observer.getInstance().notify(ObserverConstant.type.loginSuccess);
上一篇下一篇

猜你喜欢

热点阅读