构建交互式待办事项应用:使用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的核心概念和使用方法,为开发其他复杂的前端应用提供了有力的基础。希望本文能对你的前端开发学习和实践有所帮助!

猜你喜欢

转载自juejin.im/post/7243383094773153850