美文网首页
对 Button 组件防止短时间重复点击

对 Button 组件防止短时间重复点击

作者: sweetBoy_9126 | 来源:发表于2022-07-30 15:12 被阅读0次
    1. 组件内部自我沉默
      全局封装 Button 组件,接受一个 onClick 属性,本身有一个自己内部的 selfDisabled,每次点击的时候触发 props.onClick 然后将自己的 selfDisabled 置为 true,一段时间置为 false
    props: {
      onClick: () => {}
    },
    setup: (props, context) => {
      const selefDisabled = ref(false)
        const onClick = () => {
          props.onClick?.()
          selefDisabled.value = true
          setTimeout(() => {
            selefDisabled.value = false
          }, 400)
        }
    return () => (
          <button disabled={selefDisabled.value} onClick={onClick}>
            {context.slots.default?.()}
          </button>
        )
    }
    
    1. 请求前沉默,请求结束后解除沉默
      对于接口请求很慢的情况下,我们自己内部设置的时间满足不了,所以我们还需要接受一个外部传入的 disabled,然后本身 Button 组件内部的 disabled 属性先通过判断 selfDisabled 如果它是 false 在判断props.disabled
    props: {
      disabled: {
          type: Boolean as PropType<boolean>,
          default: false
        },
      autoSelfDisabled: {
        type: Boolean,
        default: false
      }
    },
    const _disabled = computed(() => {
          if (!props.autoSelfDisabled) {
            return props.disabled
          }
          if (selefDisabled.value) {
            return true
          } else {
            return props.disabled
          }
        })
    
    <button disabled={_disabled.value} type={props.type} class={[s.button, s[props.level]]} onClick={onClick}>
            {context.slots.default?.()}
          </button>
    

    两个方案结合完整代码

    props: {
      onClick: () => {},
    disabled: {
          type: Boolean as PropType<boolean>,
          default: false
        },
      autoSelfDisabled: {
        type: Boolean,
        default: false
      }
    },
    setup: (props, context) => {
      const selefDisabled = ref(false)
        const onClick = () => {
          props.onClick?.()
          selefDisabled.value = true
          setTimeout(() => {
            selefDisabled.value = false
          }, 400)
        }
    const _disabled = computed(() => {
          if (!props.autoSelfDisabled) {
            return props.disabled
          }
          if (selefDisabled.value) {
            return true
          } else {
            return props.disabled
          }
        })
    return () => (
          <button disabled={_disabled.value} onClick={onClick}>
            {context.slots.default?.()}
          </button>
        )
    }
    

    使用

    const disabled = ref(false)
    const handleClick = () => {
      disabled.value = true
      axios.post('xxx').finally(() => disabled.value = false)
    }
    <Button onClick={handleClick} disabled={disabled.value}>
    点我
    </Button>
    

    相关文章

      网友评论

          本文标题:对 Button 组件防止短时间重复点击

          本文链接:https://www.haomeiwen.com/subject/luacwrtx.html