翻译语言选择自定义封装(elementUI)

基于elementUI下拉菜单项el-dropdown自定义封装

<template>
    <div>
        <el-dropdown trigger="click" @command="handleCommand" ref="dropRef">
            <el-select v-model="key1" ref="sel" @visible-change="selectClick" placeholder="请选择">
                <el-option
                v-for="item in options"
                :key="'sel'+item.key"
                :label="item.lang"
                :value="item.key">
                </el-option>
            </el-select>
            <el-dropdown-menu slot="dropdown">
                <el-input v-model="key2" suffix-icon="el-icon-search" placeholder="搜索语言"></el-input>
                <div v-show="key2" style="padding: 10px 10px 0;">
                    <ul>
                        <li v-for="(item,index) in searchList" :key="'search'+item.key">
                            <div class="list-item" @click="searchSelect(item)">
                                {{ item.lang }}
                            </div>
                        </li>
                    </ul>
                </div>
                <div v-show="!key2" class="group-content">
                    <vue-scroll :ops="ops" ref="groupRef">
                        <div class="group-list">
                            <div v-for="item in languages" :key="item.title">
                                <div ref="titleRef">{{ item.title }}</div>
                                <el-dropdown-item
                                    v-for="(lang, index) in item.list"
                                    :key="lang.key"
                                    class="sort-item"
                                    :command="lang"
                                    >
                                    <span>{{ lang.lang }}</span>
                                </el-dropdown-item>
                            </div>
                        </div>
                    </vue-scroll>
                    <div class="key-list">
                        <div v-for="item in keyList" :key="'key'+item" @click="goIndex(item)">
                            {{ item }}
                        </div>
                    </div>
                </div>
            </el-dropdown-menu>
        </el-dropdown>
    </div>
        
</template>
      
<script>
import {langList} from './langList'
// 搜索防抖定时器
let timer
export default {
    props:{
        type:''
    },
    data() {
        return {
            // 选定后下拉项
            options:[],
            // 选定语言
            key1:'',
            // 语言搜索
            key2:'',
            keyList:['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],
            languages:langList,
            //滚动条定义配置项
            ops: {
                vuescroll: {},
                scrollPanel: {
                    scrollingX: false,//关闭横向滚动
                },
                rail: {
                    keepShow: true,
                },
                bar: {
                    hoverStyle: true,
                    onlyShowBarOnScroll: false, //是否只有滚动的时候才显示滚动条
                    background: "#efefef", //滚动条颜色
                    opacity: 0.8, //滚动条透明度
                },
            },
            // 搜索结果列表
            searchList:[]
        }
    },
    watch: {
        key2(val){
            if (timer) {
                clearTimeout(timer)
            }
            timer=setTimeout(()=>{
                this.getSelectList(val)
            },500)
        }
    },
    created(){
        if(this.type=='from'){
            this.handleCommand({key:'en',lang:'英语'})
        }
        if(this.type=='to'){
            this.handleCommand({key:'zh',lang:'中文(简体)'})
        }
    },
    methods:{
        goIndex(key){
            const groupRef=this.$refs.groupRef.$children[0].$el
            const titleRef=this.$refs.titleRef
            titleRef.forEach(item=>{
                if(item.innerText===key){
                    groupRef.scrollTo({
                        top:item.offsetTop,
                        behavior:'smooth'
                    })
                }
            })
        },
        handleCommand(lang){
            this.options=[{...lang}]
            this.key1=lang.key
            this.$emit('changeSelect',lang.key)
        },
        // 隐藏select下拉框
        selectClick(){
            this.$refs.sel.blur()
        },
        getSelectList(val){
            if(!val) return
            const result=[]
            langList.forEach(item=>{
                item.list.forEach(langItem=>{
                    if(langItem.lang.indexOf(val)!==-1){
                        result.push(langItem)
                    }
                })
            })
            this.searchList=result
            
        },
        searchSelect(lang){
            this.$refs.dropRef.hide()
            this.handleCommand(lang)
            this.key2=''
        }
    }
}
</script>

<style scoped lang="scss">
/* 设置选项样式 */
/* 设置弹出框的宽高 */
/deep/ .el-dropdown-menu {
    width: 800px;
    // height: 400px;
    padding: 10px;
    .sort-item {
        display: inline-block;
        width: 100px;
        padding: 0 15px;
        margin: 10px 15px 2px 0;
        line-height: 20px;
        font-size: 14px;
        color: #333333;
        text-align: center;
        cursor: pointer;
    }
    .list-item{
        color: #333;
        cursor: pointer;
        font-size: 13.5px;
        line-height: 22px;
        margin-bottom: 9px;
    }
    .group-content{
        position: relative;
        height:420px;
        margin-top: 20px;
        .group-list{
            height: 400px;
            padding-right: 20px;
        }
        .key-list{
            position: absolute;
            right: 25px;
            top: 0;
            height: 100%;
            display: flex;
            flex-direction: column;
            justify-content: space-between;
            color: #999;
            div{
                text-align: center;
                cursor: pointer;
            }
        }
    }
}
</style>

实现效果:

posted @ 2023-10-17 11:24  年轻浅识  阅读(82)  评论(0)    收藏  举报