Next.js14从入门到实战003:React基础篇之React入门

React入门

要在新创建的项目中使用 React,我们需要加载两个 React 脚本:

  • react:是核心的 React 库。
  • react-dom:提供了特定的 DOM 的方法,使您能够将 React 与 DOM 一起使用。

这两个库,我们目前直接使用在线引入的方式,通过Script标签进行引入。

index.html 复制代码
<html>
  <body>
    <div id="app"></div>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script type="text/javascript">
      const app = document.getElementById('app');
      const header = document.createElement('h1');
      const text = '你好';
      const headerContent = document.createTextNode(text);
      header.appendChild(headerContent);
      app.appendChild(header);
    </script>
  </body>
</html>

现在开始,我们不直接使用纯 JavaScript 操作 DOM,所以我们要删除之前添加的 DOM 方法。

并添加该 ReactDOM.createRoot() 方法以面向特定的 DOM 元素并创建一个根来显示您的 React 组件。

然后,添加将 React 代码渲染到 DOM root.render() 的方法。

index.html 复制代码
<html>
  <body>
    <div id="app"></div>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script type="text/javascript">
      const app = document.getElementById('app');
      const root = ReactDOM.createRoot(app);
      root.render(<h1>你好</h1>);
    </script>
  </body>
</html>

这边使用createRoot(app)告诉React,在我们的#app元素中,挂载<h1>

如果尝试在浏览器中运行此代码,页面会变成空白。

控制台会报错:

Terminal 复制代码
Uncaught SyntaxError: expected expression, got '<'

这是因为root.render(<h1>你好</h1>)里面的<h1>...</h1>在Javsscript里面是无效的,无法被浏览器运行。

因为这是一段JSX代码。

什么是JSX?

JSX 是 JavaScript 的语法扩展,允许您使用熟悉的类似 HTML 的语法来描述您的 UI。

JSX 的好处是,除了遵循三个 JSX 规则之外,您不需要学习 HTML 和 JavaScript 之外的任何新符号或语法。

但是浏览器无法理解开箱即用的 JSX,因此您需要一个 JavaScript 编译器(例如 Babel)将 JSX 代码转换为常规 JavaScript。

将Babel添加到项目中

若要将 Babel 添加到您的项目中,方法很简单,同我们引入React时一样。

只需要将以下脚本复制并粘贴到 index.html 文件中:

index.html 复制代码
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

此外,您需要通过将脚本类型更改为 type=text/jsx 来通知 Babel 要转换的代码。

index.html 复制代码
<html>
  <body>
    <div id="app"></div>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <!-- Babel Script -->
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/jsx">
      const domNode = document.getElementById('app');
      const root = ReactDOM.createRoot(domNode);
      root.render(<h1>你好</h1>);
    </script>
  </body>
</html>

这时,我们在浏览器里面打开页面,页面显示了

我们现在比较下代码

你可以开始看到使用 React 后,减少了大量重复的代码。

这正是 React 所做的,它是一个包含可重用代码片段的库。

如果你需要深入了解 React 如何更新 UI 来开始使用它,这里有一些额外的资源:

使用组件构建UI

React核心概念

在开始构建 React 应用程序之前,您需要熟悉 React 的三个核心概念。这些是:

  • Components 组件
  • Props 属性
  • State 状态

在接下来的章节中,我们将介绍这些概念,并提供可以继续学习它们的资源。

在你熟悉了这些概念之后,我们再开始学习如何安装Next.js并使用更新的 React 功能,例如服务器和客户端组件。

Components 组件

用户界面可以分解为更小的构建块,称为组件。

组件允许您构建独立的、可重用的代码片段。

如果您将组件视为乐高积木,则可以将这些单独的积木组合在一起以形成更大的结构。

如果需要更新UI的一部分,可以更新特定的组件或模块。

这种模块化使你的代码在开发过程中更具可维护性,因为你可以添加、更新和删除组件,而无需触及应用程序的其余部分。

如果你不好理解,我们可以这样认识,React 组件只是 JavaScript。让我们看看如何从 JavaScript 的角度编写 React 组件:

创建组件

在 React 中,组件是函数。在标签 script 中,创建一个名为 header

index.html 复制代码
<script type="text/jsx">
  const app = document.getElementById("app")
 
  function header() {
  }
 
  const root = ReactDOM.createRoot(app);
  root.render(<h1>你好</h1>);
