WebApp【公共组件库】@前端(For Git Submodule)
Tevin
2021-03-31 3cafdf134729197e22a53f79dd25c45db2062fa3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
 * Pilot
 * @author Tevin
 */
 
import { Fetcher } from './Fetcher';
import { Tools } from '@components/common/Tools';
import project from '@project';
 
export class Pilot {
 
    constructor() {
    }
 
    $data() {
        return {};
    }
 
    createOptions(dataAdd) {
        const options = {
            methods: {},
        };
        const names = [];
        // 实例本身的字段
        Object.getOwnPropertyNames(this).forEach(name => names.push(name));
        // 类的字段
        Object.getOwnPropertyNames(Object.getPrototypeOf(this)).forEach(name => names.push(name));
        // 传递
        names.forEach(name => {
            // 构造器忽略,如果存在属性 $methods 也忽略
            if (name === 'constructor' || name === '$methods') {
                return;
            }
            if (/^\$/.test(name)) {
                if (name === '$data' && typeof dataAdd !== 'undefined') {
                    // 转换 dataAdd 中 assets 属性下的图片地址值
                    if (typeof dataAdd.assets !== 'undefined') {
                        dataAdd.assets = Pilot.transAssets(dataAdd.assets);
                    }
                    // 当有传data值进来,初始值必须带data中的字段
                    const dataOrig = this.$data();
                    options.data = () => {
                        return {
                            ...dataOrig,
                            ...dataAdd,
                        };
                    };
                } else {
                    options[name.replace('$', '')] = this[name];
                }
            } else {
                options.methods[name] = this[name];
            }
        });
        return options;
    }
 
    /**
     * 转换静态图片引用
     * @param assets
     * @return {{}}
     */
    static transAssets(assets = {}) {
        const assets2 = {};
        Object.keys(assets).forEach(key => {
            let asset = '';
            if (assets[key].indexOf('assets') >= 0) {
                asset = assets[key].split('assets')[1];
            } else {
                asset = assets[key].replace(/^[.\/\\]*/, '/');
            }
            // 网页
            if (process.env.TARO_ENV === 'h5') {
                assets2[key] = project.host.assetsPath + asset;
            }
            // 小程序
            else if (process.env.TARO_ENV === 'weapp') {
                assets2[key] = Fetcher.host + project.host.assetsPath + asset;
            }
        });
        return assets2;
    }
 
}