如何使用道具和本地存储制作 vue3 暗模式?

Posted

技术标签:

【中文标题】如何使用道具和本地存储制作 vue3 暗模式?【英文标题】:How to make vue3 darkmode with props and localstorage? 【发布时间】:2021-08-07 10:18:42 【问题描述】:

我有 2 个 vue 文件,我想制作 darkMode。当我单击导航栏上的图像时,对 Content.vue 没有影响。我尝试使用道具,但它不起作用,因为我在 Content.vue 中导入导航栏而不是相反。我使用本地存储,但它不是反应式的,所以如果我点击导航栏中的图像,内容不会反应。

Navbar.vue

  <template>
      <nav class="navbar">  
          <ul>
            <img
              src="https://img.icons8.com/android/48/ffffff/sun.png"
              @click="darkMode = !darkMode"
              v-if="darkMode"
            />
            <img
              src="https://img.icons8.com/ios-filled/50/ffffff/moon-man.png"
              @click="darkMode = !darkMode"
              v-if="!darkMode"
            />
          </ul>
        </div>
      </nav>
    </template>

<script>
export default 
  name: "Navbar",
  data() 
    return 
      darkMode: "",
    ;
  ,
  watch: 
    darkMode: function () 
      localStorage.setItem("darkMode", this.darkMode);
    ,
  ,
  created() 
    this.darkMode = localStorage.getItem("darkMode");
  ,
  mounted() 
    if (localStorage.getItem("darkMode") == "true") 
      this.darkMode = true;
     else 
      this.darkMode = false;
    
  ,
;
</script>    

Content.vue

<template>
  <Navbar />
  <div :class=" dark: dark ">
    <h1>Test</h1>
  </div>
  </div>
</template>

<script>
import Navbar from './Navbar'
export default 
  name: "Content",
  components:  Navbar ,
  data() 
    return 
    ;
  ,
;
</script>

【问题讨论】:

【参考方案1】:

在我看来有以下问题:

localStorage 在 created() 中不可用 使用 JSON 将值存储在 localStorage 中,不要依赖自动字符串转换。

试试这个建议:

<template>
  <nav class="navbar">  
    <ul>
      <img
        :src="imageDarkMode"
        @click="toggleDarkMode"
      />
    </ul>
  </nav>
</template>

<script>
export default 
  name: "Navbar",
  data() 
    return 
      darkMode: false,
    ;
  ,
  computed: 
    imageDarkMode() 
      return this.darkMode ? 
        "https://img.icons8.com/android/48/ffffff/sun.png" : 
        "https://img.icons8.com/ios-filled/50/ffffff/moon-man.png";
    
  ,
  mounted() 
    this.darkMode = !!JSON.parse(localStorage.getItem("darkMode"));
  ,
  toggleDarkMode() 
    this.darkMode = !this.darkMode;
    localStorage.setItem("darkMode", JSON.stringify(this.darkMode));
  
;
</script> 

【讨论】:

以上是关于如何使用道具和本地存储制作 vue3 暗模式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MUI V5 最新版本通过 React、Next JS 和本地存储切换暗模式

vue3.0 监听本地存储

如何在同一个反应组件中使用本地状态和 redux 存储状态?

在 react native 0.60.3 和 Xcode 11 中加载本地图像

如何使用按钮删除本地网络存储中的对象[重复]

如何制作正确过滤本地字符的 NSPredicate?