react基本使用(二)

本文详细介绍了React的基础语法,使用create-react-app搭建项目环境,组件间通信方式,react-router的使用,以及结合antd-mobile UI框架和状态管理库Redux的方法。

上文已经将react基本的语法过了一遍,接下来用下cli脚手架工具

1.脚手架库 create-react-app

1.官方提供了项目脚手架create-react-app
2.项目的整体技术架构为react+webpack+es6+eslint
3.使用脚手架开发项目的特点:模块化,组件化,工程化

创建项目并启动
npm install -g create-react-app
create-react-app myProject
cd myProject
npm start

2.组件之间通信的2种方式

方法一: 就是用props进行数据传递,但是这样的传递只能一层一层进行传递
        父组件向子组件进行传递-》子组件进行数据的读取
        子组件向父组件进行传递-》子组件进行调用函数
方法二:pubsub.js
        npm install pubsub.js
        组件中引入 import PubSub from pubsub-js
        PubSub.publish('方法名',传递的参数)
        PubSub.subscript('方法名',function(msg,data){
                回调里边进行事件的操作
        })

        
        

3.react-router使用说明

浏览器bom对象有一个history属性会记住我们操作的历史,进行回退前进的操作
在此我们以使用history.js对象为例--此js库对操作进行了封装,操作使用比较简单
代码示例
history.push()
history.go()
history.replace()
history.forword()
history.listen(回调)

react-router相关api
----常用组件
<BrowserRouter>
<HashRouter>
<Route>
<Redirect>
<Link>
<NavLink>
<Switch>

安装使用插件npm install --save reatc-router-dom
使用
import {BrowserRouter} from 'reatc-router-dom'
代码示例:用router对整个应用进行管理
    render (
        (
            <BrowserRouter>
                <App/>
            </BrowserRouter>
        ),
        document.getElementById('root')
    )

4.router中 NavLink 和 Route组件实现路由切换的基本使用,参考网上代码图片示例

5.可以对路由组件NavLink>进行包装--属性统一接收{...props},这个属于调优的部分自行百科 ,不做过多陈述

6.向路由组件传递数据及两种路由跳转方式

路由子组件中获取路由传递的参数
this.props.match.params
上边截图是一种路由跳转的方式
还有点击事件操作路由进行跳转
下边代码简单示例
<button onclick={()=>{this.change(传递的参数)}}></button>
change(data){
    this.props.history.push(path)
}

7.react结合的开源ui框架

常用的react界面ui库
1.国外的material-ui
2.国内的ant-design
下边简介下国内ant-d简单应用
在脚手架项目中使用
npm install antd-mobile --save
全局引入,ui的css文件
在组件内部引入使用--根据官网使用
import {Button} from 'antd-mobile'



综上全局引入全部的样式文件就增加的打包的资源
官网强烈建议,webpack打包插件配置按需打包引入
<1>下载安装包
    npm install react-app-rewired --save
    npm install babel-plugin-import--save
<2>修改默认配置
    package.json中进行修改
    "scripts":{
        "start":"react-app-rewired start",
        "build":"react-app-rewired build",
        "test":"react-app-rewired test --env=jsdom"
    }
<3>新建config-overrides.js文件
内容如下截图

8.react中状态管理redux

js库,和react配合使用。作用是管理应用中多个组件共享的状态
安装依赖包
npm install redux --save

redux作为react中比较重要的一部分 ,今天到此为止,下篇继续(三)

