高山模态不从隐藏的移动菜单中打开

Alpine modal doesn't open from within hidden mobile menu

我正在设计一个布局,您可以在其中单击主菜单中的 link,它会打开一个使用 Alpine.js 的模态 window。在桌面视图中,这工作正常。

但我还有第二个导航,它只能在移动视图中查看,您必须单击汉堡图标才能打开它。 link 移动菜单中的相同模式不起作用。

下面是 HTML 的基本版本。我还创建了一个 Codepen 来说明问题。启动模态的 link 是 assessment

在桌面视图中,单击评估 打开模式。从移动菜单执行相同操作只会再次关闭菜单(这是有意为之,因为菜单 link 中的每个 link 指向页面下方的锚点)。

我需要做什么才能让模式也从移动视图启动?

<div
  id="page"
  x-data="{ 'isDialogOpen': false }"
  @keydown.escape="isDialogOpen = false"
>
  <header>
    <div>
      <nav>
        <a href="#page">home</a>
        <a href="#section-about">about</a>
        <a href="#assessment" @click="isDialogOpen = true">assessment</a>
        <a href="#section-overview">overview</a>
      </nav>

      <nav
        x-data="{ isOpen: false, isDialogOpen: false }"
        @keydown.escape="isOpen = false"
        :class="{ 'fixed left-0 w-full' : isOpen , 'absolute' : !isOpen}"
      >
        <button
          @click="isOpen = !isOpen"
          type="button"
          :class="{ 'transition transform-180 ml-8': isOpen }"
        >
          <svg>
            <path x-show="isOpen"/>
            <path x-show="!isOpen"/>
          </svg>
        </button>

        <div
          :class="{ 'block': isOpen, 'hidden': !isOpen }"
          @click.away="isOpen = false"
          x-show.transition="true"
        >
          <ul>
            <li>
              <a
                href="#page"
                @click="isOpen = false"
              >
                home
              </a>
            </li>
            <li>
              <a
                href="#section-about"
                @click="isOpen = false"
              >
                about
              </a>
            </li>
            <li>
              <a
                href="#assessment"
                @click="isDialogOpen = true, isOpen = false"
              >
                assessment
              </a>
            </li>
            <li>
              <a
                href="#section-overview"
                @click="isOpen = false"
              >
                overview
              </a>
            </li>
          </ul>
        </div>
      </nav>

    </div>

  </header>
  
  <div
    id="assessment"
    x-show="isDialogOpen"
    :class="{ 'absolute inset-0 z-40 flex items-start justify-center': isDialogOpen }"
  >
    <div
       x-show="isDialogOpen"
       @click.away="isDialogOpen = false"
    >
      <div>
        <h2>Heading</h2>
        <button type="button" @click="isDialogOpen = false">✖</button>
      </div>
      <div>
        <p>Content</p>
      </div>
    </div>
  </div>
  
</div>

您的问题主要是 div 和移动导航是两个不同的 AlpineJs 组件。移动导航有它自己的 x-data 实例,因此它有自己的范围。当您在移动导航组件上设置 isDialogOpen 时,模式不会发生任何事情,因为它不在该组件内。它在父组件中。

这里的解决方案是将您的手机 isOpen 添加到主要组件实例并删除移动导航的 x-data

<div x-data="{
    isMobileNavOpen: false,
    isDialogOpen: false,
}">
    <nav id="main">
        ...
        <span @click="isDialogOpen = true">Assessment</span>
    </nav>

    <nav id="mobile">
        <button @click="isMobileNavOpen = !isMobileNavOpen"></button>

        <div x-show="isMobileNavOpen">
            ...
            <span @click="isDialogOpen = true">Assessment</span>
        </div>
    </nav>

    <div 
    id="modal"
    x-show="isDialogOpen"></div>
</div>

您可能会发现使用 AlpineJs Dev Tools 很有帮助。当这种事情发生时,对我有很大帮助。

此外,如果在某些时候您需要能够在组件之间进行通信,请查看 Kevin Batdorf 的 Alpine Magic Helpers