• react常用api


    1.useReducer---状态管理(类似useState)

    一般用于比较复杂的状态管理

    1. import { Button } from "antd";
    2. const { useReducer } = require("react");
    3. // 1. 定义reducer函数 根据不同的action 返回不同的状态
    4. function reducer(state, action) {
    5. switch (action.type) {
    6. case "INC":
    7. return state + 1;
    8. case "DEC":
    9. return state - 1;
    10. case "SET":
    11. return action.payload;
    12. default:
    13. return state;
    14. }
    15. }
    16. function App() {
    17. // 2. 组件中调用useReducer(reducer,0) => [state,dispatch]
    18. // reducer--reducer函数 0--状态初始值
    19. const [state, dispatch] = useReducer(reducer, 0);
    20. return (
    21. <div className="App">
    22. <Button type="primary" onClick={() => dispatch({ type: "DEC"})}>-Button>
    23. {state}
    24. {/* 3. 调用dispatch({type:'INC}) => 通知reducer产生一个新的状态 使用这个新状态更新UI */}
    25. <Button type="primary" onClick={() => dispatch({ type: "INC" })}>+Button>
    26. <Button type="primary" onClick={() => dispatch({ type: "SET", payload: 100 })}>updateButton>
    27. div>
    28. );
    29. }
    30. export default App;

    2.useMemo

    在组件每次重新渲染的时候缓存计算的结果

    1. import { Button } from "antd";
    2. import { useMemo, useState } from "react";
    3. // 计算斐波那契数列之和
    4. function fib(n) {
    5. if (n < 3) return 1;
    6. return fib(n - 2) + fib(n - 1);
    7. }
    8. function App() {
    9. const [count1, setCount1] = useState(0)
    10. useMemo(() => {
    11. return fib(count1)
    12. })
    13. const [count2, setCount2] = useState(0)
    14. return (
    15. <div className="App">
    16. {result}
    17. <Button type="primary" onClick={() => setCount1(count1 + 1)}>测试{count1}Button>
    18. <Button type="primary" onClick={() => setCount2(count2 + 1)}>测试{count2}Button>
    19. div>
    20. );
    21. }
    22. export default App;

    3.React.memo

    允许组件在Props没有改变的情况下跳过渲染-----解决父组件发生变化,子组件在没有的时候,不再重新渲染子组件

    React组件的默认渲染机制:只要父组件重新渲染子组件就会重新渲染

    1. import { useMemo, useState } from "react";
    2. // 在使用memo缓存组件之后,React会对每一个 prop 使用 Objectis 比较新值和老值,返回true,表示没有变化
    3. const MemoSon = memo(function Son({count}) {
    4. console.log('子组件发生变化');
    5. return <div>son{count}div>;
    6. })
    7. function App() {
    8. // 1.简单类型
    9. const [count, setCount] = useState(0);
    10. // 2.引用类型 比较的是新值和旧值得应用 当父组件函数重新执行时,实际上形成的是新的数组引用
    11. // const list = [1, 2, 3]
    12. // 3.保证引用稳定
    13. useMemo(() => {
    14. return [1, 2, 3]
    15. }, [])
    16. return (
    17. <div className="App">
    18. <MemoSon count={list} />
    19. <button onClick={() => setCount(count + 1)}>+button>
    20. div>
    21. );
    22. }
    23. export default App;

    4.useCallback

    在组件多次重新渲染的时候缓存函数

    1. import { useCallback, useState } from "react";
    2. const Input = memo(function Input({onChange}) {
    3. console.log('子组件发生变化');
    4. return <input type="text" onChange={(e) => onChange(e.target.value)} />
    5. })
    6. function App() {
    7. // 触发父组件重新渲染的函数
    8. const [count, setCount] = useState(0);
    9. // 穿给子组件的函数
    10. const changeHandler = useCallback((value) => console.log(value), []);
    11. return (
    12. <div className="App">
    13. <Input onChange={changeHandler} />
    14. <button onClick={() => setCount(count + 1)}>+button>
    15. div>
    16. );
    17. }
    18. export default App;

    5.React.forwardRef

    使ref暴露DOM节点给父组件

    1. import { forwardRef, useRef } from "react";
    2. const Input = forwardRef((props, ref) => {
    3. return <input type="text" ref={ref} />
    4. })
    5. function App() {
    6. const inputRef = useRef(null)
    7. const showRef = () => {
    8. console.log(inputRef);
    9. inputRef .current.focus();
    10. };
    11. return (
    12. <div className="App">
    13. <Input ref={inputRef} />
    14. <button onClick={showRef}>focusbutton>
    15. div>
    16. );
    17. }
    18. export default App;

    6.useInperativeHandle

    使ref暴露DOM节点给父组件

    1. import { forwardRef, useRef, useInperativeHandle } from "react";
    2. const Input = forwardRef((props, ref) => {
    3. const inputRef = useRef(null)
    4. // 实现聚焦函数
    5. const focusHandler = () => {
    6. inputRef.current.focus()
    7. }
    8. // 暴露函数给父组件使用
    9. useInperativeHandle(ref, () => {
    10. return {
    11. focusHandler
    12. }
    13. })
    14. return <input type="text" ref={inputRef} />
    15. })
    16. function App() {
    17. const inputRef = useRef(null)
    18. const focusHandler = () => {
    19. inputRef.current.focusHandler();
    20. };
    21. return (
    22. <div className="App">
    23. <Input ref={inputRef} />
    24. <button onClick={focusHandler}>focusbutton>
    25. div>
    26. );
    27. }
    28. export default App;
  • 相关阅读:
    remote: The project you were looking for could not be found
    如何从 PowerShell grep 搜索文本
    基于Halcon的图像增强算子以及分类例程汇总
    电脑卡怎么办?4招帮你解决电脑卡顿的烦恼!
    论文笔记之《Pre-trained Language Model for Web-scale Retrieval in Baidu Search》
    NIO 实现群聊系统
    Win10打开软件提示comdlg32.ocx文件丢失?
    Linux中ROS话题通信基本操作(Python实现)
    Pytorch框架学习记录6——torch.nn.Module和torch.nn.functional.conv2d的使用
    区块链实验室(24) - FISCO网络重构
  • 原文地址:https://blog.csdn.net/poguanba/article/details/134239724