找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 22|回复: 0

html案例-待办事项(Todo)

[复制链接]
发表于 2025-4-1 16:52:41 | 显示全部楼层 |阅读模式
当然可以!下面是一个较为复杂的前端代码示例,包含了 Vue.js 的使用、组件化、路由、状态管理(Vuex)和 API 调用。
这个示例是一个简单的待办事项(Todo)应用,它允许用户添加、删除和查看待办事项,同时使用 Vue Router 进行页面路由,并用 Vuex 管理应用的状态。
项目结构
  1. my-todo-app/

  2. ├── public/
  3. │   └── index.html

  4. ├── src/
  5. │   ├── components/
  6. │   │   ├── TodoList.vue
  7. │   │   ├── TodoItem.vue
  8. │   │   └── AddTodo.vue
  9. │   │
  10. │   ├── store/
  11. │   │   └── index.js
  12. │   │
  13. │   ├── views/
  14. │   │   └── TodoView.vue
  15. │   │
  16. │   ├── App.vue
  17. │   └── main.js

  18. └── package.json
复制代码

依赖安装首先,确保你有 Vue CLI,接着在你的项目目录中,安装所需的依赖:
npm install vue vue-router vuex axios1. index.html在 public/index.html 中:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Todo App</title>
  7. </head>
  8. <body>
  9.     <div id="app"></div>
  10. </body>
  11. </html>
复制代码

2. main.js在 src/main.js 中:
  1. import Vue from 'vue';
  2. import App from './App.vue';
  3. import router from './router';
  4. import store from './store';

  5. Vue.config.productionTip = false;

  6. new Vue({
  7.     router,
  8.     store,
  9.     render: h => h(App),
  10. }).$mount('#app');
复制代码

3. App.vue在 src/App.vue 中:
  1. <template>
  2.   <div id="app">
  3.     <router-view></router-view>
  4.   </div>
  5. </template>

  6. <script>
  7. export default {
  8.   name: 'App'
  9. }
  10. </script>

  11. <style>
  12. #app {
  13.   font-family: Avenir, Helvetica, Arial, sans-serif;
  14.   text-align: center;
  15.   color: #2c3e50;
  16.   margin-top: 60px;
  17. }
  18. </style>
复制代码

4. router/index.js在 src/router/index.js 中:
  1. import Vue from 'vue';
  2. import Router from 'vue-router';
  3. import TodoView from '../views/TodoView.vue';

  4. Vue.use(Router);

  5. const routes = [
  6.   {
  7.     path: '/',
  8.     name: 'Todo',
  9.     component: TodoView,
  10.   },
  11. ];

  12. const router = new Router({
  13.   mode: 'history',
  14.   base: process.env.BASE_URL,
  15.   routes,
  16. });

  17. export default router;
复制代码

5. store/index.js在 src/store/index.js 中:
  1. import Vue from 'vue';
  2. import Vuex from 'vuex';
  3. import axios from 'axios';

  4. Vue.use(Vuex);

  5. export default new Vuex.Store({
  6.   state: {
  7.     todos: [],
  8.   },
  9.   mutations: {
  10.     SET_TODOS(state, todos) {
  11.       state.todos = todos;
  12.     },
  13.     ADD_TODO(state, todo) {
  14.       state.todos.push(todo);
  15.     },
  16.     DELETE_TODO(state, todoId) {
  17.       state.todos = state.todos.filter(todo => todo.id !== todoId);
  18.     },
  19.   },
  20.   actions: {
  21.     fetchTodos({ commit }) {
  22.       axios.get('https://jsonplaceholder.typicode.com/todos')
  23.         .then(response => {
  24.           commit('SET_TODOS', response.data);
  25.         });
  26.     },
  27.   },
  28.   getters: {
  29.     allTodos: state => state.todos,
  30.   },
  31. });
复制代码

