typescript Svelte Darkmode按钮需要点击两次

kq0g1dla  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(177)

我目前正在努力进入Svelte。这是我学习HTML,CSS和JS后的第一个框架。
我想在黑暗和光明模式之间切换。为此,我遵循了以下教程:https://www.youtube.com/watch?v=OyjZ7dezADw
唯一的区别是我使用标准的材质图标。
问题是页面加载后,我必须按两次黑暗模式按钮才能更改图标。视频中也描述了该问题,并使用onMount修复,但此修复对我不起作用。
我尝试了很多方法,但是在创建DOM时,变量darkTheme总是未定义。
有没有人碰巧有给初学者的小费?
__layout.svelte:

<script lang="ts">
  import { onMount } from "svelte";
  import TopAppBar, {
    Row,
    Section,
    Title,
    AutoAdjust,
  } from "@smui/top-app-bar";
  import IconButton from "@smui/icon-button";

  let topAppBar: TopAppBar;

  let darkTheme: boolean | undefined = undefined;

  onMount(() => {
    darkTheme = window.matchMedia("(prefers-color-scheme: dark)").matches;
    darkTheme = darkTheme;
  });
</script>

<svelte:head>
  <!-- Dark and Lightmode CSS change-->
  <!-- SMUI Styles -->
  {#if darkTheme === undefined}
    <link
      rel="stylesheet"
      href="/smui.css"
      media="(prefers-color-scheme: light)"
    />
    <link
      rel="stylesheet"
      href="/smui-dark.css"
      media="screen and (prefers-color-scheme: dark)"
    />
  {:else if darkTheme}
    <link rel="stylesheet" href="/smui.css" />
    <link rel="stylesheet" href="/smui-dark.css" media="screen" />
  {:else}
    <link rel="stylesheet" href="/smui.css" />{/if}
</svelte:head>

<!--TopAppBar-->
<TopAppBar bind:this={topAppBar} variant="fixed" color="primary">
  <Row>
    <Section>
      <div style="display: flex; align-items: center;">
        <!--Darkmode Button-->
        <IconButton
          on:click={() => (darkTheme = !darkTheme)}
          class="material-icons"
          aria-label="Darkmode"
          >{darkTheme ? "light_mode" : "dark_mode"}</IconButton
        >
      </div>
      <Title>Test</Title>
    </Section>
    <Section align="end" toolbar>
      <IconButton class="material-icons" aria-label="calendar"
        >calendar_month</IconButton
      >
      <IconButton class="material-icons" aria-label="books"
        >menu_book</IconButton
      >
      <IconButton class="material-icons" aria-label="profile"
        >account_circle</IconButton
      >
    </Section>
  </Row>
</TopAppBar>
<AutoAdjust {topAppBar}>
  <slot />
</AutoAdjust>

<style>
  :global(.mdc-)

  /* Hide everything above this component. */
  :global(#smui-app),
  :global(body),
  :global(html) {
    display: block !important;
    height: auto !important;
    width: auto !important;
    position: static !important;
  }
</style>
icomxhvb

icomxhvb1#

1.可以使用true/false而不是undefined初始化darkTheme变量
1.另外,尝试使用beforeUpdate生命周期事件(* 在DOM更新前立即运行 )来设置onMount 在组件首次呈现到DOM后运行 *)。
1.也可以尝试使用darkTheme的React变量$:,如下所示:darkTheme = true // false //未定义

相关问题