使用element-UI的tree型控件做挑選框

針對(duì)樹形控件做挑選框
單選效果:


image.png

多選效果


image.png
<template>
    <div>
        <el-input
            v-if="curActionType === 'view'"
            v-model="value.name"
            :style="{ width: componentWidth }"
            disabled
        />
        <el-popover
            v-else
            v-model="showSelection"
            placement="bottom"
            trigger="click"
        >
            <el-input
                slot="reference"
                v-model="value.name"
                :style="{ width: componentWidth }"
                :placeholder="`請(qǐng)選擇所屬${showName}`"
                readonly
            />
            <div>
                <el-input
                    v-model="filterText"
                    :placeholder="`請(qǐng)輸入${showName}`"
                    class="mb15"
                    v-if="showSearch"
                />
                <el-tree
                    ref="tree"
                    :data="treeData"
                    :node-key="rowKeys.id"
                    :show-checkbox="isMulti"
                    :default-expanded-keys="[1]"
                    :props="defaultProps"
                    :filter-node-method="filterNode"
                    @check-change="handleCheckChange"
                    @current-change="handleCurrentChange"
                    :highlight-current="!isMulti"
                />
            </div>
        </el-popover>
    </div>
</template>


<script>
export default {
    name: 'TreeSelect',
    props: {
        value: {
            type: Object,
            default: () => ({
                id: '',
                name: ''
            })
        },
        rowKeys: {
            type: Object,
            default: () => ({
                id: 'id',
                name: 'name',
                children: 'children',
                parent: 'parent'
            })
        },
        treeData: {
            type: Array,
            default: () => []
        },
        componentWidth: {
            type: String,
            default: '250px'
        },
        showName: {
            type: String,
            default: ''
        },
        valueType: {
            type: String,
            default: 'all' // all,parent,son绿贞;選擇all時(shí)橘原,所選中的父子節(jié)點(diǎn)都返回;選擇parent的時(shí)候吓懈,當(dāng)前父節(jié)點(diǎn)下所有子節(jié)點(diǎn)都被選擇時(shí)靡狞,只返回父節(jié)點(diǎn)甸怕;選擇son的時(shí)候腮恩,當(dāng)前父節(jié)點(diǎn)下所有子節(jié)點(diǎn)都被選擇時(shí)秸滴,過(guò)濾父節(jié)點(diǎn)
        },
        isMulti: {
            type: Boolean,
            default: true
        },
        showSearch: {
            type: Boolean,
            default: true
        }
    },
    data() {
        return {
            multipleSelection: [],
            showSelection: false,
            filterText: ''
        }
    },
    computed: {
        defaultProps() {
            return {
                children: this.rowKeys.children,
                label: this.rowKeys.name
            }
        }
    },
    watch: {
        filterText(val) {
            this.$refs.tree.filter(val)
        }
    },
    mounted() {
        if (this.isMulti) {
            this.multiReset()
        } else {
            this.singleReset()
        }
    },
    methods: {
        multiReset() {
            if (this.curActionType === 'view') {
                return false
            }
            if (this.value.id) {
                this.$nextTick(() => {
                    this.$refs.tree.setCheckedKeys(this.value.id.split(','))
                })
            } else {
                this.$nextTick(() => {
                    this.$refs.tree.setCheckedKeys([])
                })
            }
        },
        // 單選設(shè)置當(dāng)前選中節(jié)點(diǎn)
        singleReset() {
            console.log(this.value.id, this.$refs.tree.setCurrentKey)
            if (this.value.id) {
                this.$refs.tree.setCurrentKey(this.value.id)
            }
        },
        // 樹菜單搜索
        filterNode(value, data) {
            if (!value) return true
            return data[this.rowKeys.name].indexOf(value) !== -1
        },
        // 選擇
        handleCheckChange() {
            const checkNodes = this.$refs.tree.getCheckedNodes()
            if (this.valueType === 'all') {
                this.multipleSelection = checkNodes
            } else if (this.valueType === 'son') {
                this.multipleSelection = checkNodes.filter((item) => {
                    return !item.children || item.children.length === 0
                })
            } else {
                const parentNodes = checkNodes
                    .filter((item) => {
                        return item.children && item.children.length > 0
                    })
                    .map((i) => i[this.rowKeys.id])
                let result = []
                for (const j of checkNodes) {
                    if (!parentNodes.includes(j[this.rowKeys.parent])) {
                        result.push(j)
                    }
                }
                this.multipleSelection = result
            }
            this.submit()
        },
        // 多選提交選擇信息
        submit() {
            const checkedIds = this.multipleSelection
                .map((item) => item[this.rowKeys.id])
                .join(',')
            const checkedNames = this.multipleSelection
                .map((item) => item[this.rowKeys.name])
                .join(',')
            this.$emit('input', { id: checkedIds, name: checkedNames }) // 傳值給父組件
        },
        // 單選提交選擇信息
        handleCurrentChange(data, node) {
            if (this.curActionType === 'view') {
                return false
            }
            if (!this.isMulti) {
                this.$emit('input', {
                    id: data[this.rowKeys.id],
                    name: data[this.rowKeys.name]
                })
            } // 傳值給父組件
        }
}
</script>

isMulti是單選多選標(biāo)志,為true時(shí)是多選全释,擁有checkbox误债,否則為單選寝蹈。
當(dāng)多選時(shí)箫老,無(wú)需高亮,只需要設(shè)置所選中數(shù)據(jù)前的checkbox為選中狀態(tài)周叮;設(shè)置row-key值仿耽,并且在created/mounted時(shí)各薇,引用element-UI自帶的函數(shù)setCheckedKeys

                this.$refs.tree.setCheckedKeys(this.value.id.split(','))

當(dāng)單選時(shí)君躺,需要高亮棕叫,除了要設(shè)置設(shè)置row-key值俺泣,并且在created/mounted時(shí)完残,引用element-UI自帶的函數(shù)setCurrentKey外谨设,還需要設(shè)置:highlight-current="true"

                this.$refs.tree.setCurrentKey(this.value.id)

使用樣例

<template>
    <div class="menuManagement">
        <tree-select
            v-model="test"
            :row-keys="{
                id: 'deptId',
                name: 'deptName',
                parent: 'deptParentId',
                children: 'children'
            }"
            show-name="業(yè)務(wù)組"
            value-type="all"
            :tree-data="deptData"
            :is-multi="true"
        >
        </tree-select>
    </div>
