Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React 实战

React 实战

原创
作者头像
王秀龙
修改于 2021-08-27 03:14:56
修改于 2021-08-27 03:14:56
1.3K00
代码可运行
举报
文章被收录于专栏:云开发分享云开发分享
运行总次数:0
代码可运行

一、React 视图层

项目创建

Create React App

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx create-react-app my-app
cd my-app
npm start	/	yarn start
JSX

基于 JS 的扩展语法

如何将 React 元素渲染到DOM中?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const element = <h1>Hello,world</h1>;
ReactDOM.render(element,document.getElementById('root'))
组件

React 应用组成和复用的基本单元

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
component = (props) => element

React组件必须像纯函数一样运行!

函数组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';

function Welcome(props) {
    return <h1>Hello, {props.name} </h1>
}

export default Welcome;

类组件

必须有一个 render() 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';

class Welcome extends React.Component {
    render() {
        return <h1>Hello, {this.props.name} </h1>
    }
}

export default Welcome;

列表中的 key

只需要保证,在同一个数组中的兄弟元素之间的 key 是唯一的。而不需要在整个应用程序甚至单个组件中保持唯一。

理想情况下,key 应该从数据中获取,对应着唯一且固定的标识符,例如 post.id。

state

只能在类组件中使用,组件内部的可变状态

创建 Clock 时钟组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';

class Clock extends Component {
    constructor(props) {
        super(props);
        this.state = { date: new Date() };
    }

    // 组件被挂载到 DOM 节点时会调用
    componentDidMount() {
        // setInterval 循环任务 API
        this.timerID = setInterval(() => this.tick(), 1000);
    }

    // 组件从 DOM 卸载时会调用
    componentWillUnmount() {
        // 清除 setInterval 创建的定时任务
        clearInterval(this.timerID);
    }

    tick() {
        this.setState({
            date: new Date()
        });
    }

    render() {
        return (
            <div>Current Time:{this.state.date.toLocaleTimeString()} </div>
        );
    }
}

export default Clock;

setState 注意事项

不能通过 this.state 直接赋值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Wrong 
this.state.comment = 'Hello';

使用 this.setState 方法赋值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Correct
this.setState({comment: 'Hello'});

如果新的状态需要依赖当前状态得到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Wrong
this.setState({
	counter: this.state.counter + this.props.increment
})

// Correct
this.setState((state, props) => ({
	counter:satae.counter + props.increment
}))

setState 对 state 的修改是部分修改,而不是对整个 state 全量替换

state 总结

  • Props:父组件传递给子组件的属性,在子组件内部只读
  • State:组件内部自己维护的状态,可以被修改
生命周期方法

针对类组件是有意义的,而函数组件没有这些生命周期方法

Form

受控组件

input 的值受 react 组件控制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';

class NameForm extends Component {
    constructor(props) {
        super(props);
        this.state = { value: '' };

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    handleChange(event) {
        this.setState({ value: event.target.value })
    }

    handleSubmit(event) {
        alert('A name was submitted:' + this.state.value);
        event.preventDefault();
    }

    render() {
        return (
            <form onSubmit={this.handleSubmit} >
                <label>
                    Name:
                    <input type="text" value={this.state.value} onChange={this.handleChange} />
                </label>
                <input type="submit" value="Submit" />
            </form>
        );
    }
}

export default NameForm;

非受控组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';

class NameForm extends Component {
    constructor(props) {
        super(props);

        this.handleSubmit = this.handleSubmit.bind(this);
        this.input = React.createRef();
    }

    handleSubmit(event) {
        alert('A name was submitted:' + this.input.current.value);
        event.preventDefault();
    }

    render() {
        return (
            <form onSubmit={this.handleSubmit} >
                <label>
                    Name:
                    <input type="text" ref={this.input} />
                </label>
                <input type="submit" value="Submit" />
            </form>
        );
    }
}

export default NameForm;
组件的组合用法

一般用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';

function FanctBorder(props) {
    return (
        <div className={'FancyBorder FancyBorder-' + props.color}>
            {props.children}
        </div>
    )
}

function WelcomeDialog() {
    return (
        <FanctBorder color="blue">
            <h1 className="Dialog-title"> Welcome </h1>
            <p> Thank you for visiting our spacecraft! </p>
        </FanctBorder>
    )
}

export default WelcomeDialog;

更加灵活的组合方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';

function FanctBorder(props) {
    return (
        <div>
            <div>{props.left}</div>
            <div><h3> this is line! </h3></div>
            <div>{props.right}</div>
        </div>
    )
}

function Left(props) {
    return (
        <div>
            <p> this is a Left! </p>
        </div>
    )
}

function Right(props) {
    return (
        <div>
            <p> this is a Right! </p>
        </div>
    )
}

function WelcomeDialog() {
    return (
        <FanctBorder left={<Left />} right={<Right />} />
    )
}

export default WelcomeDialog;
React Hooks

React 16.8 以后,新的组件开发方法

React Hooks 编写形式对比

先来写一个最简单的组件,点我们点击按钮时,点击数量不断增加。

有状态组件写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';

class Example extends Component {
    constructor(props) {
        super(props);
        this.state = {
            count: 0
        }
        this.addCount = this.addCount.bind(this)
    }
    render() {
        return (
            <div>
                <button type="button" onClick={this.addCount}>
                    count is: {this.state.count}
                </button>
            </div>
        );
    }

    addCount() {
        this.setState({
            count: this.state.count + 1
        })
    }
}

export default Example;

React Hooks 写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { useState, useEffect } from 'react';

function Example() {
    const [count, setCount] = useState(0)

    useEffect(() => {
        console.log(`useEffect=> You clicked ${count}`);
        return () => {
            console.log('解绑生命周期函数!')
        }
    }, [count]) // count 发生变化,就会执行解绑


    return (
        <div>
            <button type="button" onClick={() => setCount((count) => count + 1)}>
                count is: {count}
            </button>
        </div>
    )
}

export default Example;

State Hook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const [state, setState] = useState(initialState);

Effect Hook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useEffect(() =>{ effectFn(); return clearFn},[...dependencies])

一般用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useEffect(() => {
        const getUserInfo = async () => {
            try {
                const userInfo = await fetch('https://api.github.com/users/hzjsj');
                console.log(userInfo)
            } catch (err) {
                console.error(err)
            }
        }
        getUserInfo();
    }, [])

其它 Hooks API

二、React Router 路由层

路由分类

1.服务端路由

请求发送到服务端,服务端返回对应的页面内容

2.客户端路由

请求不发送到服务端,有客户端代码更新页面内容

MPA 和 SPA

React Router是什么

React 应用中的客户端路由解决方案

基础示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";
import {
    BrowserRouter as Router,
    // HashRouter as Router,
    Switch,
    Route,
    Link,
    useHistory,
    useParams
} from "react-router-dom";

export default function BasicExample() {
    return (
        <Router>
            <div>
                <ul>
                    <li>
                        <Link to="/">Home</Link>
                    </li>
                    <li>
                        <Link to="/about">About</Link>
                    </li>
                    <li>
                        <Link to="/dashboard">Dashboard</Link>
                    </li>
                </ul>

                <hr />

                <Switch>
                    <Route exact path="/">
                        <Home />
                    </Route>
                    <Route path="/about">
                        <About />
                    </Route>
                    <Route path="/dashboard">
                        <Dashboard />
                    </Route>
                    <Route path="/user/:username">
                        <User />
                    </Route>
                </Switch>
            </div>
        </Router>
    );
}

// You can think of these components as "pages"
// in your app.

function Home() {
    const history = useHistory();
    return (
        <div>
            <h2>Home</h2>
            <button
                onClick={() => {
                    history.push("/user/jason");
                }}
            >
                Go User{" "}
            </button>
        </div>
    );
}

function About() {
    return (
        <div>
            <h2>About</h2>
        </div>
    );
}

function Dashboard() {
    return (
        <div>
            <h2>Dashboard</h2>
        </div>
    );
}

function User() {
    const params = useParams();
    const username = params.username;
    return <div>Welcome: {username}</div>;
}

Router

browserrouter:根据 URL 中的 path 做路由跳转

HashRouter:根据 URL 中的 hash 部分做路由

Route

当 url 和 Route 中定义的 path 匹配时,渲染对应的组件

重要 props:path、exact

Switch

当找到Switch组件内的第一个路由规则匹配的Route组件后,立即停止后续的查找

路由跳转

声明式的组件方式:Link

命令式的 API 调用方式:history.push

Hooks

useHistory:获取 history 对象

useParams:获取路由中的参数

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
创建型-Singleton
what 单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
acc8226
2022/05/17
4680
单例模式的常用实现方式
单例模式属于最常用的设计模式,Java中有很多实现单例模式的方式,各有其优缺点 实现方式对比 单例实现方式 线程安全 延迟加载 性能 复杂度 饿汉式 安全 不支持 好 简单 懒汉式 安全 支持 差 一般 双重检测 安全 支持 好 复杂 静态内部类 安全 支持 好 简单 枚举 安全 不支持 好 最简单 实现方式示例 实现一个ID生成器的单例 饿汉式: 不支持延迟加载 public class IdGenerator { private AtomicLong id = new AtomicLong(0
十毛
2021/12/03
3300
01.单例模式设计思想
本文详细介绍了单例模式的设计思想及其应用。首先阐述了单例模式的基本概念、特点与定义,并探讨其适用场景与常见问题。接着深入分析了为何使用单例模式,包括处理资源访问冲突和表示全局唯一类。随后详细讲解了几种常见的单例实现方式,如饿汉式、懒汉式、双重检查锁定、静态内部类及枚举等,对比了各自优缺点。最后讨论了单例模式可能带来的问题,如对OOP不友好、隐藏依赖关系、扩展性差等,并提出了一些替代解决方案。文章内容丰富,适合希望深入了解单例模式及其应用的读者。
杨充
2024/10/14
1940
深入理解几种单例模式的实现方式
饿汉式的单例实现方式就是说在类加载的时候就已经创建并初始化好了,所以实例的创建过程是线程安全的
测试轩
2020/04/28
3030
深入理解几种单例模式的实现方式
学习单例模式引发的思考
学习单例引发的思考 单例存在哪里问题? 1.单例对oop的支持不友好 OOP 四大特性: 封装 继承 多态 抽象 而单例这种设计模式对于其中的抽象 继承 多态 都支持的不好 为什么这么说呢? 我们先来
Java宝典
2021/01/14
5650
单例模式(下)
在上篇 《单例模式(上)》一文中介绍了单例定义、使用场景、实现方式以及不足,本篇继续整理针对不足的解决方案以及唯一性的相关讨论与实现等。
WindCoder
2020/04/28
1K0
设计模式 | 创建型 | 单例模式
一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
被水淹没
2023/02/25
4730
设计模式 | 创建型 | 单例模式
01.创建型:单例设计模式
创建型:单例设计模式1目录介绍01.单例模式介绍02.单例模式定义03.单例使用场景04.思考几个问题05.为什么要使用单例06.处理资源访问冲突07.表示全局唯一类01.单例模式介绍单例模式是应用最广的模式也是最先知道的一种设计模式,在深入了解单例模式之前,每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式的实现。单例模式特点构造函数不对外开放,一般为private通过一个静态方法或者枚举返回单例类对象确保单例类的对象有且只有一个,尤其是在多线程的环境下确保单例类对象
杨充
2022/09/07
3900
一起学习设计模式--01.单例模式
单例模式是创建型模式的一种,是创建型模式中最简单的设计模式 用于创建那些在软件系统中独一无二的对象。虽然单例模式很简单,但是它的使用频率还是很高的。
独立观察员
2022/12/06
6030
一起学习设计模式--01.单例模式
JAVA设计模式之单例模式
java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例。
秋白
2019/07/02
4370
朋友问我单例模式是什么?
某软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高了系统的整体处理能力,缩短了响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和请求的分发,否则将会带来服务器状态的不一致以及请求分配冲突等问题。如何确保负载均衡器的唯一性是该软件成功的关键,试使用单例模式设计服务器负载均衡器。
千羽
2021/12/29
5320
朋友问我单例模式是什么?
设计模式——单例模式详解
饿汉式:在类加载的时候已经创建好该单例对象。 懒汉式:在需要使用对象的时候才会去创建对象
小尘要自信
2023/10/10
1.3K0
设计模式——单例模式详解
单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
ruochen
2021/11/25
1630
设计模式之单例模式
  Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。   单例模式能够保证一个类仅有唯一的实例,并提供一个全局访问点。单例模式主要有3个特点:
雨落凋殇
2019/12/25
4380
Java设计模式详解----单例模式
前言:软件设计模式( Software Design Pattern ),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。
ma布
2024/10/30
1360
Java设计模式详解----单例模式
设计模式篇之一文搞懂如何实现单例模式
大家好,我是小简,这一篇文章,6种单例方法一网打尽,虽然单例模式很简单,但是也是设计模式入门基础,我也来详细讲讲。
JanYork_简昀
2023/03/16
4.7K0
设计模式篇之一文搞懂如何实现单例模式
死磕GOF23之单例模式
Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides 四人合著出版了一本名为Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)的书,该书首次提到了软件开发中设计模式的概念。
程序新视界
2022/05/09
3140
详解设计模式:单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
栗筝i
2022/12/02
4270
设计模式----单例模式详解
单例模式是java中用的比较多的一种设计模式,目的就是让一个应用中对于某个类,只存在唯一的实例化对象。单例模式有很多实现方案,各有利弊,接下来将做详细分析介绍。
叔牙
2020/11/19
5490
设计模式----单例模式详解
JAVA单例模式
在整个应用中,保证一个类只有一个实例,它提供了一个可以访问到它自己的全局访问点(静态方法)。
week
2018/08/23
6890
相关推荐
创建型-Singleton
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验