React 入门教程笔记

简介: React 入门教程笔记

安装 React

1、下载


wget https://cdn.staticfile.org/react/16.4.0/umd/react.development.js \
https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js \
https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js

react.min.js - React 的核心库

react-dom.min.js - 提供与 DOM 相关的功能

babel.min.js - Babel 可以将 ES6 代码转为 ES5 代码

Babel 内嵌了对 JSX 的支持


如果我们需要使用 JSX,则 <script> 标签的 type 属性需要设置为 text/babel


2、hello world


<script src="./react.development.js"></script>
<script src="./react-dom.development.js"></script>
<script src="./babel.min.js"></script>
<div id="app"></div>
<script type="text/babel">
  ReactDOM.render(<h1>Hello, world!</h1>, document.getElementById("app"));
</script>

React 元素渲染

1、创建元素

元素是构成 React 应用的最小单位,用于描述屏幕上输出的内容


const element = <h1>Hello, world!</h1>;
// 将元素渲染到 DOM 中
ReactDOM.render(element, document.getElementById("app"));

2、更新元素

React 元素都是不可变的, 更新界面的唯一办法是创建一个新的元素


计时器示例


function tick() {
  const element = <h2>现在时刻:{new Date().toLocaleString()}</h2>;
  ReactDOM.render(element, document.getElementById("app"));
}
setInterval(tick, 1000);

2、封装成函数


function Clock(props) {
  return <h2>现在时刻:{props.date.toLocaleString()}</h2>;
}
function tick() {
  ReactDOM.render(<Clock date={new Date()} />, document.getElementById("app"));
}
setInterval(tick, 1000);

4、创建 React.Component 子类


class Clock extends React.Component {
  render() {
    return <h2>现在时刻:{this.props.date.toLocaleString()}</h2>;
  }
}
function tick() {
  ReactDOM.render(<Clock date={new Date()} />, document.getElementById("app"));
}
setInterval(tick, 1000);

JSX

1、使用 JavaScript 表达式


ReactDOM.render(<h1>{1 + 1}</h1>, document.getElementById("app"));

可以使用 conditional (三元运算) 表达式


2、样式

React 推荐使用 camelCase 语法设置内联样式


const style = {
  fontSize: 20,
  color: "#FF0000",
};
ReactDOM.render(
  <h1 style={style}>hello world!</h1>,
  document.getElementById("app")
);

3、注释


ReactDOM.render(
  <div>
    <h1>hello world!</h1>
    {/*注释*/}
  </div>,
  document.getElementById("app")
);

数组


数组会自动展开所有成员


var arr = [<h1>hello</h1>, <h1>world!</h1>];
ReactDOM.render(<div>{arr}</div>, document.getElementById("app"));

组件

原生 HTML 元素名以小写字母开头,

自定义的 React 类名以大写字母开头


class 属性需要写成 className ,

for 属性需要写成 htmlFor


1、函数定义组件


function MyComponent(props) {
  return <h1>{props.name}</h1>;
}
ReactDOM.render(<MyComponent name="Tom" />, document.getElementById("app"));

2、ES6 class 定义组件


class MyComponent extends React.Component {
  render() {
    return <h1>{this.props.name}</h1>;
  }
}
ReactDOM.render(<MyComponent name="Tom" />, document.getElementById("app"));

3、复合组件


function Name(props) {
  return <h1>名称:{props.name}</h1>;
}
function Url(props) {
  return <h1>网址:{props.url}</h1>;
}
function App() {
  return (
    <div>
      <Name name="百度" />
      <Url url="http://www.baidu.com" />
    </div>
  );
}
ReactDOM.render(<App />, document.getElementById("app"));

State(状态)

计时器每秒更新一次


class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { date: new Date() };
  }
  // 挂载
  componentDidMount() {
    this.timerID = setInterval(() => {
      this.tick();
    }, 1000);
  }
  // 卸载
  componentWillUnMount() {
    clearInterval(this.timerID);
  }
  tick() {
    this.setState({
      date: new Date(),
    });
  }
  render() {
    return <h1>{this.state.date.toLocaleString()}</h1>;
  }
}
ReactDOM.render(<MyComponent />, document.getElementById("app"));

Props

props 不可变, 用来传递数据


state 用来更新和修改数据


function Name(props) {
  return <h1>{props.name}</h1>;
}
ReactDOM.render(<Name name="Tom" />, document.getElementById("app"));

事件处理

事件绑定属性的命名采用驼峰式写法


function Link() {
  function handleClick() {
    console.log("按钮被点击了");
  }
  return <button onClick={handleClick}>按钮</button>;
}
ReactDOM.render(<Link />, document.getElementById("app"));

按钮点击开启和关闭


