a-link.vue 6.82 KB
<template>
    <v-touch tag="span" class="link-a" @tap="click">
        <slot></slot>
    </v-touch>
</template>

<script>
import {REPORT_YAS} from 'store/yoho/types';
import parse from 'yoho-qs/parse';

export default {
    name: 'ALink',
    props: {
        href: [String],
        to: String,
        yas: Object,
        yasF: Number,
        yasI: Number
    },
    methods: {
        click() {
            if (this.href) {
                let url = this.href;
                const classList = this.$el.classList;
                const excluded = classList.contains('no-intercept');

                if (excluded) {
                    location.href = this.href;
                    return;
                }

                if (/^\/\//.test(url)) {
                    url = 'https:' + url;
                }
                const routeUrl = url.replace(location.origin, '');
                const route = this.$router.resolve(routeUrl).route;

                if (route.matched.length) {
                    this.reportYas(`${location.origin}${routeUrl}`);
                    this.$router.push(routeUrl);
                } else {
                    this.reportYas(url);
                    this.dispatch(url);
                }
            } else if (this.to) {
                this.reportYas(`${location.origin}${this.to}`);
                this.$router.push(this.to);
            }
        },
        reportYas(url) {
            const param = {
                F_URL: url,
                PAGE_URL: `${location.origin}${this.$route.fullPath}`,
                PAGE_NAME: this.$route.name
            };

            if (this.yas) {
                param.F_ID = this.yas.template_id;
                param.F_NM = this.yas.template_name;
                param.F_INDEX = (this.yasF || 0) + 1;
                param.I_INDEX = (this.yasI || 0) + 1;
            }
            this.$store.dispatch(REPORT_YAS, {
                params: {
                    appop: 'YB_H5_PAGE_FLR_C',
                    param
                }
            });
        },
        dispatch(url) {
            const origin = location.origin;
            const defaultTitleMap = {
                1: {
                    headerid: '1',
                    left: {
                        action: ''
                    },
                    title: {
                        des: '',
                        action: ''
                    }
                },
                2: {
                    headerid: '2',
                    left: {
                        action: ''
                    },
                    title: {
                        des: '',
                        action: ''
                    },
                    right: {
                        icon: 'chat',
                        action: 'goToService'
                    }
                },
                3: {
                    headerid: '3',
                    left: {
                        action: ''
                    },
                    title: {
                        des: '',
                        action: ''
                    },
                    right: {
                        des: '提交',
                        action: 'test'
                    }
                },
                4: {
                    headerid: '4',
                    ltitle: {
                        des: '品牌',
                        action: origin + '/brands'
                    },
                    rtitle: {
                        des: '品类',
                        action: origin + '/cate'
                    }
                },
                5: {
                    headerid: '5',
                    left: {
                        action: ''
                    },
                    ltitle: {
                        des: '商品',
                        action: origin + '/me/collection'
                    },

                    // mtitle: {
                    //     des: '品牌',
                    //     action: origin + '/me/collection?tab=brand'
                    // },
                    rtitle: {
                        des: '资讯',
                        action: origin + '/me/collection?tab=article'
                    },
                    right: {
                        des: '编辑',
                        action: 'editModel'
                    },
                    defaultSelectedIndex: '0'
                },
                6: {
                    headerid: '6',
                    title: {
                        des: '资讯',
                        action: ''
                    }
                }
            };

            if (this.$yoho.isApp || this.$yoho.isYohoBuy) {
                let titleMap = {...defaultTitleMap};
                let [path, qs] = url.split('?');

                qs = parse(qs);

                // 个人中心收藏
                if (/\/me\/collection$/.test(path)) {
                    let header = titleMap[5];

                    if (qs.tab === 'article') {
                        header.defaultSelectedIndex = '1';
                    } else {
                        header.defaultSelectedIndex = '0';
                    }
                    return this.$yoho.goPageView({
                        header: header
                    });
                }

                // 个人中心首页
                if (/\/me$/.test(path)) {
                    return this.$yoho.goTab({
                        index: 4
                    });
                }

                // 资讯
                if (/\/editorial\/list$/.test(path)) {
                    return this.$yoho.goTab({
                        index: 2
                    });
                }

                // 品类
                if (/\/cate$/.test(path)) {
                    return this.$yoho.goTab({
                        index: 1,
                        headerIndex: 1
                    });
                }

                // 首页
                if (/\/$/.test(path) || !path) {
                    return this.$yoho.goTab({
                        index: 0,
                        url: /^(https?:)?\/\//i.test(url) ? url : origin + url
                    });
                }

                const args = {
                    url: /^(https?:)?\/\//i.test(url) ? url : origin + url
                };

                if (/\/me\/service$/.test(path)) {
                    args.showLoading = 'no';
                }

                // 处理 feature.yoho.cn 等域名下的站外链接
                if (/^(https?:)?\/\//i.test(path) && !/m\.yohoblk\.com/.test(path)) {
                    args.showLoading = 'no';
                }
                args.header = {
                    headerid: '-1'
                };
                this.$yoho.goNewPage(args);
            } else {
                location.href = url;
            }
        }
    }
};
</script>

<style>

</style>