</template>
<script>
import TreeSelect from '@/components/TreeSelect/index.vue'

export default {
    name: 'menuManagement',
    components: { TreeSelect },
    data() {
        return {
            test: {
                id: '1',
                name: '民生業(yè)務(wù)組'
            },
            deptData: [
                {
                    deptId: 1,
                    deptName: '民生業(yè)務(wù)組',
                    deptParentId: 0,
                    deptCode: null,
                    deptDesc: null,
                    createUserId: 1,
                    createTime: '2019-09-26 21:19:45',
                    updateUserId: 1,
                    updateTime: '2019-12-05 11:31:55',
                    children: [
                        {
                            deptId: 3,
                            deptName: '出入境',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: '出入境',
                            createUserId: 1,
                            createTime: '2019-09-26 21:19:51',
                            updateUserId: 1,
                            updateTime: '2019-12-20 14:23:49',
                            children: null,
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        },
                        {
                            deptId: 10,
                            deptName: '治安',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: '治安',
                            createUserId: 1,
                            createTime: null,
                            updateUserId: 1,
                            updateTime: '2019-12-19 16:20:56',
                            children: [
                                {
                                    deptId: 50,
                                    deptName: '治安1',
                                    deptParentId: 10,
                                    deptCode: null,
                                    deptDesc: '1',
                                    createUserId: 18,
                                    createTime: '2019-12-27 11:31:04',
                                    updateUserId: null,
                                    updateTime: null,
                                    children: null,
                                    deptParentName: '治安',
                                    deleteFlag: null
                                },
                                {
                                    deptId: 588,
                                    deptName: '治安2',
                                    deptParentId: 10,
                                    deptCode: null,
                                    deptDesc: '1',
                                    createUserId: 18,
                                    createTime: '2019-12-27 11:31:04',
                                    updateUserId: null,
                                    updateTime: null,
                                    children: [
                                        {
                                            deptId: 5881,
                                            deptName: '治安2-1',
                                            deptParentId: 588,
                                            deptCode: null,
                                            deptDesc: '1',
                                            createUserId: 18,
                                            createTime: '2019-12-27 11:31:04',
                                            updateUserId: null,
                                            updateTime: null,
                                            children: null,
                                            deptParentName: '治安',
                                            deleteFlag: null
                                        },
                                        {
                                            deptId: 5882,
                                            deptName: '治安2-2',
                                            deptParentId: 588,
                                            deptCode: null,
                                            deptDesc: '1',
                                            createUserId: 18,
                                            createTime: '2019-12-27 11:31:04',
                                            updateUserId: null,
                                            updateTime: null,
                                            children: null,
                                            deptParentName: '治安',
                                            deleteFlag: null
                                        }
                                    ],
                                    deptParentName: '治安',
                                    deleteFlag: null
                                }
                            ],
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        },
                        {
                            deptId: 12,
                            deptName: '交管',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: '交管',
                            createUserId: 1,
                            createTime: '2019-09-27 16:24:31',
                            updateUserId: 2,
                            updateTime: '2019-12-25 12:51:28',
                            children: [
                                {
                                    deptId: 122,
                                    deptName: '交管1',
                                    deptParentId: 12,
                                    deptCode: null,
                                    deptDesc: '1',
                                    createUserId: 18,
                                    createTime: '2019-12-27 11:31:04',
                                    updateUserId: null,
                                    updateTime: null,
                                    children: null,
                                    deptParentName: '交管',
                                    deleteFlag: null
                                },
                                {
                                    deptId: 133,
                                    deptName: '交管2',
                                    deptParentId: 12,
                                    deptCode: null,
                                    deptDesc: '1',
                                    createUserId: 18,
                                    createTime: '2019-12-27 11:31:04',
                                    updateUserId: null,
                                    updateTime: null,
                                    children: null,
                                    deptParentName: '交管',
                                    deleteFlag: null
                                }
                            ],
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        },
                        {
                            deptId: 13,
                            deptName: '監(jiān)管',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: '監(jiān)管',
                            createUserId: 1,
                            createTime: '2019-09-27 16:52:37',
                            updateUserId: 2,
                            updateTime: '2019-12-23 11:07:14',
                            children: null,
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        },
                        {
                            deptId: 14,
                            deptName: '科信',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: '科信',
                            createUserId: 1,
                            createTime: null,
                            updateUserId: 2,
                            updateTime: '2019-12-23 11:07:33',
                            children: null,
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        },
                        {
                            deptId: 15,
                            deptName: '法制總隊(duì)',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: '法制總隊(duì)',
                            createUserId: 1,
                            createTime: null,
                            updateUserId: 1,
                            updateTime: '2019-12-19 16:50:58',
                            children: null,
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        },
                        {
                            deptId: 16,
                            deptName: '其他業(yè)務(wù)警種',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: '其他業(yè)務(wù)警種',
                            createUserId: 1,
                            createTime: null,
                            updateUserId: 1,
                            updateTime: '2019-12-19 16:57:44',
                            children: null,
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        },
                        {
                            deptId: 45,
                            deptName: 'sad',
                            deptParentId: 1,
                            deptCode: null,
                            deptDesc: 'asd',
                            createUserId: 1,
                            createTime: '2019-12-20 14:24:05',
                            updateUserId: null,
                            updateTime: null,
                            children: null,
                            deptParentName: '民生業(yè)務(wù)組',
                            deleteFlag: null
                        }
                    ],
                    deptParentName: null,
                    deleteFlag: null
                }
            ]
        }
    }
}
</script>
<style lang="scss" scoped></style>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末誉券,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侣夷,更是在濱河造成了極大的恐慌横朋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件百拓,死亡現(xiàn)場(chǎng)離奇詭異琴锭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)衙传,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蓖捶,“玉大人地回,你說(shuō)我怎么就攤上這事】∮悖” “怎么了刻像?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)并闲。 經(jīng)常有香客問(wèn)我细睡,道長(zhǎng),這世上最難降的妖魔是什么帝火? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任溜徙,我火速辦了婚禮湃缎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蠢壹。我一直安慰自己嗓违,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布图贸。 她就那樣靜靜地躺著蹂季,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疏日。 梳的紋絲不亂的頭發(fā)上乏盐,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音制恍,去河邊找鬼。 笑死神凑,一個(gè)胖子當(dāng)著我的面吹牛净神,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溉委,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鹃唯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瓣喊?” 一聲冷哼從身側(cè)響起坡慌,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎藻三,沒(méi)想到半個(gè)月后洪橘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棵帽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年熄求,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逗概。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弟晚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逾苫,到底是詐尸還是另有隱情卿城,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布铅搓,位于F島的核電站瑟押,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狸吞。R本人自食惡果不足惜勉耀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一指煎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧便斥,春花似錦至壤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晋渺,卻和暖如春镰绎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背木西。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工畴栖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人八千。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓吗讶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恋捆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子照皆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348