第一个React Web应用程序

learn from 《React全家桶:前端开发与实例详解》
https://zh-hans.reactjs.org/tutorial/tutorial.html
https://zh-hans.reactjs.org/docs/create-a-new-react-app.html#create-react-app

  • 安装 Node.js
  • 安装 npm install -g live-server,配置环境变量 path C:\Users\user\AppData\Roaming\npm
npx create-react-app react_learning
cd react_learning
npm start

在这里插入图片描述

1. JSX

对 javascript 的扩展,代码显示更优雅,与 react 配合很好

Babel

目前(2022-07), 并不是所有的 浏览器 都支持 ES6,Babel 可以转译 ES6 -> ES5

head 里包含了 <script src="vendor/babel-standalone.js"></script>

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Project One</title><link rel="stylesheet" href="./semantic-dist/semantic.css" /><link rel="stylesheet" href="./style.css" /><script src="vendor/babel-standalone.js"></script><script src="vendor/react.js"></script><script src="vendor/react-dom.js"></script></head><body><div class="main ui text container"><h1 class="ui dividing centered header">Popular Products</h1><div id="content"></div></div><script src="./js/seed.js"></script><scripttype = "text/babel"data-plugins="transform-class-properties"src="./js/app.js"></script></body></html>

app.js

class ProductList extends React.Component {render() {return (<div className='ui unstackable items'><Product/>  {/*子组件*/}</div>);}
}class Product extends React.Component {render() {return (<div className='item'><div className='image'><img src='images/products/image-aqua.png'/></div><div className='middle aligned content'><div className='description'><a>Fort Knight</a><p>Authentic renaissance actors, delivered in just two weeks.</p></div><div className='extra'><span>Submitted by:</span><imgclassName='ui avatar image'src='images/avatars/daniel.jpg'/></div></div></div>);}
}ReactDOM.render(<ProductList/>,  // 渲染的组件document.getElementById('content')// 渲染的组件位置 index.html 里的 id=content 的组件
)

在这里插入图片描述

2. 动态组件

  • 数据驱动的组件,数据从父组件 流向 子组件,是通过 props 实现的

JSX属性值必须由 {} or "" 分隔

class ProductList extends React.Component {render() {const product = Seed.products[0];return (<div className="ui unstackable items"><Productid={product.id}title={product.title}description={product.description}url={product.url}votes={product.votes}submitterAvatarUrl={product.submitterAvatarUrl}productImageUrl={product.productImageUrl}/></div>);}
}class Product extends React.Component {render() {return (<div className='item'><div className='image'><img src={this.props.productImageUrl}/></div><div className='middle aligned content'><div className='header'><a><i className='large caret up icon'/></a>{this.props.votes}</div><div className='description'><a href={this.props.url}>{this.props.title}</a><p>{this.props.description}</p></div><div className='extra'><span>Submitted by:</span><imgclassName='ui avatar image'src={this.props.submitterAvatarUrl}/></div></div></div>);}
}

3. 渲染多个组件

  • 使用 map 函数,对多个组件进行处理
class ProductList extends React.Component {render() {const productComponents = Seed.products.map((product) => (<Productkey={'product-' + product.id}id={product.id}title={product.title}description={product.description}url={product.url}votes={product.votes}submitterAvatarUrl={product.submitterAvatarUrl}productImageUrl={product.productImageUrl}/>));return (<div className="ui unstackable items">{productComponents}</div>)}
}

在这里插入图片描述

  • 排序 sort
		const products = Seed.products.sort((a, b) => (b.votes - a.votes));const productComponents = products.map......

按照投票数从上到下降序排列

sort 方法改变了原始数组,是一种危险的行为,需要小心bug

4. 事件响应

  • 子组件可以读取其 props ,但是无法修改,props 是属于父组件的
  • 父组件拥有子组件的 props

可以将 函数 作为 props 传递给 子组件

class ProductList extends React.Component {handleProductUpVote(productId){console.log(productId + ' was upvoted.');}。。。<Productkey={'product-' + product.id}id={product.id}。。。onVote={this.handleProductUpVote}/>class Product extends React.Component {constructor(props) { // 构造函数super(props);this.handleUpVote = this.handleUpVote.bind(this);// 自定义组件方法,需要手动将 this 绑定到自己的组件}handleUpVote() {this.props.onVote(this.props.id);}render() {return (。。。<a onClick={this.handleUpVote}><i className='large caret up icon'/></a>)
  • 自定义组件方法,需要手动将 this 绑定到自己的组件
  • render 等函数,React 自动帮我们把 this 绑定到当前组件

可以看到控制台 (F12打开),输出了字符

5. 更新数据

