react-17-部分hook

98 阅读1分钟

常用 hook

1. useCallback 函数

该方法的返回值是一个函数。

该方法有两个参数,第一个参数是一个函数,第二个参数是记忆的依赖项,只有依赖发生变化之后才会重新缓存。

该方法使用得当确实可以优化性能,使用不当则会降低性能。

  const handleAdd = useCallback(
      () => {
      
  		},
      [依赖项1, 依赖项2, ...]
  )
import React, { useState, useCallback } from "react"

const Pagec = () => {
  const [content, setContent] = useState("")
  const [list, setList] = useState([])
  const [name, setName] = useState("zrs")

  const changeName = () => {
    setName(">>>>>>>>>>>>>>")
    console.log(">>>>>>>>>>>>")
  }

  const handleChange = (e) => {
    setContent(e.target.value)
  }

  // 其实这里降低了性能
  const handleAdd = useCallback(() => {
    setList([...list, content])
    setContent("")
    console.log("handleAdd")
  }, [content, list])

  const handleDel = useCallback(
    (index) => {
      const newList = [...list]
      newList.splice(index, 1)
      setList(newList)
      console.log("handleDel")
    },
    [list]
  )

  return (
    <>
      <div>
        <button onClick={changeName}>changeName</button>
        <div>{name}</div>
      </div>
      <hr />
      <div>
        <input
          value={content}
          type="text"
          onChange={(e) => {
            handleChange(e)
          }}
        />
        <button onClick={handleAdd}>添加</button>
      </div>

      <ul>
        {list.map((item, index) => {
          return (
            <li key={index + item}>
              {item}
              <button
                onClick={() => {
                  handleDel(index)
                }}
              >
                删除
              </button>
            </li>
          )
        })}
      </ul>
    </>
  )
}

export default Pagec

2. useMemo 函数

该方法的返回值是一个数据。类似于vue中的计算属性。

该函数有两个参数,第一个参数是一个函数,第二个参数是依赖数组。

第一个函数的计算返回一个值,给useMemo,然后useMemo返回给newList

当依赖数组不变化的时候,会一直使用缓存的值。

  const newList = useMemo(
    () =>res
    [依赖项1, 依赖项2, ...]
  )
import React, { useMemo, useEffect, useState, useRef } from "react"

const PageD = () => {
  const [list, setList] = useState([])
  const [content, setContent] = useState("")
  const myRef = useRef()

  useEffect(() => {
    fetch("data.json")
      .then((res) => res.json())
      .then((res) => {
        setList(res)
      })
  }, [])

  const newList = useMemo(
    () =>list.filter(
        (item) => item.name.includes(content) || item.address.includes(content)
      ),
    [list, content]
  )

  return (
    <>
      <div>
        <input ref={myRef} type="text" />
        <button
          onClick={() => {
            setContent(myRef.current.value)
          }}
        >
          确认
        </button>
      </div>
      {newList.map((item) => {
        return (
          <div key={item.cinemaId}>
            <h3>{item.name}</h3>
            {item.address}
          </div>
        )
      })}
    </>
  )
}
export default PageD