用React实现一个简单的待办事项列表 | 青训营

85 阅读5分钟

什么是react?

React是一个用于构建用户界面的JavaScript库。它由Facebook开发并维护,旨在帮助开发者构建高效、可重用和易于维护的UI组件。

React采用了一种称为“组件化”的开发模式,它将用户界面拆分成各个独立的组件,每个组件负责管理自己的状态和渲染逻辑。这使得代码更加模块化和可复用。通过将组件树连接起来,可以构建复杂的用户界面。

React使用虚拟DOM(Virtual DOM)技术来实现高效的UI更新。虚拟DOM是React在内存中维护的一份轻量级的副本,其结构与真实的DOM相似。当应用状态发生变化时,React会比较虚拟DOM与真实DOM的差异,并只更新必要的部分,从而避免了不必要的重新渲染,提高了性能。

React还具备单向数据流的特点,即数据的变化只能通过父组件向子组件传递,子组件无法直接修改父组件的数据。这种数据流的一致性使得应用的状态管理更加可预测和可控。

总之,React是一个用于构建用户界面的强大工具,它提供了一种组件化的开发模式、高效的UI更新机制以及可预测的数据流,帮助开发者构建出高质量、易于维护的应用程序。

为了方便初学者理解,这里使用react,实现一个简单的待办事项列表,用户可以添加、编辑和删除待办事项。


React 实现简单的待办事项列表

以下的具体的实现步骤,可以按照文字说明动手操作。

  1. 初始化,创建一个新的React项目:

    npx create-react-app todo-list
    
  2. 创建组件结构:

在src文件夹中创建一个名为TodoList的文件夹,并在其中创建以下文件:

TodoList.js:主要的待办事项列表组件。 TodoItem.js:待办事项子组件,用于显示和编辑单个待办事项。

  1. 在TodoList.js中定义主要的待办事项列表组件,并编写基本的代码结构:

    import React, { useState } from 'react';
    import TodoItem from './TodoItem';
    
    const TodoList = () => {
      const [todos, setTodos] = useState([]);
      const [inputValue, setInputValue] = useState('');
    
      const addTodo = () => {
        if (inputValue.trim() !== '') {
          setTodos([...todos, inputValue]);
          setInputValue('');
        }
      };
    
      const editTodo = (index, newValue) => {
        const updatedTodos = [...todos];
        updatedTodos[index] = newValue;
        setTodos(updatedTodos);
      };
    
      const deleteTodo = (index) => {
        const updatedTodos = todos.filter((_, i) => i !== index);
        setTodos(updatedTodos);
      };
    
      return (
        <div>
          <input
            type="text"
            value={inputValue}
            onChange={(e) => setInputValue(e.target.value)}
          />
          <button onClick={addTodo}>Add</button>
          
          {todos.map((todo, index) => (
            <TodoItem
              key={index}
              index={index}
              todo={todo}
              editTodo={editTodo}
              deleteTodo={deleteTodo}
            />
          ))}
        </div>
      );
    };
    
    export default TodoList;
    
  2. 在TodoItem.js中定义待办事项子组件:

    import React, { useState } from 'react';
    
    const TodoItem = ({ index, todo, editTodo, deleteTodo }) => {
      const [isEditing, setIsEditing] = useState(false);
      const [editValue, setEditValue] = useState(todo);
    
      const handleEdit = () => {
        if (editValue.trim() !== '') {
          editTodo(index, editValue);
          setIsEditing(false);
        }
      };
    
      return (
        <div>
          {isEditing ? (
            <>
              <input
                type="text"
                value={editValue}
                onChange={(e) => setEditValue(e.target.value)}
              />
              <button onClick={handleEdit}>Save</button>
            </>
          ) : (
            <>
              <span>{todo}</span>
              <button onClick={() => setIsEditing(true)}>Edit</button>
              <button onClick={() => deleteTodo(index)}>Delete</button>
            </>
          )}
        </div>
      );
    };
    
    export default TodoItem;
    
  3. 在src目录下的App.js中使用TodoList组件:

    import React from 'react';
    import TodoList from './TodoList/TodoList';
    
    function App() {
      return (
        <div>
          <h1>Todo List</h1>
          <TodoList />
        </div>
      );
    }
    
    export default App;
    
  4. 启动应用程序:运行npm startyarn start启动React应用程序。

现在,你应该可以在浏览器中看到一个简单的待办事项列表了。用户可以添加、编辑和删除待办事项。


在上面的实现代码中,主要使用了React的useState钩子来维护两个状态:todosinputValuetodos是一个数组,用于存储待办事项的列表。inputValue是一个字符串,用于保存输入框的值。

在添加待办事项时,通过addTodo函数将inputValue的值添加到todos数组中,并清空输入框的值。

编辑待办事项时,使用editTodo函数来弹出一个对话框,并根据用户输入的新值来更新相应的待办事项。

删除待办事项时,使用deleteTodo函数从todos数组中过滤掉指定索引的待办事项。

最后,在渲染阶段,使用map函数遍历todos数组,并为每个待办事项渲染一个列表项。对于每个列表项,还提供了“编辑”和“删除”按钮,以便用户可以进行相关操作。

要使用上述代码,只需在父组件中导入并呈现<TodoList />组件即可。


总结

上面的react案例,让我们体会到

  • React框架,能够提供高效的渲染和组件化开发方式。

  • 代码结构清晰,使用了JSX语法使得代码更易读和理解。

  • 组件划分合理,使用了函数式组件和类组件,使得逻辑和视图分离,易于维护和测试。

但是,这个案例只是入门react的一小步,还有很多值得改进的地方,比如

  1. 缺少错误处理和边界情况处理,如对API请求失败、数据为空等情况没有进行处理。
  2. 没有引入状态管理库,当应用规模变大时,可能会导致组件间的数据共享和通信困难。
  3. 未使用性能优化技巧,如shouldComponentUpdate、memoization等。

希望react的入门者,能够往以下方面进行深入学习与实践

  1. 加强对React生命周期和hooks的理解和使用,以便处理组件的加载、更新和卸载等过程。
  2. 学习并尝试使用相关的第三方库,如Redux、Mobx等,来进行状态管理和数据流控制。
  3. 注意代码质量和可维护性,遵循一些最佳实践,如单一职责原则、代码复用等。
  4. 关注性能优化方面的知识,以提高应用的性能和用户体验。
  5. 多阅读和学习React相关的文档、教程和示例,不断积累经验和提升自己的技能水平。