overClick.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <template>
  2. <div :id="id" class="over-click" @click="handleClick()">
  3. <div v-show="active" class="active-context">
  4. <slot name="active" />
  5. </div>
  6. <div v-show="!active" class="over-context">
  7. <slot name="overMouse" />
  8. </div>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. props: {
  14. active: {
  15. type: Boolean,
  16. default: false,
  17. required: true
  18. },
  19. id: {
  20. type: String,
  21. default: 'click-parent',
  22. required: true
  23. }
  24. },
  25. data() {
  26. return {
  27. visible: this.active,
  28. listener: null
  29. }
  30. },
  31. watch: {
  32. active: {
  33. handler(newV) {
  34. this.visible = this.active
  35. },
  36. immediate: true
  37. }
  38. },
  39. mounted() {
  40. const parent = document.getElementById(this.id)
  41. this.listener = document.addEventListener('click', (event) => {
  42. const isInner = parent.contains(event.target)
  43. if (!isInner) {
  44. this.visible = false
  45. this.$emit('update:active', this.visible)
  46. this.$emit('overMouse')
  47. }
  48. })
  49. },
  50. destroyed() {
  51. document.removeEventListener(this.listener)
  52. },
  53. methods: {
  54. handleClick() {
  55. this.visible = true
  56. this.$emit('update:active', this.visible)
  57. this.$emit('click')
  58. }
  59. }
  60. }
  61. </script>
  62. <style lang="scss" scoped>
  63. .active-context,.over-context{
  64. cursor: pointer;
  65. }
  66. </style>