我有一个简单的React组件:如何通过添加useCallback挂钩来改进这个组件?

import styled from "styled-components"
import React, { useState } from "react"
import { useGetFilteredBooks } from "../../hooks/useGetFilteredBooks"
import { useRecoilState } from "recoil"
import { Books, PageNumber, SearchText } from "../../recoil/globalState"



export const SearchBook = () => {
    const [text, setText] = useRecoilState(SearchText)
    const [pageNumber, setPageNumber] = useRecoilState(PageNumber)
    const [setBooks] = useRecoilState(Books);
    const { refetch } = useGetFilteredBooks(text, setBooks, setPageNumber);

    const handleOnChange = (event: React.ChangeEvent<HTMLInputElement>) => {
        setText(event.target.value)
    }

    const handleOnSubmit = (e: any) => {
        e.preventDefault();
        refetch();
    }


    return (
        <>
            <form onSubmit={handleOnSubmit}>
                <Input value={text} onChange={handleOnChange} placeholder="Enter the name of the book or author" />
                <button type="submit">Show</button>
            </form>
        </>
    )
}

const Input = styled.input`
    padding: 10px 10px;
    width: 300px;
`

推荐答案

useCallback if you know that you will be going to use those functions as a dependency in other hooks like useEffect or useMemo中记忆一个函数是一个好主意,在您的情况下,您的函数非常简单,并且您没有将它们用作其他挂钩的DEP,在每次重新渲染时重新创建它们的计算成本可以忽略不计,因此这里不需要使用useCallback.请注意,如果在useCallback的deps数组中放置其他未记忆的函数,那么这将一文不值.如果您仍计划将这些函数包装在useCallback中,以便在其他组件/挂钩中使用它们:

import styled from "styled-components"
import React, { useState, useCallback } from "react"
import { useGetFilteredBooks } from "../../hooks/useGetFilteredBooks"
import { useRecoilState } from "recoil"
import { Books, PageNumber, SearchText } from "../../recoil/globalState"



export const SearchBook = () => {
    const [text, setText] = useRecoilState(SearchText)
    const [pageNumber, setPageNumber] = useRecoilState(PageNumber)
    const [setBooks] = useRecoilState(Books);
    const { refetch } = useGetFilteredBooks(text, setBooks, setPageNumber);

    const handleOnChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
        setText(event.target.value)
    },[])  // No deps needed here according to ESLint, since react setState<s> do not change during re-renders.

    const handleOnSubmit = useCallback((e: any) => {
        e.preventDefault();
        refetch();
    },[refetch]) // refetch is needed here, since it might change during re-renders, you should make sure to memoize that function as well


    return (
        <>
            <form onSubmit={handleOnSubmit}>
                <Input value={text} onChange={handleOnChange} placeholder="Enter the name of the book or author" />
                <button type="submit">Show</button>
            </form>
        </>
    )
}

const Input = styled.input`
    padding: 10px 10px;
    width: 300px;
`

Reactjs相关问答推荐

如何在Pivot模式下自定义标题?

在带有和设计的表格中禁用和取消选中复选框

如何使用Reducer更新全局变量

避风港访问端口以包含Reaction应用程序

React中的useEffect钩子

更改滑块标记的文本 colored颜色 ./Reaction/MUI 5

无法在REACTION TANSTACK查询中传递参数

从 MongoDB createAt 字段中分割精确时间

react 本机屏幕转换

使用获取的数据更新状态,但在try console.log 时它给出未定义

React Wordpress Apache 在索引之外重新加载 -> 未找到页面

useRef 不关注模态

CORS策略:对预检请求的响应未通过访问控制判断:没有Access-Control-Allow-Origin

为什么 createSlice 中的 reducer 不能以不同的方式改变状态?

无法访问 usefocusEffect 中 const 的更新状态

如何实现 redux 工具包来注册用户?

带有 webpack 错误多个文件匹配路由名称的 Expo-router.无法Bundle 或部署应用程序

使用 React Router v6 监听来自不同组件的组件状态变化

Material UI:使用 mui 手风琴时出现props 类型失败:isValidElement 不是函数

setState 改变对象引用