React的基本概念和特点|青训营

110 阅读7分钟

React是一个用于构建用户界面的JavaScript库,它有以下几个主要的特点:

●      组件化:React让你可以用组件的方式来构建用户界面,每个组件都是一个独立的模块,拥有自己的状态(state)和逻辑(logic),并且可以复用和组合。组件可以是函数或者类,都必须返回一个JSX元素,即一种类似于HTML的语法扩展,用来描述用户界面的结构和样式。

●      声明式:React采用声明式的编程范式,让你只需要关注你想要呈现什么,而不是如何呈现。当组件的状态或者属性(props)发生变化时,React会自动更新用户界面,而不需要你手动操作DOM。

●      高效:React通过使用虚拟DOM(Virtual DOM)来提高性能,虚拟DOM是一个内存中的DOM树的表示,当状态或属性变化时,React会先计算出虚拟DOM的变化,然后再将最小化的变化应用到真实的DOM上,避免了不必要的DOM操作。

●      灵活:React可以与其他库或框架很好地配合,例如Redux、MobX、React Router等,提供了丰富的生态系统和解决方案。React也可以用于开发原生应用程序,例如使用React Native或Expo等技术。

除了上述特点外,React还提供了一些常用的组件和钩子(hooks),让你可以更方便地管理组件的状态和生命周期。例如:

●      useState:这是一个钩子函数,让你可以在函数组件中使用状态。它接受一个初始值作为参数,并返回一个包含当前状态值和更新状态值的函数的数组。例如: import React, { useState } from 'react';

function Counter() { // 定义一个名为count的状态变量,并初始化为0 const [count, setCount] = useState(0);

// 定义一个增加count值的函数 function increment() { setCount(count + 1); }

// 返回一个显示count值和一个按钮的JSX元素 return (

You clicked {count} times

Click me
); }

●      useEffect:这是另一个钩子函数,让你可以在函数组件中执行副作用操作,例如请求数据、订阅事件、修改DOM等。它接受一个包含副作用逻辑的函数作为参数,并在每次渲染后执行该函数。你还可以通过返回一个清理函数来取消副作用或者传递一个依赖数组来控制副作用执行的条件。例如: import React, { useState, useEffect } from 'react';

function Clock() { // 定义一个名为time的状态变量,并初始化为当前时间 const [time, setTime] = useState(new Date());

// 定义一个更新time值的函数 function tick() { setTime(new Date()); }

// 使用useEffect钩子在组件挂载后设置一个定时器,并在组件卸载前清除定时器 useEffect(() => { const timerID = setInterval(tick, 1000); return () => { clearInterval(timerID); }; }, []);

// 返回一个显示当前时间的JSX元素 return (

Hello, world!

It is {time.toLocaleTimeString()}.

); }

●      useRef:这是再一个钩子函数,让你可以在函数组件中使用引用(ref),即一个可以存储任意值的可变容器,并且在整个组件的生命周期内保持不变。它接受一个初始值作为参数,并返回一个包含current属性的对象,该属性指向引用的值。你可以使用引用来访问或修改DOM元素、保存上一次渲染的状态或属性等。例如: import React, { useState, useEffect, useRef } from 'react';

function TextInput() { // 定义一个名为inputRef的引用变量,并初始化为null const inputRef = useRef(null);

// 定义一个聚焦输入框的函数 function focusInput() { // 使用current属性访问输入框元素,并调用focus方法 inputRef.current.focus(); }

// 返回一个包含输入框和按钮的JSX元素,并使用ref属性绑定引用变量 return (

Focus
); }

项目实例:使用React实现一个简单的待办事项列表

接下来,我们将使用React来实现一个简单的待办事项列表,这是一个常见的入门项目,可以让你熟悉React的基本用法和特性。我们的项目需求如下:

●      用户可以添加、编辑和删除待办事项;

●      用户可以将任何待办事项标记为已完成或未完成;

●      用户可以查看所有的待办事项、仅活动中的待办事项或仅已完成的待办事项;

我们将按照以下步骤来完成这个项目:

●      需求分析:分析项目的功能和界面需求,确定组件结构和状态管理方案;

●      设计思路:设计项目的整体架构和流程,确定组件之间的交互和数据传递方式;

●      代码实现:编写项目的核心代码,实现组件的渲染和逻辑功能;

●      测试和优化:测试项目的功能和性能,修复可能存在的错误和问题;

需求分析

首先,我们需要分析项目的功能和界面需求,确定我们需要实现哪些组件,以及它们之间如何协作。我们可以根据用户故事来描述项目的功能需求,例如:

●      作为一名用户,我可以在输入框中输入待办事项的内容,并点击添加按钮或按回车键来添加一条新的待办事项;

●      作为一名用户,我可以点击每条待办事项前面的复选框来切换它们的完成状态;

●      作为一名用户,我可以点击每条待办事项后面的编辑按钮来修改它们的内容,并点击保存按钮或按回车键来保存修改;

●      作为一名用户,我可以点击每条待办事项后面的删除按钮来删除它们;

作为一名用户,我可以点击顶部导航栏中的不同按钮来筛选显示所有、活动中或已完成的待办事项;

  • 作为一名用户,我可以看到底部状态栏中显示的待办事项的总数和未完成数;

根据这些功能需求,我们可以设计项目的界面需求,确定我们需要实现哪些组件,以及它们的样式和布局。我们可以使用一些工具来绘制项目的原型图,如[Sketch]、[Figma]、[Adobe XD]等。下面是一个使用Sketch绘制的项目原型图:

![项目原型图]

你可以看到,我们的项目界面由以下几个组件组成:

  • App:这是项目的根组件,负责渲染其他组件,并管理整个项目的状态和逻辑;
  • Header:这是项目的头部组件,负责显示项目的标题和图标;
  • Input:这是项目的输入框组件,负责接收用户输入的待办事项内容,并触发添加待办事项的事件;
  • TodoList:这是项目的待办事项列表组件,负责显示所有或筛选后的待办事项,并传递待办事项的属性和事件给子组件;
  • TodoItem:这是项目的待办事项组件,负责显示每条待办事项的内容、状态和操作按钮,并触发切换状态、编辑内容和删除待办事项的事件;
  • Filter:这是项目的筛选器组件,负责显示不同的筛选按钮,并触发筛选待办事项的事件;
  • Status:这是项目的状态栏组件,负责显示待办事项的总数和未完成数;

在确定了组件结构后,我们还需要确定我们需要管理哪些状态,以及它们如何影响组件的渲染和交互。我们可以使用一些工具来绘制项目的状态图,如[Draw.io]、[Lucidchart]、[Miro]等。下面是一个使用Draw.io绘制的项目状态图:

![项目状态图]

你可以看到,我们的项目状态由以下几个部分组成:

  • todos:这是一个数组,存储了所有的待办事项对象,每个对象包含了id、content和completed三个属性,分别表示待办事项的唯一标识、内容和完成状态;
  • filter:这是一个字符串,表示当前选择的筛选条件,可以是’all’、'active’或’completed’之一;
  • editingId:这是一个数字或者null,表示当前正在编辑的待办事项的id,如果没有正在编辑的待办事项,则为null;

这些状态都由App组件管理,并通过属性或事件传递给其他组件。当状态发生变化时,React会自动重新渲染相关联的组件。