React基础

一、组件

React 应用程序是由 组件 组成的。一个组件是 UI(用户界面)的一部分,它拥有自己的逻辑和外观。组成网页单个部分的一组代码,如按钮、导航栏、卡片等,也可以大到整个页面。它是组成网页单个部分的一组代码,如按钮、导航栏、卡片等。它就像一个JavaScript函数,但返回一个渲染的元素。它接受称为"prop"的参数。组件以大写字母命名。

函数组件示例

function MyButton(prop) {
  return (
    <button>I'm a {prop.color} button</button>
  );
}

注意事项

  • 推荐使用函数组件而不是基于类的组件。

  • 函数组件通常被称为无状态组件。

二、JSX

JSX是JavaScript XML的缩写,它允许我们在React中编写HTML。它引入了类似XML的标签和属性来创建React元素。它通过让你在.jsx文件中编写类似HTML的代码,使创建React组件变得容易。JSX使代码可读性更强、更整洁,而不是使用复杂的JavaScript。React DOM使用驼峰式命名属性,如htmlFor、onClick。

JSX 比 HTML 更加严格。你必须闭合标签,如 <br />。你的组件也不能返回多个 JSX 标签。你必须将它们包裹到一个共享的父级中,比如 <div>...</div> 或使用空的 <>...</> 包裹

JSX示例

function AboutPage() {
  return (
    <>
      <h1>About</h1>
      <p>Hello there.<br />How do you do?</p>
    </>
  );
}

TSX是包含JSX语法的TypeScript文件的文件扩展名。使用TSX,你可以编写类型检查的代码,同时使用现有的JSX语法。使用TSX文件,你可以同时使用TypeScript和JSX编写React组件。

TSX示例

interface AgeProps {
  age: number;
}

const GreetAge = (props: AgeProps) => {
  return (
    <div>
      你好,你 {props.age} 岁了。
    </div>
  );
};

三、Fragments

当你需要单个元素时,你可以使用 <Fragment> 将其他元素组合起来,使用 <Fragment> 组合后的元素不会对 DOM 产生影响,就像元素没有被组合一样。在大多数情况下,<Fragment></Fragment> 可以简写为空的 JSX 元素 <></>

Fragments示例

function Post() {
  return (
    <>
      <PostTitle />
      <PostBody />
    </>
  );
}

注意事项

  • Fragments使代码更整洁、更易读。

  • 它们在内存使用上更高效。

  • 它们不能有CSS样式。

四、Props

React 组件使用 props 来互相通信。每个父组件都可以提供 props 给它的子组件,从而将一些信息传递给它。Props 可能会让你想起 HTML 属性,但你可以通过它们传递任何 JavaScript 值,包括对象、数组和函数。

props示例

//父组件
function Header() {
  <Avatar
    size={100}
    person={{
      name: "Katsuko Saruhashi",
      imageId: "YfeOqp2",
    }}
  />;
}
//子组件
function Avatar({ person, size }) {
  return (
    <img
      className="avatar"
      src={getImageUrl(person)}
      alt={person.name}
      width={size}
      height={size}
    />
  );
}

注意事项

  • Props是只读的,这确保了子组件不会操纵来自父组件的值。不要尝试“更改 props”。

五、State

当用户与组件交互时,组件需要跟踪某些值。例如,当用户点击亮/暗模式主题切换按钮时,它的值会改变(从亮到暗,反之亦然)。组件需要记住主题的当前值。在React中,这种特定于组件的内存被称为state。

定义state的示例

import { useState } from 'react';
const [index, setIndex] = useState(0);

注意事项

  • 在顶级组件中定义state总是一个好习惯,这样可以更容易地与其他子组件共享,并确保单一的事实来源。

六、hook

在 React 中,useState 以及任何其他以“use”开头的函数都被称为 Hook

hook示例

import { useState } from 'react';
const [index, setIndex] = useState(0);
const [showMore, setShowMore] = useState(false);

注意事项

  • use 开头的函数——只能在组件或自定hook的最顶层调用 你不能在条件语句、循环语句或其他嵌套函数内调用 Hook。Hook 是函数,但将它们视为关于组件需求的无条件声明会很有帮助。在组件顶部 “use” React 特性,类似于在文件顶部“导入”模块。
  • 惯例是将这对返回值命名为 const [thing, setThing]。你也可以将其命名为任何你喜欢的名称,但遵照约定俗成能使跨项目合作更易理解。

七、Context API

Context API用于在组件树中共享数据(如state、函数),而无需在每一级手动传递props。它通过简化状态管理和直接与将使用它的子组件共享数据来避免"prop钻取"。

createContext()方法用于创建一个context。这个函数返回一个context对象,其中包含两个组件 - Provider和Consumer。

Provider用于包裹你希望context可用的组件树部分。它接受一个必需的value prop,其中包含你想要在其他组件之间共享的数据。

useContext钩子用于访问数据。

Context API示例

使用createContext()方法创建一个context。将子组件包裹在Context Provider中,并提供state值。

import { useState, createContext} from "react";

const UserContext = createContext();

function ParentCounter() {
  const [count, setCount] = useState(10);

  return (
    <UserContext.Provider value={count}>
      <h1>{`当前计数: ${count}!`}</h1>
      <Button />
    </UserContext.Provider>
  );
}

使用useContext钩子访问count的值。

mport { useContext } from "react";

function GrandChildConsumer() {
  const count = useContext(UserContext);

  return (
    <>
      <h1>这是GrandChildConsumer</h1>
      <h2>{`当前计数: ${count}`}</h2>
    </>
  );
}

注意事项

通常使用useContext钩子而不是Consumer,以获得更好的可读性和简洁性。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕彬-前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值