ReactDOM.render(
<App />,
document.getElementById('root')
3 JSX 语法
HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写。
demo2
(项目index.js中修改import App from ‘./demo1’即可运行对应示例)
import React, { Component } from 'react';
var names = ['Alice', 'Emily', 'Kate'];
class App extends Component{
render(){
return(
names.map(function (name, index) {
return <div key={index}>Hello, {name}!</div>
</div>
export default App;
JSX 的基本语法规则:遇到 HTML 标签(以 < 开头),就用 HTML 规则解析;遇到代码块(以 { 开头),就用 JavaScript 规则解析。
JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员。JSX 会把它的所有成员,添加到模板。
demo03
import React, { Component } from 'react';
var arr = [
<h1>Hello world!</h1>,
<h2>React is awesome</h2>,
class App extends Component{
render(){
return(
<div>{arr}</div>
</div>
export default App;
React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。class关键字用于生成一个组件类。
demo04
import React, { Component } from 'react';
class App extends Component{
render(){
return(
<HelloMessage name="pengwei" />,
</div>
class HelloMessage extends Component{
render() {
return <h1>Hello {this.props.name}</h1>;
export default App;
上面代码中,变量 HelloMessage 就是一个组件类。模板插入 时,会自动生成 HelloMessage 的一个实例(下文的”组件”都指组件类的实例)。所有组件类都必须有自己的 render 方法,用于输出组件。
注意,组件类的第一个字母必须大写,否则会报错,比如HelloMessage不能写成helloMessage。另外,组件类只能包含一个顶层标签,否则也会报错。
组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 ,就是 HelloMessage 组件加入一个 name 属性,值为 John。组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。
注意,添加组件属性, class 属性需要写成 className ,for 属性需要写成 htmlFor ,这是因为 class 和 for 是 JavaScript 的保留字。
5 this.props.children
this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性,它表示组件的所有子节点。
demo05
import React, { Component } from 'react';
class App extends Component{
render(){
return(
<Parent>
<span>hello</span>
<span>world</span>
</Parent>
class Parent extends Component{
render(){
return(
{React.Children.map(this.props.children,function(child)
{return <li>{child}</li>;})}
export default App;
注意, this.props.children 的值有三种可能:如果当前组件没有子节点,它就是 undefined ;如果有一个子节点,数据类型是 object ;如果有多个子节点,数据类型就是 array 。所以,处理 this.props.children 的时候要小心。
React 提供一个工具方法 React.Children 来处理 this.props.children 。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型
6 PropTypes和DefaultProps
组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。
- PropTypes属性,就是用来验证组件实例的属性是否符合要求。
- DefaultProps 方法可以用来设置组件属性的默认值。
demo06
import React, { Component } from 'react';
import PropTypes from 'prop-types';
class App extends Component{
render(){
return(
<DefaultMessage />
</div>
class DefaultMessage extends Component{
render() {
return (<h1>Hello {this.props.name}</h1>);
DefaultMessage.propTypes = {
name: PropTypes.string
DefaultMessage.defaultProps ={
name : 'World'
export default App;
7 获取真实的DOM节点
组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。
但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性
demo07
import React, { Component } from 'react';
class App extends Component{
render(){
return(
<TrueDom />
</div>
class TrueDom extends Component{
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
handleClick() {
this.refs.myTextInput.focus();
render() {
return(
<input type="text" ref="myTextInput" />
<input type="button" value="Focus the text input" onClick={this.handleClick} />
</div>
export default App;
需要注意的是,由于 this.refs.[refName] 属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。上面代码中,通过为组件指定 Click 事件的回调函数,确保了只有等到真实 DOM 发生 Click 事件之后,才会读取 this.refs.[refName] 属性。
8 this.state
react将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI。
由于 this.props 和 this.state 都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性
demo08
import React, { Component } from 'react';
class App extends Component{
render(){
return(
<LikeButton/>
</div>
class LikeButton extends Component{
constructor(props) {
super(props);
this.state = {liked: false};
this.handleClick = this.handleClick.bind(this);
handleClick(event) {
this.setState({liked: !this.state.liked});
render() {
var text = this.state.liked ? 'like' : 'don\'t liked';
return (
<p onClick={this.handleClick}>
You {text} this. Click to toggle.
export default App;
用户在表单填入的内容,属于用户跟组件的互动,所以不能用 this.props 读取
demo9
import React, { Component } from 'react';
class App extends Component{
render(){
return(
<Input/>
</div>
class Input extends Component{
constructor(props) {
super(props);
this.state = {value: 'Hello!'};
this.handleChange = this.handleChange.bind(this);
handleChange(event) {
this.setState({value: event.target.value});
render() {
var value = this.state.value;
return (
<input type="text" value={value} onChange={this.handleChange} />
<p>{value}</p>
</div>
export default App;
上面代码中,文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数,通过 event.target.value 读取用户输入的值。
10 组件的生命周期
组件的生命周期分成三个状态:
- Mounting:已插入真实 DOM
- Updating:正在被重新渲染
- Unmounting:已移出真实 DOM
React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数:
- componentWillMount()
- componentDidMount()
- componentWillUpdate(object nextProps, object nextState)
- componentDidUpdate(object prevProps, object prevState)
- componentWillUnmount()
此外,React 还提供两种特殊状态的处理函数:
- componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用
- shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用
demo10
import React, { Component } from 'react';
class App extends Component{
render(){
return(
<ComponentLifestyle name = "pengwei"/>
</div>
class ComponentLifestyle extends Component{
constructor(props) {
super(props);
this.state = {opacity: 1.0};
componentWillMount() {
this.timer = setInterval(function () {
var opacity = this.state.opacity;
var flag = this.state.flag;
if(opacity >= 1||opacity<=0)
{flag = !flag;}
if (flag){
opacity -= 0.02;
else{
opacity += 0.02;
this.setState({
opacity: opacity,
flag: flag
}.bind(this), 100);
render() {
return (
<div style={{opacity: this.state.opacity}} flag = {true}>
Hello {this.props.name}
</div>
export default App;
本文只是很浅显的示例,学习React请继续前行—>
React 入门实例 参考阮一峰博客http://www.ruanyifeng.com/blog/2015/03/react.htmlReact 可以在浏览器运行,也可以在服务器运行。服务器的用法与浏览器差别不大。1 hello world程序**开发环境**visual studio code和谷歌浏览器(谷歌浏览器翻墙安装React Developer Tools)。...
react 案例111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
React例子
一个通常使用通量架构的示例React应用程序,唯一的主要区别是应用程序参与者使用 BaconJS 事件流进行大部分通信。
这旨在用作以这种方式构建的应用程序如何工作的一般演示。
这是表单生成引擎如何工作的一个重要示例。
此应用程序尚未完成,尚无测试,可能存在错误。
更多更新即将到来。
移动支付应该怎么设计?
https://www.bloomberg.com/news/articles/2021-10-06/pix-mobile-payment-how-brazil-s-central-bank-launched-platform
(1)任何支付机构都可以加入这个系统,而不是被一两家大机构把持。
(2)体系内所有支付机构可以互相转款,不存在市场割裂。