首页 > 其他分享 >构建交互式待办事项应用:使用React和Redux实现技术深度实战

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

时间:2023-10-23 10:04:34浏览次数:41  
标签:const React 待办 import Redux todo id

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

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

技术栈:

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

标签:const,React,待办,import,Redux,todo,id
From: https://blog.51cto.com/u_16297326/7983248

相关文章

  • 在 React 中扩展运算符的语法
    在React中,三个点...是扩展运算符(SpreadOperator)的语法,用于展开数组、对象或函数参数。1:展开数组:使用扩展运算符可以将一个数组展开为另一个数组。在创建新的数组时非常有用。constarr1=[1,2,3];constarr2=[...arr1,4,5,6];console.log(arr2);//[1,2,3,4,5......
  • React框架的基本运行原理与组件定义方式
    React框架的基本运行原理React的本质是内部维护了一套虚拟DOM树,这个虚拟DOM树就是一棵js对象树,它和真实DOM树是一致的,一一对应的。当某一个组件的state发生修改时,就会生成一个新的虚拟DOM,让它和旧的虚拟DOM通过Diff算法进行对比,生成一组差异对象。然后变量差异对象,将修改更新......
  • React学习笔记14-dangerousSetinnerHtml指令
    1.使用场景dangerouslySetInnerHTML指令能将字符串当做html解析相当于vue中的v-html指令一般我们用来渲染富文本返回的html文本2.使用方法{this.state.tolist.map((item,index)=>{return(<spandangerouslySetInnerHTML={{__html:item}}ke......
  • React DockerFile 镜像部署
    1.配置Node.js运行环境(可以不用配置)   1>wget https://nodejs.org/dist/v12.18.1/node-v12.18.1-linux-x64.tar.gz   2>sudotar-zxvfnode-v12.18.1-linux-x64.tar.gz   3>cp-a/root/node-v12.18.1-linux-x64/bin/node/usr/local/bin/node  4......
  • React学习笔记12-循环渲染
    在vue中我们一般是通过v-for指令来进行循环渲染的,但react中没有封装相关指令供我们调用在react中我们可以通过数组的map方法来进行数据的循环渲染importReact,{Component}from'react'exportdefaultclassAppextendsComponent{constructor(){super(......
  • React学习笔记11-状态(state)
    状态就是组件的数据,由组件自己设置和更改,也就是说由组件自己维护,使用状态的目的就是为了在不同的状态下使组件的显示不同(自己管理) 定义状态的方法 可以在构造函数中定义也可以直接在类中通过变量的形式来定义/*eslint-disableeqeqeq*/importReact,{Component}f......
  • React学习笔记10- Ref的应用
    用法1.给标签设置ref="username"通过这个获取this.refs.username,ref可以获取到应用的真实dom2.给组件设置ref="username"通过这个获取this.refs.username,ref可以获取到组件对象 写法importReact,{Component}from'react'exportdefaultclassAppextendsC......
  • React学习笔记09- 事件处理
    React采用on+事件名的方式来绑定一个事件,注意,这里和原生的事件是有区别的,原生的事件全是小写onclick,React里的事件是驼峰onClick,React的事件并不是原生事件,而是合成事件。 事件回调的几种写法1.直接在组件内定义一个非箭头函数的方法,然后在render里直接使用onClick={......
  • react native 退出登录后清空路由栈并返回登录页
    背景:由于项目使用的expo-router,一开始时在退出登录是如下实现的:import{router}from"expo-router";...router.replace("/my/login/login");...使用expo-router的router.replace方法跳转至登录页。结果发现虽然跳转成功,但是点击手机返回操作时,虽然上一个页面没有了......
  • react项目中预览pdf文件
    最近需求,要在b端展示上传的pdf文件。实现方式有很多,记录一下我们最常用的pdf.js//安装"pdfjs-dist":"2.0.402"//引入import*aspdfjsfrom'pdfjs-dist'import*aspdfjsWorkerfrom'pdfjs-dist/build/pdf.worker.entry'//定义初始值letpdfDoc=null;......