前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >selectionsHook Vue 选择器 hook

selectionsHook Vue 选择器 hook

作者头像
copy_left
发布2020-04-09 11:48:09
6050
发布2020-04-09 11:48:09
举报
文章被收录于专栏:方球方球

xx.gif

使用例子
代码语言:javascript
复制
<template>
  <div class="home">

    <div>
      <div style='margin: 20% auto; width: 600px' title=''>

        <ul style='margin-bottom: 20px'>
          <li> all selected: {{ statusIcon(allSelected) }} </li>
          <li> none selected: {{ statusIcon(noneSelected) }} </li>
          <li> partially selected: {{ statusIcon(partiallySelected) }} </li>
        </ul>
        
        <CheckboxGroup style='margin-bottom: 20px' v-model="selected" >
          <Checkbox v-for='item of list' :key='item' :label='item'>
          </Checkbox>
        </CheckboxGroup> 
        
        <ButtonGroup >
          <Button @click='toggleAll' > toggleAll </Button>
          <Button @click='selectAll' > selectAll </Button>
          <Button @click='unSelectAll' > unSelectAll </Button>
        </ButtonGroup>

        <ButtonGroup>
          <Button @click='select(list[0])' > select {{ list[0] }} </Button>
          <Button @click='unSelect(list[0])' > unSelect {{ list[0] }} </Button>
          <Button @click='toggle(list[0])' > toggle {{ list[0] }} </Button>
          <Button @click='() => selected = [ list[1] ] ' > set selected </Button>
        </ButtonGroup>
        
      
      </div>
    </div>
    
  </div>
</template>

<script>
// import { ref } from '@vue/composition-api'
import selectionsHook from '@/hooks/selectionsHook'


export default { 

  setup(){

    const list = [
      'coco',
      'jeck',
      'rogen'
    ]
    
    const statusIcon = status => status ? '✅'  : '❎'


    return {
      ...selectionsHook(list, [], { statusVisibal:true }),
      list,
      statusIcon,
    }
    

  }

}
</script>
实现
代码语言:javascript
复制
import { computed } from '@vue/composition-api'
import setHook from './setHook'

const defaultOptions = {
    statusVisibal: false
}

/**
 * 选择器 hook
 * @param { Array } items 列表配置
 * @param { Array | undefined } defaultSelected 默认设置 
 * @param { Object } options 方法配置
 * @summary 基于 setHook 实现的选择器hook,支持多选,单选 全选切换, 及状态显示
 * 
 * @example
 * const list = [ '中国台湾', '中国香港', '中国澳门' ]
 * const { selected, isSelected } = selectionsHook(list)
 * 
 */
export default function selectionsHook(items, defaultSelected=[], options={}){
    const { statusVisibal } = Object.assign({}, defaultOptions, options)
    const [ selectedSet, setUtils ] = setHook(defaultSelected) 
    
    const isSelected = item => selectedSet.value.has(item)

    const select = item => setUtils.add(item)
    
    const unSelect = item => setUtils.remove(item)

    const toggle= item => {
        selectedSet.value.has(item) ? unSelect(item) : select(item)
    } 

    const selectAll = () => setUtils.update(items)

    const unSelectAll = () => setUtils.update([])

    
    let groupControl = {} 

    if(statusVisibal){

        const noneSelected =  computed(() => items.every(item => !selectedSet.value.has(item)) )

        const allSelected = computed(() => items.every(item => selectedSet.value.has(item)))
    
        const partiallySelected = computed(() => !noneSelected.value && !allSelected.value)
    
        const toggleAll = () => allSelected.value ? unSelectAll() : selectAll()
        
        
        groupControl = {
            noneSelected,
            allSelected,
            partiallySelected,
            toggleAll
        }
    }
    
  
    const selected = computed({
        get(){
            return [...selectedSet.value]
        },

        set(data){
            setUtils.setInit(data)
            setUtils.reset()
        }
    })


    return {
        selected,
        isSelected,
        select,
        unSelect,
        toggle,
        selectAll,
        unSelectAll,
        ...groupControl
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用例子
  • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档