react项目创建
1、创建项目
1 | npx create-react-app my-app |
2、组件
1 | import React,{useState,useEffect,useRef} from 'react';//任何组件必须引入react |
3、表单元素
1 | class EssayForm extends React.Component { |
4、路由
1 | //import { BrowserRouter as Router, Switch, Route,Link } from 'react-router-dom'; |
1、路由传参
link标签
1
2
3
4
5
6
7// 页面刷新存在 参数回显到地址栏 类似于get请求 不能传过大的数据
pathname + search
//A页面
<Link to={{pathname: '/setting', search:'id=1'}}>jump --- search</Link>
//B页面取参
this.props.history.location.search1
2
3
4
5
6
7// 页面刷新不存在 参数不回显到地址栏
pathname + 任意值
//A页面
<Link to={{pathname: '/setting', abc:'id=1'}}>jump --- search</Link>
//B页面取参
this.props.history.location.abc1
2
3
4
5
6
7// 页面刷新存在 参数不回显到地址栏
pathname + state
//A页面
<Link to={{pathname: '/setting', state:{'id':1}}}>jump --- search</Link>
//B页面取参
this.props.history.location.state1
2
3
4
5
6
7
8// 动态路由后面加?表示可选,不加表示必选
<Route path="/setting/:id?" component={Setting} />
//A页面
let id = 1;
<Link to={{pathname: `/setting/${id}`}}>jump --- params</Link>
// 取参
//B页面
this.props.history.match.params.id注意【state 传参的方式只支持Browserrouter路由,不支持hashrouter】
试试
Hooks
useRef
- 存储 timeout ID
- 存储和操作 DOM 元素
- 存储不需要被用来计算 JSX 的其他对象。
如果你的组件需要存储一些值,但不影响渲染逻辑,请选择 ref。
遵循这些原则将使你的组件更具可预测性:
- 将 ref 视为脱围机制。当你使用外部系统或浏览器 API 时,ref 很有用。如果你很大一部分应用程序逻辑和数据流都依赖于 ref,你可能需要重新考虑你的方法。
- 不要在渲染过程中读取或写入
ref.current
。 如果渲染过程中需要某些信息,请使用 state 代替。由于 React 不知道ref.current
何时发生变化,即使在渲染时读取它也会使组件的行为难以预测。(唯一的例外是像if (!ref.current) ref.current = new Thing()
这样的代码,它只在第一次渲染期间设置一次 ref。)
React state 的限制不适用于 ref。例如,state 就像 每次渲染的快照,并且 不会同步更新。但是当你改变 ref 的 current 值时,它会立即改变:
1 | ref.current = 5; |
这是因为 ref 本身是一个普通的 JavaScript 对象, 所以它的行为就像对象那样。
当你使用 ref 时,也无需担心 避免变更。只要你改变的对象不用于渲染,React 就不会关心你对 ref 或其内容做了什么。
React 不允许组件访问其他组件的 DOM 节点。甚至自己的子组件也不行!
1 | const inputRef = useRef(null); |
forwardRef
API
使用 forwardRef 后可以解决上面问题
1 | const MyInput = forwardRef((props, ref) => { |
useState
1 | 创建一个响应式数据 |
useEffect
Effect 是 React 范式中的一种脱围机制。它们让你可以 “逃出” React 并使组件和一些外部系统同步,比如非 React 组件、网络和浏览器 DOM。如果没有涉及到外部系统(例如,你想根据 props 或 state 的变化来更新一个组件的 state),你就不应该使用 Effect。移除不必要的 Effect 可以让你的代码更容易理解,运行得更快,并且更少出错。
清除副作用函数一般伴随这第二数组参数依赖,每次依赖发生变化时就会触发清除副作用函数
1 | 渲染后执行某操作 |
useCallback
useCallback
是一个允许你在多次渲染中缓存函数的 React Hook。**useCallback
缓存函数本身**。不像 useMemo
,它不会调用你传入的函数。相反,它缓存此函数。从而除非 productId
或 referrer
发生改变,handleSubmit
自己将不会发生改变。
1 | const cachedFn = useCallback(fn, dependencies) |
1 | import { useCallback } from 'react'; |
如果你已经熟悉了 useMemo
,你可能发现将 useCallback
视为以下内容会很有帮助:
1 | // 在 React 内部的简化实现 |
useMemo
useMemo
是一个 React Hook,它在每次重新渲染的时候能够缓存计算的结果。
useMemo
缓存函数调用的结果。
1 | const cachedValue = useMemo(calculateValue, dependencies) |
1 | import { useMemo } from 'react'; |
你需要给 useMemo
传递两样东西:
- 一个没有任何参数的 calculation 函数,像这样
() =>
,并且返回任何你想要的计算结果。 - 一个由包含在你的组件中并在 calculation 中使用的所有值组成的 依赖列表。
随后每次渲染 react 都会 对比前后依赖项是否相同?无变化则返回缓存的值
*默认情况下,当一个组件重新渲染时,React 会递归地重新渲染它的所有子组件。这时候可以使用 useMemo和useCallback 避免不必要的渲染
自定义hook
1 | // 猫猫图片 |
Hook 规则
1 | 1、只在最顶层使用 Hook |
HOC - Higher order component
1 | 高阶组件: 一个函数,接收一个组件作为参数,返回一个新的组件 |
userReduce
commonContext.jsx
1 | /* |
main.js
1 | import { ContextProvider } from './utils/commonContext' |
App.jsx
1 | import { useUserInfo } from './utils/commonContext' |
在线笔记项目
原型图
功能分析
引入字体库
1 | fortawesome |
内置类型检查
1 | -propTypes |
classnames
1 | // 一个简单的JavaScript工具有条件地一起加入类名 |
引入WangEditor
1 | // v5版本js动态设置初始化内容有点问题 |
引入wangeditor v4版本
1 | // Easy-mde 编辑器 |
State设计原则
1 | 1、最小化 State 原则 |
App state 分析
1 | 1、文件列表 |
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2022/06/17/programming/react/基础/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!