element-ui element-plus checkbox - 分析

源代码地址-checkbox
源代码地址-checkbox-group
源代码地址-checkbox-button

version:element-plus 1.0.1-beta.0

useCheckbox.ts

import {
   
   
  ref,
  computed,
  inject,
  getCurrentInstance,
  watch,
} from 'vue'
import {
   
    toTypeString } from '@vue/shared'
import {
   
    UPDATE_MODEL_EVENT } from '@element-plus/utils/constants'
import {
   
    useGlobalConfig } from '@element-plus/utils/util'
import {
   
    PartialReturnType } from '@element-plus/utils/types'
import {
   
    elFormKey, elFormItemKey } from '@element-plus/form'
import {
   
    ICheckboxGroupInstance, ICheckboxProps } from './checkbox.type'

import type {
   
    ElFormContext, ElFormItemContext } from '@element-plus/form'

export const useCheckboxGroup = () => {
   
   
  // 拿到初始化的element全局配置
  const ELEMENT = useGlobalConfig()
  // 拿到elForm中provide的数据
  const elForm = inject(elFormKey, {
   
   } as ElFormContext)
  // 拿到elFormItem中provide的数据
  const elFormItem = inject(elFormItemKey, {
   
   } as ElFormItemContext)
  // 拿到 checkboxGroup 的 provide
  const checkboxGroup = inject<ICheckboxGroupInstance>('CheckboxGroup', {
   
   })
  // 判断是不是group
  const isGroup = computed(() => checkboxGroup && checkboxGroup?.name === 'ElCheckboxGroup')
  const elFormItemSize = computed(() => {
   
   
    return elFormItem.size
  })
  return {
   
   
    isGroup,
    checkboxGroup,
    elForm,
    ELEMENT,
    elFormItemSize,
    elFormItem,
  }
}

const useModel = (props: ICheckboxProps) => {
   
   
  let selfModel = false
  const {
   
    emit } = getCurrentInstance()
  const {
   
    isGroup, checkboxGroup } = useCheckboxGroup()
  const isLimitExceeded = ref(false)
  // 如果是checkboxGroup 那么如果checkboxGroup.modelValue.value存在就取,不然就取props传进来的modelValue
  const store = computed(() => checkboxGroup ? checkboxGroup.modelValue?.value : props.modelValue)
  const model = computed({
   
   
    // ?? Null 判断运算符
    // ?? 只有运算符左侧的值为null或undefined时,才会返回右侧的值
    get() {
   
   
      return isGroup.value
        ? store.value
        : props.modelValue ?? selfModel
    },

    set(val: unknown) {
   
   
      if (isGroup.value && Array.isArray(val)) {
   
   
        isLimitExceeded.value = false

        if (checkboxGroup.min !== undefined && val.length < checkboxGroup.min.value) {
   
   
          isLimitExceeded.value = true
        }
        if (checkboxGroup.max !== undefined && val.length > checkboxGroup.max.value) {
   
   
          isLimitExceeded.value = true
        }

        isLimitExceeded.value === false && checkboxGroup?.changeEvent?.(val)
      } else {
   
   
        emit(UPDATE_MODEL_EVENT, val)
        selfModel = val as boolean
      }
    },
  })

  return {
   
   
    model,
    isLimitExceeded,
  }
}

const useCheckboxStatus = (props: ICheckboxProps, {
   
    model }: PartialReturnType<typeof useModel>) => {
   
   
  const {
   
    isGroup, checkboxGroup, elFormItemSize, ELEMENT } = useCheckboxGroup()
  // 默认false
  const focus = ref(false)
  // 读取size 就近原则
  const size = computed<string | undefined>(() => checkboxGroup?.checkboxGroupSize?.value || elFormItemSize.value || ELEMENT.size)
  // 是否选中状态
  const isChecked = computed(() => {
   
   
    const value = model.value
    if (toTypeString(value) === '[object Boolean]') {
   
   
      // boolean 类型直接返回
      return value
    } else if (Array.isArray(value)) {
   
   
      // 数组类型 返回 数组中是否存在props.label
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值