Cara-cara: Tukar mod gelap menggunakan TailwindCSS + Vue3 + Vite
P粉933003350
P粉933003350 2023-11-01 12:05:00
0
1
662

Saya seorang pemula dalam Vite/Vue3 dan pada masa ini saya menghadapi masalah di mana saya memerlukan gabungan pengetahuan komuniti.

Saya mencipta aplikasi Vite/Vue3 dan memasang TailwindCSS:

npm create vite@latest my-vite-vue-app -- --template vue
cd my-vite-vue-app
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

Kemudian saya mengikuti arahan pada halaman utama Tailwind:

Tambah laluan semua fail templat dalam fail tailwind.config.js.

Import fail ./src/index.css yang baru dibuat ke dalam fail ./src/main.js.

Cipta fail ./src/index.css dan tambahkan lapisan Tailwind arahan @tailwind pada setiap fail.

Sekarang saya mempunyai aplikasi Vite/Vue3/TailwindCSS yang sedang berjalan dan ingin menambah keupayaan untuk menogol mod gelap.

Dokumentasi Tailwind menunjukkan bahawa ini boleh dilakukan dengan menandainya dengan darkMode: 'class' 添加到 tailwind.config.js 来存档,然后将类 dark 切换为 <html>.

Saya melakukan kerja menggunakan kod berikut:

  1. Dalamanindex.html



<html lang="en" id="html-root">
  (...)
  <body class="antialiased text-slate-500 dark:text-slate-400 bg-white dark:bg-slate-900">
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>
  1. Mengenai.vue dalaman



<template>
  <div>
    <h1>This is an about page</h1>
    <button @click="toggleDarkMode">Toggle</botton>
  </div>
</template>

<script>
  export default {
    methods: {
      toggleDarkMode() {
        const element = document.getElementById('html-root')
        if (element.classList.contains('dark')) {
          element.classList.remove('dark')
        } else {
          element.classList.add('dark')
        }
      },
    },
  };
</script>

Ya, saya tahu ini bukan kod gaya Vue3. Dan, ya, saya tahu ia boleh digunakan element.classList.toggle() 而不是 .remove().add() . Tetapi mungkin pemula lain seperti saya akan melihat ini pada masa hadapan dan menghargai beberapa kod mudah untuk dimulakan. Jadi mohon belas kasihan...

Kini saya akhirnya mempunyai soalan untuk ditanya kepada komuniti:

Saya tahu memanipulasi DOM seperti ini bukanlah cara Vue melakukan sesuatu. Sudah tentu, saya mahu mencapai matlamat saya dengan cara yang betul. Tetapi apa yang perlu saya lakukan?

Percayalah, saya mencari di google selama berjam-jam dan tidak dapat mencari penyelesaian yang berfungsi tanpa memasang ini dan ini dan ini modul npm tambahan.

Tetapi saya mahukan pendekatan minimalis. Bergantunglah pada sesedikit mungkin agar tidak membebankan saya dan orang lain yang ingin mula belajar.

Dengan ini sebagai latar belakang - adakah anda mempunyai penyelesaian yang sesuai untuk saya dan pemula lain? :-)

P粉933003350
P粉933003350

membalas semua(1)
P粉340264283

Elemen sasaran acara anda adalah di luar aplikasi anda. Ini bermakna tiada cara untuk berinteraksi dengannya selain menanyakannya melalui kaedah yang tersedia dalam DOM.

Dalam erti kata lain, anda melakukan perkara yang betul . Jika elemen itu berada di dalam aplikasi anda, maka anda hanya memautkan kelas kepada atribut anda dan biarkan Vue mengendalikan butiran manipulasi DOM:

:class="{ dark: darkMode }"

Tetapi bukan itu yang berlaku.


Sebagai nota sampingan, sangat penting bahawa kaedah togol anda tidak bergantung pada sama ada elemen <body> mempunyai kelas untuk memutuskan sama ada ia perlu digunakan/dialih keluar. Anda harus mengekalkan nilai yang disimpan dalam keadaan aplikasi, yang sepatutnya menjadi satu-satunya sumber kebenaran anda.
Ini ialah prinsip Vue yang anda tidak mahu pecahkan: biarkan data memacu keadaan DOM, bukan sebaliknya.

Nilai boleh diperolehi daripada keadaan semasa <body> (apabila dipasang), tetapi sejak itu, perubahan kepada keadaan aplikasi akan menentukan sama ada kelas hadir pada elemen.

vue2 contoh:

Vue.config.devtools = false;
Vue.config.productionTip = false;
new Vue({
  el: '#app',
  data: () => ({
    darkMode: document.body.classList.contains('dark')
  }),
  methods: {
    applyDarkMode() {
      document.body.classList[
        this.darkMode ? 'add' : 'remove'
      ]('dark')
    }
  },
  watch: {
    darkMode: 'applyDarkMode'
  }
})
body.dark {
  background-color: #191919;
  color: white;
}
sssccc

Lihat 3 contoh:

const {
  createApp,
  ref,
  watchEffect
} = Vue;

createApp({
  setup() {
    const darkMode = ref(document.body.classList.contains('dark'));
    const applyDarkMode = () => document.body.classList[
      darkMode.value ? 'add' : 'remove'
    ]('dark');
    watchEffect(applyDarkMode);
    return { darkMode };
  }
}).mount('#app')
body.dark {
  background-color: #191919;
  color: white;
}
sssccc

Jelas sekali, jika anda menggunakannya dalam berbilang komponen darkMode 的状态,您可能希望将 darkMode 的状态保留在 data 中的某个外部存储中,而不是本地(并通过 compulated sediakan dalam komponen anda).

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!