You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vue.js待办事项应用中集成LocalStorage?

Hey there! Let's break down how to implement LocalStorage for your Vue.js todo app clearly—no unnecessary plugins required, and we’ll keep the logic clean and maintainable.

You don’t need a third-party plugin for this! The browser’s native localStorage API is lightweight and straightforward for your use case. If you want to remove it, run:

npm uninstall vue-localstorage

Where to put the LocalStorage logic?

Not just in CreatingTodo.vue—since your todo list gets modified in multiple places (creating, deleting, completing, editing), you’ll want a single source of truth for storage. The best place is your root App.vue component, where you can centralize all todo data and sync it to LocalStorage whenever changes happen.

Step-by-step implementation

Let’s walk through how to update your App.vue and components to handle storage:

1. Update App.vue to manage todos and storage

This component will hold the todo list, load saved data on mount, and sync changes to LocalStorage every time the list updates:

<template>
  <div id="app">
    <CreatingTodo @add-todo="addTodo" />
    <TodoList 
      :todos="todos" 
      @delete-todo="deleteTodo" 
      @toggle-complete="toggleComplete"
    />
    <EditTodo @edit-todo="updateTodo" />
  </div>
</template>

<script>
import CreatingTodo from './components/CreatingTodo.vue';
import TodoList from './components/TodoList.vue';
import EditTodo from './components/EditTodo.vue';

export default {
  components: {
    CreatingTodo,
    TodoList,
    EditTodo
  },
  data() {
    return {
      todos: []
    };
  },
  mounted() {
    // Load saved todos from LocalStorage when the app starts
    const savedTodos = localStorage.getItem('vue-todo-app');
    if (savedTodos) {
      this.todos = JSON.parse(savedTodos);
    }
  },
  methods: {
    addTodo(newTodo) {
      this.todos.push(newTodo);
      this.saveTodosToStorage();
    },
    deleteTodo(todoId) {
      this.todos = this.todos.filter(todo => todo.id !== todoId);
      this.saveTodosToStorage();
    },
    toggleComplete(todoId) {
      this.todos = this.todos.map(todo => {
        if (todo.id === todoId) {
          return { ...todo, completed: !todo.completed };
        }
        return todo;
      });
      this.saveTodosToStorage();
    },
    updateTodo(updatedTodo) {
      this.todos = this.todos.map(todo => 
        todo.id === updatedTodo.id ? updatedTodo : todo
      );
      this.saveTodosToStorage();
    },
    saveTodosToStorage() {
      // LocalStorage only stores strings, so we stringify our array
      localStorage.setItem('vue-todo-app', JSON.stringify(this.todos));
    }
  }
};
</script>

2. Update your child components to emit changes

Each component that modifies todos will emit events to App.vue instead of handling storage themselves:

  • TodoList.vue (your existing delete/complete logic):
<script>
export default {
  props: ['todos'],
  methods: {
    handleDelete(todoId) {
      this.$emit('delete-todo', todoId);
    },
    handleToggleComplete(todoId) {
      this.$emit('toggle-complete', todoId);
    }
  }
};
</script>
  • CreatingTodo.vue: When a new todo is created, emit it to App.vue:
<script>
export default {
  methods: {
    publishNewTodo() {
      const newTodo = {
        id: Date.now(), // Simple unique ID
        text: this.todoText,
        completed: false
      };
      this.$emit('add-todo', newTodo);
      this.todoText = ''; // Clear input
    }
  }
};
</script>
  • EditTodo.vue: When a todo is edited, emit the updated object:
<script>
export default {
  props: ['todoToEdit'],
  methods: {
    saveEditedTodo() {
      const updatedTodo = {
        ...this.todoToEdit,
        text: this.editedText
      };
      this.$emit('edit-todo', updatedTodo);
    }
  }
};
</script>

Why this approach works

  • Single source of truth: All todo data lives in App.vue, so you never have conflicting versions in storage.
  • DRY code: The storage logic is written once in saveTodosToStorage() and reused across all modification methods.
  • Consistency: Every time the todo list changes (add, delete, complete, edit), it’s immediately synced to LocalStorage.

Quick notes

  • LocalStorage only stores strings, so we use JSON.stringify() and JSON.parse() to convert our todo array.
  • If your todos include dates or other non-serializable values, you’ll need to handle those manually (e.g., convert dates back to Date objects when loading).
  • Use a unique key for your LocalStorage entry (like vue-todo-app) to avoid conflicts with other apps.

内容的提问来源于stack exchange,提问作者Denitsa Zhekova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:24:01