Задать вопрос
  • Как при клике на кнопку в блоке открывать модальное окно/выезжающий сайдбар с данными того блока, в котором находиться кнопка?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавляете в стейт свойство, которое будет представлять выбранный блок:

    state: {
      opened: null,
      ...

    В экземпляры компонента Trigger передавайте соответствующие им блоки:

    <Trigger :block="block">

    props: [ 'block' ],

    Также, Trigger должен знать, какой блок открыт:

    computed: mapState([ 'opened' ]),

    Чтобы можно было назначить класс кнопке:

    :class="{ 'active' : block === opened }"

    При клике на которую следует передавать блок в мутацию:

    @click="toggleNav(block)"

    Мутация же будет устанавливать значение выбранного блока:

    toggleNav(state, block) {
      state.opened = state.opened === block ? null : block;
    },

    Это если оно действительно toggle. Если просто открытие - тогда достаточно state.opened = block (название мутации в этом случае конечно следует поменять).

    Мутация, отвечающая за закрытие, будет выглядеть так:

    closeSidebarPanel(state) {
      state.opened = null;
    },

    Геттер isNavOpen тоже изменится:

    isPanelOpen(state) {
      return !!state.opened;
    },

    Ну и наконец, можно что-нибудь вывести в Sidebar, например:

    <span v-if="isPanelOpen">{{ $store.state.opened.bName }}</span>

    Но если Sidebar предназначен конкретно для этих блоков, наверное, разумнее будет, чтобы он сам знал, кто сейчас открыт. В Sidebar'е цепляете opened к слоту:

    <slot :block="$store.state.opened"></slot>

    Соответственно, в родительском компоненте:

    <template #default="{ block }">
      <div class="sidebar-panel-settings">
        <div class="setting-block">
          {{ block.bName }}
        </div>
      </div>
    </template>
    Ответ написан
    1 комментарий