@NDll

Как реализовать модальное окно на vue?

Есть сама модалка (каркас) MSide

<template>
  <div class="side">
    <div class="sideClose">x</div>
    <div class="sideContainer">
      <slot/>
    </div>
  </div>
</template>

<script lang="ts" setup>
import {defineProps} from 'vue'

const props = defineProps({
  classname: {
    type: String,
    default: ''
  },
  center: {
    type: Boolean,
    default: true,
  },
  name: {
    type: String,
    default: 'modal'
  }
})

</script>

<style lang="scss">
.side {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 3000;
  background-color: rgba(0, 0, 0, 0.4);
  transition: .6s;
  overflow: hidden;

  &Container {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    z-index: 3001;
    display: block;
    width: calc(100% - 300px);
    background: #ffffff;
    transform: translateX(0);
    transition: .4s;
  }

  &Close {
    position: absolute;
    right: 20px;
    top: 20px;
    cursor: pointer;
    transition: 0.4s;
    z-index: 5;

    svg {
      width: 18px;
      height: 18px;
    }

    &:hover {
      transform: rotate(90deg);
    }
  }
}
</style>

есть компонент MAttributes для выбора атрибутов

<template>
  <div class="attributes">
    <div class="attributesHeader">Атрибуты</div>
    <div class="attributesBody">
      <div class="attributesSection">
        <div class="attributesCategory">Группа атрибута</div>
        <div class="attributesList">
          <div class="attributesItem">
            <button
                class="btn btnDarkOutline"
                @click.prevent="changeAttribute(1, 'Название атрибута')"
            >Название атрибута
            </button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script lang="ts">
import {defineComponent} from 'vue'
import {useAttributeStore} from "@/store/attribute";

import MSide from "@/components/modals/MSide.vue";

export default defineComponent({
  components: {
    MSide,
  },
  props: {
    name: {
      type: String,
      default: 'modal'
    }
  },
  setup(props, {emit}) {

    const attrStore = useAttributeStore()

    const changeAttribute = (data: any) => {
      try {
        attrStore.putSelected(data)
      } catch (e: any) {
        console.log(e)
      }
    }

    return {
      changeAttribute,
    }
  },
})
</script>

<style lang="scss">
.attributes {
  &Header {
    font-weight: 600;
    font-size: 34px;
    padding: 40px 30px 30px;
  }

  &Body {
    padding: 0 30px 30px;
  }

  &Section {
    margin-bottom: 30px;
  }

  &Category {
    font-size: 24px;
    font-weight: 600;
    padding-bottom: calc(2 * var(--gap));
    margin-bottom: calc(2 * var(--gap));
  }

  &List {
    display: flex;
    flex-wrap: wrap;
    margin-left: var(--margin-gap);
    margin-right: var(--margin-gap);
  }

  &Item {
    padding: 0 var(--gap);
    margin-bottom: calc(2 * var(--gap));
  }

  &Button {
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 5px;
    border: var(--at-border);
    padding: var(--gap) calc(2 * var(--gap));
  }
}
</style>

на странице добавления товара+ вызываю вот так

<Teleport to="#root">
    <MSide v-if="isModalAttribute">
      <MAttributes/>
    </MSide>
  </Teleport>

как можно реализовать, чтобы модалку можно было закрыть как с формы добавления товара, так и с компонента MAttributes так и MSide

При открытии этой модалки - она выезжает справа на лево, это содержимое дива sideContainer
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы