构建交互式待办事项应用:使用React和Redux实现技术深度实战

简介: 构建交互式待办事项应用:使用React和Redux实现技术深度实战

本文将介绍如何使用React和Redux框架构建一个交互式的待办事项应用。我们将使用React组件化的思想和Redux的状态管理,实现待办事项的添加、完成和过滤功能。通过本文的实战演示,读者将深入了解React和Redux的使用方式和相关概念,为构建复杂的前端应用打下坚实的基础。

image.png

技术栈:

  • React:一个流行的JavaScript库,用于构建用户界面。
  • Redux:一个可预测状态容器,用于管理应用的状态。

步骤1:项目初始化和配置 首先,确保你已经安装了Node.js和npm。然后,在命令行中执行以下命令来初始化一个新的React项目:

$ npx create-react-app todo-app

进入项目目录:

$ cd todo-app

步骤2:创建任务列表组件 在src目录下创建一个名为components的文件夹,然后在该文件夹下创建一个名为TodoList.js的文件。在TodoList.js中编写以下代码:

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { addTodo, toggleTodo, deleteTodo } from '../actions/todoActions';
​
const TodoList = () => {
  const todos = useSelector(state => state.todos);
  const dispatch = useDispatch();
​
  const handleAddTodo = (e) => {
    e.preventDefault();
    const newTodo = {
      id: Date.now(),
      text: e.target.todo.value,
      completed: false
    };
    dispatch(addTodo(newTodo));
    e.target.todo.value = '';
  };
​
  const handleToggleTodo = (id) => {
    dispatch(toggleTodo(id));
  };
​
  const handleDeleteTodo = (id) => {
    dispatch(deleteTodo(id));
  };
​
  return (
    <div>
      <h2>Todo List</h2>
      <ul>
        {todos.map(todo => (
          <li key={todo.id}>
            <input type="checkbox" checked={todo.completed} onChange={() => handleToggleTodo(todo.id)} />
            <span style={
  
  { textDecoration: todo.completed ? 'line-through' : 'none' }}>{todo.text}</span>
            <button onClick={() => handleDeleteTodo(todo.id)}>Delete</button>
          </li>
        ))}
      </ul>
      <form onSubmit={handleAddTodo}>
        <input type="text" name="todo" placeholder="Enter a task" required />
        <button type="submit">Add</button>
      </form>
    </div>
  );
};
​
export default TodoList;

在上述代码中,我们定义了一个TodoList组件,它负责展示任务列表、添加任务、完成任务和删除任务。我们使用React Redux提供的useSelector和useDispatch钩子函数,分别用于从Redux的store中获取状态和派发动作。在模板中,我们使用了map方法循环渲染任务列表,并使用useState钩子和事件处理函数来处理添加、完成和删除任务的操作。

步骤3:创建Redux相关文件 在src目录下创建一个名为actions的文件夹,并在该文件夹下创建一个名为todoActions.js的文件。在todoActions.js中编写以下代码:

export const addTodo = (todo) => {
  return {
    type: 'ADD_TODO',
    payload: todo
  };
};
​
export const toggleTodo = (id) => {
  return {
    type: 'TOGGLE_TODO',
    payload: id
  };
};
​
export const deleteTodo = (id) => {
  return {
    type: 'DELETE_TODO',
    payload: id
  };
};

在上述代码中,我们定义了三个动作创建函数,分别用于添加任务、完成任务和删除任务。每个动作创建函数返回一个包含type和payload属性的对象,type用于指定动作类型,payload用于传递相关数据。

然后,在src目录下创建一个名为reducers的文件夹,并在该文件夹下创建一个名为todoReducer.js的文件。在todoReducer.js中编写以下代码:

const initialState = {
  todos: []
};
​
const todoReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'ADD_TODO':
      return {
        ...state,
        todos: [...state.todos, action.payload]
      };
    case 'TOGGLE_TODO':
      return {
        ...state,
        todos: state.todos.map(todo =>
          todo.id === action.payload ? { ...todo, completed: !todo.completed } : todo
        )
      };
    case 'DELETE_TODO':
      return {
        ...state,
        todos: state.todos.filter(todo => todo.id !== action.payload)
      };
    default:
      return state;
  }
};
​
export default todoReducer;

在上述代码中,我们定义了一个todoReducer函数,它接收当前状态和动作对象作为参数,并根据动作类型对状态进行处理。在不同的情况下,我们返回一个新的状态对象,保持了Redux的不可变性原则。

步骤4:创建根组件 在src目录下的App.js文件中编写以下代码:

import React from 'react';
import TodoList from './components/TodoList';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import todoReducer from './reducers/todoReducer';
​
const store = createStore(todoReducer);
​
const App = () => {
  return (
    <Provider store={store}>
      <div className="App">
        <TodoList />
      </div>
    </Provider>
  );
};
​
export default App;

在上述代码中,我们导入React组件TodoList、Provider组件和createStore函数。然后,创建了一个Redux的store实例,将todoReducer作为参数传入。最后,使用Provider组件将根组件包裹起来,并将store作为props传递给Provider组件。

步骤5:运行应用 在命令行中执行以下命令启动开发服务器:

$ npm start

访问http://localhost:3000/,你将看到待办事项应用的界面。你可以添加任务、完成任务和删除任务。

结论: 本文通过使用React和Redux框架,构建了一个交互式的待办事项应用。我们介绍了React的组件化思想和Redux的状态管理,包括动作创建函数和状态处理函数的编写。通过本文的实战演示,你可以掌握React和Redux的核心概念和使用方法,为构建复杂的前端应用提供了一个强大的工具。