class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isToggleOn: true,
    };
  }
  handleClick(e) {
    this.setState((prevState) => ({
      isToggleOn: !prevState.isToggleOn,
    }));
  }
  render() {
    return (
      <button onClick={(e) => this.handleClick(e)}>
        {this.state.isToggleOn ? "开启" : "关闭"}
      </button>
    );
  }
}
ReactDOM.render(<Toggle />, document.getElementById("app"));

条件渲染

function User(props) {
  return <h1>User</h1>;
}
function Guest(props) {
  return <h1>Guest</h1>;
}
function App(props) {
  if (props.role == "user") {
    return <User />;
  } else {
    return <Guest />;
  }
}
ReactDOM.render(<App role="user" />, document.getElementById("app"));

列表 & Keys

每个列表元素需要分配一个兄弟元素之间的唯一 key


function App(props) {
  const numbers = [1, 2, 3];
  const items = numbers.map((item, index) => {
    return <li key={index}>{item}</li>;
  });
  return items;
}
ReactDOM.render(<App />, document.getElementById("app"));

组件 API

// 合并状态
setState(object nextState[, function callback])
// 替换状态
replaceState(object nextState[, function callback])
// 合并属性
setProps(object nextProps[, function callback])
// 替换属性
replaceProps(object nextProps[, function callback])
// 强制更新
forceUpdate([function callback])
// 获取DOM节点
DOMElement findDOMNode()
// 组件挂载状态
bool isMounted()

点击计数示例


class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    this.setState((state) => {
      return { count: state.count + 1 };
    });
  }
  render() {
    return <h1 onClick={this.handleClick}>点击计数:{this.state.count}</h1>;
  }
}
ReactDOM.render(<App />, document.getElementById("app"));

组件生命周期

三个状态


Mounting:已插入真实 DOM

Updating:正在被重新渲染

Unmounting:已移出真实 DOM

生命周期的方法


componentWillMount 在渲染前调用

componentDidMount 在第一次渲染后调用

componentWillReceiveProps 在组件接收到一个新的 prop (更新后)时被调用

shouldComponentUpdate 在组件接收到新的 props 或者 state 时被调用

componentWillUpdate 在组件接收到新的 props 或者 state 但还没有 render 时被调用

componentDidUpdate 在组件完成更新后立即调用

componentWillUnmount 在组件从 DOM 中移除之前立刻被调用

AJAX

服务端 server.js


cnpm i express cors
const express = require("express");
const cors = require("cors");
const app = express();
app.use(cors());
app.use("/", function (req, res) {
  return res.send({ data: { name: "Tom" } });
});
app.listen(8080, function () {
  console.log("listening: http://127.0.0.1:8080");
});

下载 axios 并引入

wget https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      name: "",
    };
  }
  componentDidMount() {
    axios.get("http://127.0.0.1:8080/").then((res) => {
      this.setState({
        name: res.data.data.name,
      });
    });
  }
  render() {
    return <h1>{this.state.name}</h1>;
  }
}
ReactDOM.render(<App />, document.getElementById("app"));

表单与事件

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: "",
    };
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(event) {
    this.setState({ value: event.target.value });
  }
  render() {
    return (
      <div>
        <input
          type="text"
          value={this.state.value}
          onChange={this.handleChange}
        ></input>
        <h2>{this.state.value}</h2>
      </div>
    );
  }
}
ReactDOM.render(<App />, document.getElementById("app"));

Refs


         


ReactDOM.render(<App />, document.getElementById("app"));

相关文章
|
20天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
32252 117
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
9天前
|
应用服务中间件 API 网络安全
3分钟汉化OpenClaw,使用Docker快速部署启动OpenClaw(Clawdbot)教程
2026年全新推出的OpenClaw汉化版,是基于Claude API开发的智能对话系统本土化优化版本,解决了原版英文界面的使用壁垒,实现了界面、文档、指令的全中文适配。该版本采用Docker容器化部署方案,开箱即用,支持Linux、macOS、Windows全平台运行,适配个人、企业、生产等多种使用场景,同时具备灵活的配置选项和强大的扩展能力。本文将从项目简介、部署前准备、快速部署、详细配置、问题排查、监控维护等方面,提供完整的部署与使用指南,文中包含实操代码命令,确保不同技术水平的用户都能快速落地使用。
4734 4
|
15天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
6834 18
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
14天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
4803 11
|
16天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5682 21
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
12天前
|
人工智能 JavaScript 安全
Claude Code 安装指南
Claude Code 是 Anthropic 推出的本地 AI 编程助手,支持 Mac/Linux/WSL/Windows 多平台一键安装(Shell/PowerShell/Homebrew/NPM),提供 CLI 交互、代码生成、审查、Git 提交等能力,并内置丰富斜杠命令与自动更新机制。
4293 0
|
16天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
6256 6
|
18天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7769 17