  • this.state 是组件私有的,用 this.setState() 更改,组件 state 或 props 更新时,组件会重新渲染
  • 不要在 this.setState() 之外的地方修改 state!!!因为这个函数 是异步的,我们不知道它什么时候更新状态 并 重新渲染

map(),数组的 concat() ,不改变原数组,产生新的数组

如果想要修改,请修改副本,而不是原始对象

class ProductList extends React.Component {constructor(props) {super(props);this.state = {products: []};this.handleProductUpVote = this.handleProductUpVote.bind(this);}componentDidMount() { // 组件挂载到页面后,react会调用该方法this.setState({products: Seed.products});}handleProductUpVote(productId){const nextProducts = this.state.products.map((product) => {if(product.id === productId) {return Object.assign({}, product, {votes: product.votes + 1,});}else{return product;}});this.setState({products: nextProducts});}render() {const products = this.state.products.sort((a, b) => (b.votes - a.votes));const productComponents = products.map((product) => (<Productkey={'product-' + product.id}id={product.id}title={product.title}description={product.description}url={product.url}votes={product.votes}submitterAvatarUrl={product.submitterAvatarUrl}productImageUrl={product.productImageUrl}onVote={this.handleProductUpVote}/>));return (<div className="ui unstackable items">{productComponents}</div>)}
}class Product extends React.Component {constructor(props) {super(props);this.handleUpVote = this.handleUpVote.bind(this);}handleUpVote() {this.props.onVote(this.props.id);}render() {return (<div className='item'><div className='image'><img src={this.props.productImageUrl}/></div><div className='middle aligned content'><div className='header'><a onClick={this.handleUpVote}><i className='large caret up icon'/></a>{this.props.votes}</div><div className='description'><a href={this.props.url}>{this.props.title}</a><p>{this.props.description}</p></div><div className='extra'><span>Submitted by:</span><imgclassName='ui avatar image'src={this.props.submitterAvatarUrl}/></div></div></div>);}
}ReactDOM.render(<ProductList/>,  // 渲染的组件document.getElementById('content')// 渲染的组件位置 index.html 里的 id=content 的组件
)

在这里插入图片描述

由于我们使用了插件 transform-class-properties(属性初始化器)