6. views/TodoView.vue在 src/views/TodoView.vue 中:
  1. <template>
  2.   <div>
  3.     <h1>Todo List</h1>
  4.     <add-todo @addTodo="addTodo" />
  5.     <todo-list :todos="todos" @deleteTodo="deleteTodo" />
  6.   </div>
  7. </template>

  8. <script>
  9. import { mapState } from 'vuex';
  10. import TodoList from '../components/TodoList.vue';
  11. import AddTodo from '../components/AddTodo.vue';

  12. export default {
  13.   components: {
  14.     TodoList,
  15.     AddTodo,
  16.   },
  17.   computed: {
  18.     ...mapState(['todos']),
  19.   },
  20.   methods: {
  21.     addTodo(todo) {
  22.       this.$store.commit('ADD_TODO', todo);
  23.     },
  24.     deleteTodo(todoId) {
  25.       this.$store.commit('DELETE_TODO', todoId);
  26.     },
  27.   },
  28.   created() {
  29.     this.$store.dispatch('fetchTodos');
  30.   },
  31. }
  32. </script>
复制代码

7. components/TodoList.vue在 src/components/TodoList.vue 中:
  1. <template>
  2.   <div>
  3.     <ul>
  4.       <todo-item
  5.         v-for="todo in todos"
  6.         :key="todo.id"
  7.         :todo="todo"
  8.         @delete="deleteTodo(todo.id)" />
  9.     </ul>
  10.   </div>
  11. </template>

  12. <script>
  13. import TodoItem from './TodoItem.vue';

  14. export default {
  15.   components: {
  16.     TodoItem,
  17.   },
  18.   props: {
  19.     todos: Array,
  20.   },
  21.   methods: {
  22.     deleteTodo(todoId) {
  23.       this.$emit('deleteTodo', todoId);
  24.     },
  25.   },
  26. }
  27. </script>
复制代码

8. components/TodoItem.vue在 src/components/TodoItem.vue 中:
  1. <template>
  2.   <li>
  3.     <span>{{ todo.title }}</span>
  4.     <button @click="deleteTodo">Delete</button>
  5.   </li>
  6. </template>

  7. <script>
  8. export default {
  9.   props: {
  10.     todo: Object,
  11.   },
  12.   methods: {
  13.     deleteTodo() {
  14.       this.$emit('delete', this.todo.id);
  15.     },
  16.   },
  17. }
  18. </script>
复制代码

9. components/AddTodo.vue在 src/components/AddTodo.vue 中:
  1. <template>
  2.   <div>
  3.     <input v-model="newTodo" placeholder="Add a new todo" />
  4.     <button @click="addNewTodo">Add</button>
  5.   </div>
  6. </template>

  7. <script>
  8. export default {
  9.   data() {
  10.     return {
  11.       newTodo: '',
  12.     };
  13.   },
  14.   methods: {
  15.     addNewTodo() {
  16.       if (this.newTodo.trim()) {
  17.         const todo = {
  18.           id: Date.now(),
  19.           title: this.newTodo,
  20.         };
  21.         this.$emit('addTodo', todo);
  22.         this.newTodo = '';
  23.       }
  24.     },
  25.   },
  26. }
  27. </script>
复制代码

运行应用确保在项目根目录下,使用以下命令启动应用:
  1. npm run serve
复制代码

打开浏览器并访问 http://localhost:8080,你将看到一个简单的待办事项应用。你可以添加待办事项并且删除它们,同时从 API 中获取初始的待办事项列表。
扩展功能你可以根据需要扩展这个应用,例如:
  • 使用持久化存储(如 localStorage)存储待办事项。
  • 为待办事项添加完成状态。
  • 增加样式美化界面。
这种架构为复杂的前端应用提供了良好的基础,可以按需进行扩展和调整。希望这个案例对你有帮助!如果有任何疑问或者需要更详细的解释,请随时问我。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|星星学习网

GMT+8, 2025-4-22 09:15 , Processed in 0.092331 second(s), 13 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表