typescript 如何在Astro中切换组件的显示状态

uttx8gqw  于 2022-12-19  发布在  TypeScript
关注(0)|答案(1)|浏览(142)

我定义了一个Astro组件<Header>。它有一个菜单按钮,点击这个按钮可以显示/隐藏一个组件。这是我定义组件的方式:

---
let menuHidden = true;
---
<section id="header-all"
    class="container min-w-full bg-gradient-to-br from-blue-700 to-blue-500">
    <header class="container mx-auto px-5 flex items-center justify-between h-36">
        <button id="menuButton">
            <i class='lg:hidden bx bx-menu text-white text-4xl'></i>
        </button>
    </header>

    {!menuHidden &&
    <div class="container hidden lg:hidden mx-auto px-5">
        <nav class="flex flex-col py-5 rounded-lg bg-gray-100 px-10 text-gray-100 text-xl">
            <a href="#" class="py-3 text-2xl font-semibold text-gray-800 hover:bg-yellow-300 hover:rounded-lg px-5">Home</a>
        </nav>
    </div>
    }
</section>
<script is:inline>
    const menuButton = document.getElementById('menuButton');
    menuButton?.addEventListener("click", () => {
        menuHidden = !menuHidden;
        console.log("menu hidden: ", menuHidden);
    })
</script>

当我点击按钮,我得到以下错误在我的控制台:

(index):904 Uncaught ReferenceError: menuHidden is not defined
    at HTMLButtonElement.<anonymous> ((index):904:9)

我怎样才能在astro中做到这一点?

krcsximq

krcsximq1#

在服务器不需要知道客户端菜单是否隐藏的情况下,这里最简单的方法是更改客户端的事件click,只需向菜单容器中添加一个id,然后

const menuContainer = document.getElementById('menuContainer');
menuContainer.classList.toggle("hidden")

虽然没有提到,但是您可能希望菜单状态在页面重载时保持不变,Astro是一个MPA框架,您可以通过将其转换为SPA来避免这种情况(例如使用React with Astro并将所有内容放在一页中,或者寻找其他Astro SPA解决方案),但坚持MPA Conecept这是Astro的设计目的,并且在服务器和客户机之间具有状态同步将看起来比从服务器仅加载一次页面的SPA更复杂。
然而,有两种方法可以保持服务器/客户端状态同步,让我们把菜单状态想象成一个计数器(0关闭,1打开)

  • 这里是一个客户端持久计数器的例子,在服务器端使用cookie同步,这样页面重载就不会影响它并保持它正确https://github.com/MicroWebStacks/astro-examples#13_client-persistent-counter
  • 如果无法使用cookie,则此处使用sessionStorage和url参数www.example.com执行相同的行为https://github.com/MicroWebStacks/astro-examples#14_client-storage-counter

再次警告,服务器/客户端同步可能听起来很复杂,这是由于MPA与SPA的概念。

相关问题