  • 可以写箭头函数来自定义组件方法,直接绑定 this 到组件
  • constructor() 函数之外定义初始状态
<scripttype = "text/babel"data-plugins="transform-class-properties"src="./js/app.js"></script>

所以,可以这么写:

class Product extends React.Component {// constructor(props) {//     super(props);//     this.handleUpVote = this.handleUpVote.bind(this);// }// handleUpVote() {//     this.props.onVote(this.props.id);// }handleUpVote = ()=>(this.props.onVote(this.props.id))
class ProductList extends React.Component {// constructor(props) {//     super(props);//     this.state = {//         products: []//     };//     this.handleProductUpVote = this.handleProductUpVote.bind(this);// }state = {products: []}; // 在 `constructor()` 函数之外定义初始状态handleProductUpVote = (productId) => {。。。}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、第一个注解的 SpringMVC 程序

ch01-hello-springmvc:第一个注解的springmvc项目 所谓 SpringMVC 的注解式开发是指&#xff0c;在代码中通过对类与方法的注解&#xff0c;便可完成处理器 在 springmvc 容器的注册。注解式开发是重点。 需求&#xff1a;用户再页面发起一个请求&#xff0c;请求交给spring…

二、SpringMVC 注解式开发学习笔记

1、RequestMapping 定义请求规则 通过RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上&#xff0c;也可以注解在类上&#xff0c;但意义是不同的。value 属性值常以“/”开始。 RequestMapping 的 value 属性用于定义所匹配请求的 URI。但对于注…

LeetCode 2315. 统计星号(字符串)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;每 两个 连续竖线 | 为 一对 。 换言之&#xff0c;第一个和第二个 | 为一对&#xff0c;第三个和第四个 | 为一对&#xff0c;以此类推。 请你返回 不在 竖线对之间&#xff0c;s 中 * 的数目。 注意&#xff…

PyCharm集成Anaconda3环境下安装 腾讯优图报错 ERROR: Could not install packages due to an EnvironmentError

一、报错截图如下&#xff1a; ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: ‘C:\Users\Zep\Python_sdk-master.zip’ 我首先是从官网下载了Python_sdk&#xff0c;然后直接把Python_sdk文件夹放在了Anaconda3的文…

LeetCode 2319. 判断矩阵是否是一个 X 矩阵

文章目录1. 题目2. 解题1. 题目 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid &#xff0c;表示一个正方形矩阵。 如果 grid 是…

三、Java Web中出现的一些乱码问题总结(详解)

一、response.getWriter().write(&#xff09;和 response.getWriter().print(&#xff09;的区别 response.getWriter()返回的是PrintWriter&#xff0c;这是一个打印输出流 response.getWriter().write(&#xff09;和 response.getWriter().print(&#xff09;是响应给客户…

LeetCode 2325. 解密消息(map)

文章目录1. 题目2. 解题1. 题目 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。 解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。将替换表与普通英文字母表对齐&#xff0c;形…

结对项目——最大子数组

求数组中最大子数组的和 一、程序要求 1、返回一个整数数组中最大子数组的和&#xff1b; 2、输入一个整数数组&#xff0c;数组中有正数也有负数&#xff1b; 3、数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和&#xff1b; 4、求所有子数组的和的…

python的GUI编程和tkinter学习笔记——第一个GUI程序

一、第一个GUI程序 from tkinter import * from tkinter import messagebox# 创建窗口 root Tk()btn01 Button(root) btn01["text"] "点我就送花"btn01.pack()def songhua(e): # e就是事件对象messagebox.showinfo("Message","送你一朵…

LeetCode 2331. 计算布尔二叉树的值(树的遍历)

文章目录1. 题目2. 解题1. 题目 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其中 0 表示 False &#xff0c;1 表示 True 。非叶子节点 要么值为 2 要么值为 3 &#xff0c;其中 2 表示逻辑或 OR &#…

linux内核启动以及文件系统的加载过程

Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令&#xff0c;就进入 Linux 内核启动阶段。普通 Linux 内核的启动过程也可以分为两个阶段。本文以项目中使用的 linux-2.6.37 版源码为例分三个阶段来描述内核启动全过程。第一阶段为内核自解压过程&#xff0c…

LeetCode 2335. 装满杯子需要的最短总时长

文章目录1. 题目2. 解题1. 题目 现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount &#xff0c;其中 amount[0]、amount[1] 和 amount[2] 分…

Linux实操篇——实用指令学习笔记(详解)

9.3帮助指令 9.3.1介绍 当我们对某个指令不熟悉时&#xff0c;我们可以使用Linux提供的帮助指令来了解这个指令的使用方法。 9.3.2man 获得帮助信息 基本语法 man[命令或配置文件]&#xff08;功能描述&#xff1a;获得帮助信息&#xff09;应用实例 案例&#xff1a;查看1…

LeetCode 2249. 统计圆内格点数目

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 circles &#xff0c;其中 circles[i] [xi, yi, ri] 表示网格上圆心为 (xi, yi) 且半径为 ri 的第 i 个圆&#xff0c;返回出现在 至少一个 圆内的 格点数目 。 注意&#xff1a; 格点 是指整数坐标对应的点。 圆周上的…

Python实现自动发送邮件(详解)

Python实现自动发送邮件 1.开启SMTP服务 为了实现自动发送邮件的目的&#xff0c;我们需要在邮箱中开启SMTP服务&#xff1a; 这点很关键&#xff0c;别忘了去开启SMTP&#xff0c; 别忘了去开启SMTP&#xff0c;否则邮件是无法发送成功的 。然后你还需要点击下面生成授权…

React 组件:计时器例子

文章目录1. 将应用程序分解为组件2. 构建应用静态版本3. 哪些组件是有状态的4. 每个 state 应该在哪个组件里5. 硬编码初始化state6. 添加反向数据流7. 添加服务器通信learn from 《React全家桶&#xff1a;前端开发与实例详解》https://zh-hans.reactjs.org/tutorial/tutorial…

一、快速开始一个 MyBatis项目(详解)

1.0 概述 1.三层架构 界面层&#xff1a; 和用户打交道的&#xff0c; 接收用户的请求参数&#xff0c; 显示处理结果的。&#xff08;jsp &#xff0c;html &#xff0c;servlet&#xff09; 业务逻辑层&#xff1a; 接收了界面层传递的数据&#xff0c;计算逻辑&#xff0c;…

2013 ACM区域赛长沙 K Pocket Cube hdu 4801

题意:给了一个2*2的魔方..每步操作可以将任意一面翻转90度..现在问在N(<7)步内.最多能翻出几面相同的. 直接打表模拟每种翻转情况 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #include<iostream>5 using namespace std;6 7 int …

React 组件和服务器

文章目录1. 请求服务器数据2. 发送开始停止请求3. 发送创建、删除、更新请求learn from 《React全家桶&#xff1a;前端开发与实例详解》https://zh-hans.reactjs.org/tutorial/tutorial.htmlhttps://zh-hans.reactjs.org/docs/create-a-new-react-app.html#create-react-app服…

二、MyBatis常用对象分析 封装工具类

1.0 MyBatis 对象分析 &#xff08;1&#xff09; Resources 类 Resources 类&#xff0c;顾名思义就是资源&#xff0c;用于读取资源文件。其有很多方法通过加载并解析资源文件&#xff0c;返回不同类型的 IO 流对象。 &#xff08;2&#xff09; SqlSessionFactoryBuilder…