iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
Vue.js

從零開始的Vue之旅系列 第 20

vue小專案-資料持久化 part1- LocalStorage

  • 分享至 

  • xImage
  •  

好的今天繼續完善我們的小專案
各位應該有發現當我們重新整理頁面或是關掉重開後,原本寫好的任務或計劃都不見了
因為原本的陣列或變數都是存在記憶體(memory)中,只要我們刷新或重新啟動,記憶體裡的資料就會消失。
如何在下次打開瀏覽器時還能看到原本設定好的任務和專案,這裡提供一個較簡易的方法
利用LocalStorage,讓瀏覽器幫我們保存資料,較方便快速且簡單,不過有幾點要注意

1.僅限單一裝置,單一瀏覽器,不同裝置看不到彼此的資料,意思就是如果你今天換了一台電腦操作,不會有原本儲存的資料
2.能存的資料容量較低,通常5MB左右
3.使用者端可直接看到內容,容易被竄改,安全性低

總結來說就是,如果只是當個人記事本,放個代辦事項或購物清單等,還是可以選擇用LocalStorage來存資料,但如果涉及到個資,帳號密碼等較重要資訊,還是乖乖建個後端資料庫存放較安全,而且後端資料庫能跨裝置同步,更方便也更安全。

我本身沒試過LocalStorage,想說來試玩看看,所以...這裡就讓我偷懶先用LocalStorage,如果後期有需要的話再改成用後端來存資料。

接著來實作如何用LocalStorage
先到App.vue
<script setup>區域
import watch

import { ref, computed, watch } from 'vue'

添加這兩段

// === 讀取 LocalStorage ===
const savedTasks = localStorage.getItem("tasks")
if (savedTasks) {
  tasks.value = JSON.parse(savedTasks)
}

// === 監聽 tasks 變化並存入 LocalStorage ===
watch(tasks, (newVal) => {
  localStorage.setItem("tasks", JSON.stringify(newVal))
}, { deep: true })

App.vue的<script setup>區域目前完整程式碼是這樣

<script setup>
import { ref, computed, watch } from 'vue'
import ProjectTracker from "./components/ProjectTracker.vue"

  // 儲存代辦事項
const newTask = ref('')
const tasks = ref([])

// === 讀取 LocalStorage ===
const savedTasks = localStorage.getItem("tasks")
if (savedTasks) {
  tasks.value = JSON.parse(savedTasks)
}

// === 監聽 tasks 變化並存入 LocalStorage ===
watch(tasks, (newVal) => {
  localStorage.setItem("tasks", JSON.stringify(newVal))
}, { deep: true })


// 新增代辦事項
function addTask() {
  if (newTask.value.trim() !== '') {
    tasks.value.push({ text: newTask.value, done: false })
    newTask.value = ''
  }
}
// 切換完成狀態
function toggleTask(index) {
  tasks.value[index].done = !tasks.value[index].done
}

// 刪除代辦事項
function deleteTask(index) {
  tasks.value.splice(index, 1)
}

//=== 計數功能 (自動更新) ===
const totalCount = computed(() => tasks.value.length)
const doneCount = computed(() => tasks.value.filter(t => t.done).length)


// === 日期標題 ===
const todayTitle = computed(() => {
  const today = new Date()
  const month = today.getMonth() + 1
  const date = today.getDate()
  const weekdays = ['日', '一', '二', '三', '四', '五', '六']
  const weekday = weekdays[today.getDay()]
  return `${month}/${date} (${weekday}) 代辦事項清單`
})
</script>

再到ProjectTracker.vue修改<script setup>區域
一樣import watch,再添加這兩段程式

// === 讀取 LocalStorage ===
const savedTasks = localStorage.getItem("tasks")
if (savedTasks) {
  tasks.value = JSON.parse(savedTasks)
}


// === 監聽 tasks 變化並存入 LocalStorage ===
watch(tasks, (newVal) => {
  localStorage.setItem("tasks", JSON.stringify(newVal))
}, { deep: true })

目前ProjectTracker.vue的<script setup>區域完整的程式碼是下方這樣
<script setup>
import { ref, computed, watch } from 'vue'
import ProjectTracker from "./components/ProjectTracker.vue"

  // 儲存代辦事項
const newTask = ref('')
const tasks = ref([])

// === 讀取 LocalStorage ===
const savedTasks = localStorage.getItem("tasks")
if (savedTasks) {
  tasks.value = JSON.parse(savedTasks)
}

// === 監聽 tasks 變化並存入 LocalStorage ===
watch(tasks, (newVal) => {
  localStorage.setItem("tasks", JSON.stringify(newVal))
}, { deep: true })

// 新增代辦事項
function addTask() {
  if (newTask.value.trim() !== '') {
    tasks.value.push({ text: newTask.value, done: false })
    newTask.value = ''
  }
}
// 切換完成狀態
function toggleTask(index) {
  tasks.value[index].done = !tasks.value[index].done
}

// 刪除代辦事項
function deleteTask(index) {
  tasks.value.splice(index, 1)
}

//=== 計數功能 (自動更新) ===
const totalCount = computed(() => tasks.value.length)
const doneCount = computed(() => tasks.value.filter(t => t.done).length)

// === 日期標題 ===
const todayTitle = computed(() => {
  const today = new Date()
  const month = today.getMonth() + 1
  const date = today.getDate()
  const weekdays = ['日', '一', '二', '三', '四', '五', '六']
  const weekday = weekdays[today.getDay()]
  return `${month}/${date} (${weekday}) 代辦事項清單`
})
</script>

這樣各位新增好代辦事項或任務後,再重新載入畫面,資料就不會突然消失了
這是我目前的畫面
https://ithelp.ithome.com.tw/upload/images/20251002/20178690bYv8uQgvdP.png
我有改了配色跟一點排版,有人有興趣會再放設定上來

明天來看如果沒有刪除LocalStorage會有甚麼影響
還有該如何手動刪除LocalStorage
(可能有人想說才裝好資料又刪,但畢竟我跟LocalStorage不熟真不清楚會有什麼影響,嗯對我又菜又愛玩)

好的各位明天見~


上一篇
vue小專案-計畫進度追蹤part2
下一篇
小閒聊-談談LocalStorage
系列文
從零開始的Vue之旅25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言