RubyLouvre/anu

View on GitHub
packages/core/util.js

Summary

Maintainability
B
4 hrs
Test Coverage
export const arrayPush = Array.prototype.push;
export const innerHTML = 'dangerouslySetInnerHTML';
export const hasOwnProperty = Object.prototype.hasOwnProperty;
export const gSBU = 'getSnapshotBeforeUpdate';
export const gDSFP = 'getDerivedStateFromProps';
export const hasSymbol = typeof Symbol === 'function' && Symbol['for'];
export const effects = [];
export const topFibers = [];
export const topNodes = [];
export const emptyArray = [];
export const emptyObject = {};

export const REACT_ELEMENT_TYPE = hasSymbol
    ? Symbol['for']('react.element')
    : 0xeac7;

export function noop() {}

export function Fragment(props) {
    return props.children;
}

export function returnFalse() {
    return false;
}

export function returnTrue() {
    return true;
}

export function resetStack(info) {
    keepLast(info.containerStack);
    keepLast(info.contextStack);
}

function keepLast(list) {
    var n = list.length;
    list.splice(0, n - 1);
}

export function get(key) {
    return key._reactInternalFiber;
}

export let __type = Object.prototype.toString;

var fakeWindow = {};
export function getWindow() {
    try {
        if (window){
            return window;
        }
    /* istanbul ignore next  */
    } catch (e) {/*kill*/}
    try {
        if (global){
            return global;
        }
    /* istanbul ignore next  */
    } catch (e) {/*kill*/}
    return fakeWindow;
}
export function isMounted(instance) {
    var fiber = get(instance);
    return !!(fiber && fiber.hasMounted);
}

export function toWarnDev(msg, deprecated) {
    msg = deprecated ? msg + ' is deprecated' : msg;
    let process = getWindow().process;
    if (process && process.env.NODE_ENV === 'development') {
        throw msg;
    }
}

export function extend(obj, props) {
    for (let i in props) {
        if (hasOwnProperty.call(props, i)) {
            obj[i] = props[i];
        }
    }
    return obj;
}

export function inherit(SubClass, SupClass) {
    function Bridge() {}
    let orig = SubClass.prototype;
    Bridge.prototype = SupClass.prototype;
    let fn = (SubClass.prototype = new Bridge());
    // 避免原型链拉长导致方法查找的性能开销
    extend(fn, orig);
    fn.constructor = SubClass;
    return fn;
}
try {
    //微信小程序不支持Function
    var supportEval = Function('a', 'return a + 1')(2) == 3;
    /* istanbul ignore next  */
} catch (e) {}
let rname = /function\s+(\w+)/;
export function miniCreateClass(ctor, superClass, methods, statics) {
    let className = ctor.name || (ctor.toString().match(rname) ||['','Anonymous'])[1];
    let Ctor = supportEval ? Function('superClass', 'ctor', 'return function ' + className + ' (props, context) {\n            superClass.apply(this, arguments); \n            ctor.apply(this, arguments);\n      }')(superClass, ctor) : 
        function ReactInstance() {
            superClass.apply(this, arguments);
            ctor.apply(this, arguments);
        };
    Ctor.displayName = className;
    let proto = inherit(Ctor, superClass);
    extend(proto, methods);
    extend(Ctor, superClass);//继承父类的静态成员
    if (statics) {//添加自己的静态成员
        extend(Ctor, statics);
    }
    return Ctor;
}

let lowerCache = {};
export function toLowerCase(s) {
    return lowerCache[s] || (lowerCache[s] = s.toLowerCase());
}

export function isFn(obj) {
    return __type.call(obj) === '[object Function]';
}

let rword = /[^, ]+/g;

export function oneObject(array, val) {
    if (array + '' === array) {
        //利用字符串的特征进行优化,字符串加上一个空字符串等于自身
        array = array.match(rword) || [];
    }
    let result = {},
        //eslint-disable-next-line
        value = val !== void 666 ? val : 1;
    for (let i = 0, n = array.length; i < n; i++) {
        result[array[i]] = value;
    }
    return result;
}

let rcamelize = /[-_][^-_]/g;
export function camelize(target) {
    //提前判断,提高getStyle等的效率
    if (!target || (target.indexOf('-') < 0 && target.indexOf('_') < 0)) {
        return target;
    }
    //转换为驼峰风格
    let str = target.replace(rcamelize, function(match) {
        return match.charAt(1).toUpperCase();
    });
    return firstLetterLower(str);
}

export function firstLetterLower(str) {
    return str.charAt(0).toLowerCase() + str.slice(1);
}

let numberMap = {
    //null undefined IE6-8这里会返回[object Object]
    '[object Boolean]': 2,
    '[object Number]': 3,
    '[object String]': 4,
    '[object Function]': 5,
    '[object Symbol]': 6,
    '[object Array]': 7
};
// undefined: 0, null: 1, boolean:2, number: 3, string: 4, function: 5, symbol:6, array: 7, object:8
export function typeNumber(data) {
    if (data === null) {
        return 1;
    }
    if (data === void 666) {
        return 0;
    }
    let a = numberMap[__type.call(data)];
    return a || 8;
}


export let toArray =
    Array.from ||
    function(a) {
        let ret = [];
        for (let i = 0, n = a.length; i < n; i++) {
            ret[i] = a[i];
        }
        return ret;
    };