</script>

组件是返回 UI 元素的函数。在函数的 return 语句中,可以写 JSX:

index.html 复制代码
<script type="text/jsx">
  const app = document.getElementById("app")
 
  function header() {
     return (<h1>你好</h1>)
   }
 
  const root = ReactDOM.createRoot(app);
  root.render(<h1>你好</h1>);
</script>

若要将此组件挂载到 DOM 上,需要将其作为 root.render() 方法中的第一个参数传递:

index.html 复制代码
<script type="text/jsx">
  const app = document.getElementById("app")
 
  function header() {
     return (<h1>你好</h1>)
   }
 
  const root = ReactDOM.createRoot(app);
  root.render(header);
</script>

但这时,我们直接运行页面,会直接报错,为什么?

首先,React 组件应该大写,以区别于普通的 HTML 和 JavaScript:

index.html 复制代码
function Header() {
  return <h1>你好</h1>;
}
 
const root = ReactDOM.createRoot(app);
// Capitalize the React Component
root.render(Header);

其次,你使用React组件的方式与使用常规HTML标签的方式相同,带有尖括号 <>

javascript 复制代码
function Header() {
  return <h1>你好</h1>;
}
 
const root = ReactDOM.createRoot(app);
root.render(<Header />);

再次运行,这回我们看到界面显示正常。

嵌套组件

应用程序通常包含比单个组件更多的内容。你可以像嵌套常规 HTML 元素一样将 React 组件嵌套在一起。

我们创建一个名为 HomePage的组件

index.html 复制代码
function Header() {
  return <h1>你好</h1>;
}
 
function HomePage() {
  return <div></div>;
}
 
const root = ReactDOM.createRoot(app);
root.render(<Header />);

然后将 <Header> 组件嵌套在新 <HomePage> 组件中:

javascript 复制代码
function Header() {
  return <h1>你好</h1>;
}
 
function HomePage() {
  return (
    <div>
      {/* 嵌套组件 */}
      <Header />
    </div>
  );
}
 
const root = ReactDOM.createRoot(app);
root.render(<Header />);

组件树

你可以继续以这种方式嵌套 React 组件以形成组件树。

例如,顶级 HomePage 组件可以包含 、 Header Article 和 组件 Footer 。这些组件中的每一个都可以有自己的子组件,依此类推。例如, Header 组件可以包 LogoTitle Navigation 组件。

这种模块化格式允许您在应用内的不同位置复用组件。

在项目中,由于 <HomePage> 现在是顶级组件,因此可以将其传递给 root.render() 方法:

index.html 复制代码
function Header() {
  return <h1>你好<h1>;
}
 
function HomePage() {
  return (
    <div>
      <Header />
    </div>
  );
}
 
const root = ReactDOM.createRoot(app);
root.render(<HomePage />);
相关推荐
脾气有点小暴13 小时前
详解 HTML Image 的 mode 属性:图像显示模式的灵活控制
前端·html·uniapp
爱吃无爪鱼13 小时前
03-Bun vs Node.js:JavaScript 运行时的新旧之争
javascript·vue.js·react.js·npm·node.js
0思必得013 小时前
[Web自动化] 开发者工具性能(Performance)面板
运维·前端·自动化·web自动化·开发者工具
心灵的制造商13 小时前
el-tree左侧新增类别和删除类别实例代码
前端·javascript·vue.js
冴羽13 小时前
不知道怎么写 Nano Banana Pro 提示词?分享你一个结构化示例,复刻任意图片
前端·人工智能·aigc
IT_陈寒13 小时前
JavaScript 性能优化:7个 V8 引擎隐藏技巧让你的代码提速200%
前端·人工智能·后端
脾气有点小暴14 小时前
uniapp通用单张图片上传组件
前端·javascript·vue.js·uni-app·uniapp
小菜今天没吃饱14 小时前
DVWA-XSS(stored)
前端·网络安全·xss·dvwa
云飞云共享云桌面14 小时前
研发部门使用SolidWorks,三维设计云桌面应该怎么选?
运维·服务器·前端·网络·自动化·电脑
老华带你飞14 小时前
茶叶商城|基于SprinBoot+vue的茶叶商城系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot