前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一小时入门React
注意:在点击事件中,不要直接调用函数,如果需要传递参数,使用箭头函数,jsx中所有dom事件必须用驼峰命名。如下:
乐圣
2022/11/19
1.1K0
一小时入门React
你要的 React 面试知识点,都在这了
React是流行的javascript框架之一,在2019年及以后将会更加流行。React于2013年首次发布,多年来广受欢迎。它是一个声明性的、基于组件的、用于构建用户界面的高效javascript库。
前端小智@大迁世界
2019/06/15
19.2K0
React
被称为 JSX,它是 JavaScript 的语法扩展,JSX 产生 React “元素”,可渲染到 DOM 中
晚上没宵夜
2022/11/14
2.3K0
react进阶用法完全指南
React调用回调函数,正确设置this指向的三种方法 通过bind this.increment = this.increment.bind(this); 通过箭头函数 <button onClick={this.multi}>点我*10</button> multi = () => { this.setState({ count: this.state.count * 10 }) } 箭头函数包裹 <button onClick={() => {this.muti2(
xiaofeng123aa
2022/09/26
6.1K0
react面试题合集
Redux 的基本思想是整个应用的 state 保持在一个单一的 store 中。store 就是一个简单的 javascript 对象,而改变应用 state 的唯一方式是在应用中触发 actions,然后为这些 actions 编写 reducers 来修改 state。整个 state 转化是在 reducers 中完成,并且不应该有任何副作用。
beifeng1996
2022/12/12
6890
一文读透react精髓
学和使用react有一年多了,最近想在梳理一下react基础知识,夯实基础,激流勇进~
xiaofeng123aa
2022/09/25
2.9K0
react-03
1. 理解react-router react的一个插件库 专门用来实现一个SPA应用 基于react的项目基本都会用到此库 2. 几个重要问题 1). SPA应用 单页Web应用(single pa
用户2337871
2019/07/19
2.6K0
React Ref 使用总结
useRef 还可以传入一个初始值,这个值会保存在 ref.current 中,上面代码中,如果不给 div 元素传递 ref={divRef},则 divRef.current 的值将是我们传入的初始值。
多云转晴
2020/09/08
7.1K0
React Ref 使用总结
测开技能--Web开发 React 学习(十)表单
列表 & Key function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => <li key={number}>{number}</li> ); return ( <ul>{listItems}</ul> ); } const numbers = [1, 2, 3, 4, 5]; ReactDOM.render( <Num
雷子
2021/03/15
4100
测开技能--Web开发 React 学习(十)表单
React 组件化开发(二):最新组件api
如果连这点觉悟都没有,那就不是一个合格的程序员。而雇主的本质是逐利,最忌讳的是重构,这个问题可以请高水平的工程师来得到缓解,但不可能彻底解决。
一粒小麦
2019/07/18
2.4K0
React 组件化开发(二):最新组件api
react学习
JSX是一个JavaScript的语法扩展。因为JSX在语法上更简洁JavaScript而不是HTML,所以React DOM使用cameCase来定义属性的名称,而不是用HTML属性名称的命名约定。
Cloud-Cloudys
2020/07/07
4.6K0
React基础语法
JSX语法中,可以在大括号内放置任何有效的JavaScript表达式。例如2+2、user.firstName或formatName(user)等均是有效的JavaScript表达式。
前端_AWhile
2020/05/18
5.1K0
01-React基础(JSX, State, Refs, Props组件交互, Event, 生命周期)
引入JS # react 开发JS react.development.js # react dom渲染JS react-dom.development.js # jsx语法转换JS babel.min.js # 参数传值校验JS prop-types.js JSX语法 # 容器 <div id="test"></div> # 注意写JSX语法需要定义为babel <script type="text/babel"> const myName = "flower"; # 创建虚拟DOM, 不需要写
彼岸舞
2022/08/24
1.2K0
01-React基础(JSX, State, Refs, Props组件交互, Event, 生命周期)
滴滴前端二面react面试题总结
Refs 提供了一种方式,用于访问在 render 方法中创建的 React 元素或 DOM 节点。Refs 应该谨慎使用,如下场景使用 Refs 比较适合:
goClient1992
2022/09/14
1.1K0
一份react面试题总结
两者都是用来初始化state的。前者是ES6中的语法,后者是ES5中的语法,新版本的React中已经废弃了该方法。
beifeng1996
2022/09/27
7.6K0
我的react面试题笔记整理(附答案)
组件状态数据或者属性数据发生更新的时候,组件会进入存在期,视图会渲染更新。在生命周期方法 should ComponentUpdate中,允许选择退出某些组件(和它们的子组件)的和解过程。
beifeng1996
2022/11/15
1.3K0
React学习笔记(四)—— 组件通信与状态管理、Hooks、Redux、Mobe
2、利用Redux进行状态管理,这种方式的配套工具比较齐全,可以自定义各种中间件;
张果
2023/03/24
5.2K0
React学习笔记(四)—— 组件通信与状态管理、Hooks、Redux、Mobe
40道ReactJS 面试问题及答案
英文 | https://blog.stackademic.com/top-40-reactjs-interview-questions-and-answers-for-2024-70c94e5fccca
winty
2024/04/03
2.3K0
40道ReactJS 面试问题及答案
React 状态、事件与动态渲染
例子中使用map方法将每个元素的值*2,最后得到的数组为:[2, 4, 6, 8, 10]。在React中,处理组件数组的方式与之类似。
随风溜达的向日葵
2018/07/31
1.6K0
React 开发要知道的 34 个技巧
原理:子组件里面利用 props 获取父组件方法直接调用,从而改变父组件的值 注意: 此方法和 props 大同小异,都是 props 的应用,所以在源码中没有举例
前端老王
2020/09/23
1.6K0
相关推荐
一小时入门React
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验