步骤6:添加过滤功能 在src目录下的components文件夹中创建一个名为TodoFilter.js的文件。在TodoFilter.js中编写以下代码:

import React from 'react';
import { useDispatch } from 'react-redux';
import { setFilter } from '../actions/filterActions';
​
const TodoFilter = () => {
  const dispatch = useDispatch();
​
  const handleFilterChange = (e) => {
    dispatch(setFilter(e.target.value));
  };
​
  return (
    <div>
      <h2>Filter:</h2>
      <select onChange={handleFilterChange}>
        <option value="all">All</option>
        <option value="completed">Completed</option>
        <option value="active">Active</option>
      </select>
    </div>
  );
};
​
export default TodoFilter;

在上述代码中,我们定义了一个TodoFilter组件,它负责展示过滤选项和处理过滤选项的变化。我们使用React Redux提供的useDispatch钩子函数来派发设置过滤选项的动作。在模板中,我们使用select元素和onChange事件处理函数来监听过滤选项的变化,并将选中的值派发给Redux的store。

步骤7:更新根组件 在src目录下的App.js文件中,导入TodoFilter组件,并在根组件中添加TodoFilter组件。

import React from 'react';
import TodoList from './components/TodoList';
import TodoFilter from './components/TodoFilter';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import todoReducer from './reducers/todoReducer';
​
const store = createStore(todoReducer);
​
const App = () => {
  return (
    <Provider store={store}>
      <div className="App">
        <TodoFilter />
        <TodoList />
      </div>
    </Provider>
  );
};
​
export default App;

步骤12:样式化应用 在src目录下的App.css文件中,添加以下样式代码来美化应用的外观:

.App {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  margin-top: 50px;
}
​
h2 {
  margin-bottom: 10px;
}
​
ul {
  list-style: none;
  padding: 0;
}
​
li {
  margin-bottom: 10px;
}
​
input[type="checkbox"] {
  margin-right: 10px;
}
​
button {
  margin-left: 10px;
}

在上述代码中,我们对应用的容器元素、标题、任务列表、列表项、复选框和按钮等元素应用了一些基本的样式。你可以根据自己的需求进行样式调整。

总结:

本文通过一个实际的项目示例,详细介绍了如何使用React和Redux框架构建交互式的待办事项应用。从项目初始化、组件编写、状态管理到过滤功能的添加,我们逐步演示了完整的开发流程。通过这个实战项目,读者可以学习到React和Redux的核心概念和使用方法,为开发其他复杂的前端应用提供了有力的基础。希望本文能对你的前端开发学习和实践有所帮助!

相关文章
|
20天前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
24天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
125 2
|
3天前
|
移动开发 前端开发 JavaScript
React 表单验证实战
【10月更文挑战第25天】本文介绍了 React 表单验证的常见方法,包括原生 HTML5 验证、自定义验证逻辑和第三方库(如 Formik 和 Yup)的使用。通过具体代码示例,详细讲解了每种方法的实现步骤,并探讨了常见问题和易错点及其解决方法。旨在帮助开发者提高表单验证的有效性和安全性。
25 8
|
6天前
|
资源调度 前端开发 数据可视化
构建高效的数据可视化仪表板:D3.js与React的融合之道
【10月更文挑战第25天】在数据驱动的时代,将复杂的数据集转换为直观、互动式的可视化表示已成为一项至关重要的技能。本文深入探讨了如何结合D3.js的强大可视化功能和React框架的响应式特性来构建高效、动态的数据可视化仪表板。文章首先介绍了D3.js和React的基础知识,然后通过一个实际的项目案例,详细阐述了如何将两者结合使用,并提供了实用的代码示例。无论你是数据科学家、前端开发者还是可视化爱好者,这篇文章都将为你提供宝贵的洞见和实用技能。
20 5
|
4天前
|
监控 前端开发 JavaScript
确保 React 应用在出现错误时仍然能够保持响应式
【10月更文挑战第25天】可以有效地确保React应用在出现错误时仍然能够保持响应式,为用户提供更加稳定、可靠的使用体验。在实际应用中,需要根据项目的具体情况和需求,综合运用这些方法,并不断优化和完善错误处理机制,以适应不断变化的业务场景和用户需求
|
11天前
|
前端开发 JavaScript 测试技术
React 高阶组件 (HOC) 应用
【10月更文挑战第16天】高阶组件(HOC)是 React 中一种复用组件逻辑的方式,通过接受一个组件并返回新组件来实现。本文介绍了 HOC 的基础概念、核心功能和常见问题,包括静态方法丢失、ref 丢失、多个 HOC 组合和 props 冲突的解决方案,并提供了具体的 React 代码示例。通过本文,读者可以更好地理解和应用 HOC,提高代码的复用性和可维护性。
34 8
|
22天前
|
前端开发 JavaScript UED
构建现代Web应用:使用React框架打造单页面应用
【10月更文挑战第9天】构建现代Web应用:使用React框架打造单页面应用
|
22天前
|
前端开发 JavaScript 测试技术
构建响应式Web应用程序:React实战指南
【10月更文挑战第9天】构建响应式Web应用程序:React实战指南
|
22天前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
27天前
|
存储 JavaScript 前端开发
如何使用React和Redux构建现代化Web应用程序
【10月更文挑战第4天】如何使用React和Redux构建现代化Web应用程序