账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    vue 多次调用组件冲突
    34
    0

    自己封装了一个select的组件,写好了,测试一切正常,然鹅,如果页面调用多次的话,就冲突了。展开一个,所有组件都展开了,选择一个,所有的都跟着变

    select 组件

    <template id="selectComponent">
        <div class="dropdown">
            <button class="form-control dropdown-toggle text-left" type="button">
                {{selectList[current]&&selectList[current].name}}
            </button>
            <div class="dropdown-menu btn-block" :class="{show:showSelect}">
                <button class="dropdown-item" type="button" v-for="(item,index) in selectList" :data-index="index">{{item.name}}</button>
            </div>
        </div>
    </template>
    <script>
    var dataid = ('selectComponent' + new Date().getTime() + Math.random()).replace('.', '');
    var tpEl = getDom('#selectComponent').content.querySelector('.selectComponent');
    tpEl.dataset.id = dataid;
    Vue.component('selectComponent', {
        template: '#selectComponent',
        data: function() {
            var vm = this;
            return {
                showSelect: false,
                current: 0,
            }
        },
        props: ['list'],
        computed: {
            selectList: function() {
                return this.list;
            }
        },
        mounted: function() {
            var vm = this;
            document.addEventListener('click', function(event) {
                var el = event.target;
                if (el.dataset.id == dataid || el.closest('[data-id=' + dataid + ']')) {
                    if (el.classList.contains('dropdown-toggle')) {
                        vm.showSelect = !vm.showSelect;
                    } else {
                        if (el.classList.contains('dropdown-item')) {
                            vm.current = el.dataset.index;
                        }
                        vm.showSelect = false;
                    }
                } else {
                    vm.showSelect = false;
                }
            }, false);
        },
        watch: {
            current: function(index) {
                this.$emit('change', index);
            }
        }
    });
    </script>
    
    调用方法:
    <select-component @change="change" :list.sync="[{value:1,name:'test'}]"></select-component>
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部