美文网首页
对 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