<think>我们正在讨论React中的useCallback Hook。根据提供的引用内容,我们可以总结useCallback的基本使用方法如下: 1. **目的**:useCallback 用于记忆函数定义,避免在每次渲染时创建新的函数实例。这在将回调函数传递给子组件时特别有用,可以配合React.memo来避免子组件不必要的重新渲染。 2. **基本语法**: ```javascript const memoizedCallback = useCallback( () => { doSomething(a, b); // 函数体 }, [a, b], // 依赖项数组 ); ``` 其中,第一个参数是需要记忆的函数,第个参数是依赖数组。只有当依赖数组中的值发生变化时,才会重新创建函数。 3. **注意事项**: - 如果依赖数组为空(`[]`),则该函数只会在组件首次渲染时创建一次,后续渲染都将返回同一个函数实例。 - 如果依赖数组不为空,则当依赖项发生变化时,才会重新创建函数。 - 过度使用useCallback可能会导致性能问题(如影响内联优化)或内存问题(如闭包中缓存对象无法及时回收),因此需要根据实际情况权衡使用。 下面是一个简单的示例,展示了useCallback的基本用法: ```javascript import React, { useState, useCallback } from 'react'; function Counter() { const [count, setCount] = useState(0); // 不使用useCallback:每次渲染都会创建新的函数实例 const increment1 = () => { setCount(count + 1); }; // 使用useCallback:依赖数组为空,函数只创建一次 // 注意:由于闭包,这里的count始终是初始值0,所以实际效果可能不符合预期 const increment2 = useCallback(() => { setCount(count + 1); }, []); // 正确使用:在依赖数组中添加count,这样每次count变化时,函数会更新 const increment3 = useCallback(() => { setCount(count + 1); }, [count]); return ( <div> <p>Count: {count}</p> <button onClick={increment1}>不用useCallback (+1)</button> <button onClick={increment2}>useCallback空依赖 (+1) 有问题</button> <button onClick={increment3}>useCallback依赖count (+1)</button> </div> ); } ``` 在上面的例子中: - `increment1` 每次渲染都会重新创建,如果传递给子组件,可能会导致子组件不必要的重新渲染。 - `increment2` 使用了useCallback且依赖数组为空,所以函数只创建一次。但由于它闭包了初始的count值(0),所以每次调用都相当于`setCount(0+1)`,即使count已经改变,它仍然设置成1(因为初始值为0,加1后为1,后续再点击也始终是1)。 - `increment3` 正确地在依赖数组中添加了count,这样每次count改变时,函数会重新创建,并持有最新的count值。 因此,在使用useCallback时,必须注意依赖数组的设置,避免出现闭包陷阱。 §§相关问题§§ 1. useCallback和useMemo有什么区别? 2. 如何避免useCallback中的闭包陷阱? 3. 在什么情况下应该使用useCallback? 4. useCallback如何与React.memo配合使用? </think>### React 中 `useCallback` 的基本使用方法 `useCallback` 是 React 的一个核心 Hook,用于**缓存函数定义**,避免组件重新渲染时重复创建函数实例。以下是其基本使用方法: #### 1. **基本语法** ```javascript const memoizedCallback = useCallback( () => { // 函数逻辑 (例如更新状态、调用API等) doSomething(a, b); }, [a, b] // 依赖项数组 ); ``` - **第一个参数**:需要缓存的函数。 - **第个参数**:依赖项数组(Dependency Array),当数组中的变量变化时,函数会重新创建。 #### 2. **核心作用** - **避免不必要的函数重建**:默认情况下,组件每次渲染都会创建新的函数实例,使用 `useCallback` 后可复用函数。 - **优化子组件渲染**:当缓存的函数作为 props 传递给子组件(配合 `React.memo`)时,可避免子组件不必要的重渲染[^1][^3]。 #### 3. **使用示例** ```jsx import React, { useState, useCallback } from 'react'; function Counter() { const [count, setCount] = useState(0); // ✅ 缓存函数:依赖项为空数组,函数只创建一次 const increment = useCallback(() => { setCount(prev => prev + 1); // 使用函数式更新避免闭包问题 }, []); return ( <div> <p>Count: {count}</p> <button onClick={increment}>+1</button> </div> ); } ``` **关键点**: - 依赖项 `[]` 表示函数仅在组件初次渲染时创建。 - 使用 `setCount(prev => prev + 1)` 替代 `setCount(count + 1)` 可避免闭包陷阱(函数捕获过时状态)[^2][^3]。 #### 4. **适用场景** - 函数作为 props 传给**性能敏感的子组件**(如用 `React.memo` 包裹的组件)。 - 函数被用于 `useEffect` 等 Hook 的依赖项时,避免因函数引用变化触发副作用[^1][^3]。 #### 5. **注意事项** - **避免滥用**:在简单组件中可能得不偿失,仅当实测有性能问题时使用- **正确设置依赖项**:遗漏依赖会导致闭包问题(函数使用过时变量值)[^2][^3]。 - **闭包内存问题**:缓存函数可能导致内部对象无法被垃圾回收(如函数内创建大型对象)[^3]。 > 示例中 `increment` 函数被缓存后,无论组件如何渲染,函数引用始终不变,从而优化传递给子组件的性能[^1][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值