useRef, useMomo

·

2 min read

useMemo 相当于 vue2 中的computed,依赖项不变,结果不会重新计算。

import { useEffect, useMemo, useState } from "react"

function SearchUserList() {
    console.log(111);
    const [users, setUsers] = useState(null)
    const [searchKey, setSearchKey] = useState('')
    useEffect(() => {
        const doFetch = async ()=> {
            const res = await fetch('https://reqres.in/api/users')
            setUsers(await res.json())
        }
        doFetch()
    }, [])

    // let usersToShow = null
    // if(users) {
    //     usersToShow =users.data.filter(user => {
    //         return user.first_name.includes(searchKey)
    //     })
    // }

  // useMemo 就是 vue2 中的 computed
    const usersToShow = useMemo(() => {
    console.log(111);
        if(!users) return null
        return users.data.filter(user => user.first_name.includes(searchKey))
    }, [users, searchKey])

    return (
        <div>
            <input type="text"
                value={searchKey}
                onChange={(evt) => setSearchKey(evt.target.value)} />
            <ul>
                {usersToShow &&
                    usersToShow.length > 0 &&
                        usersToShow.map(user => {
                            return <li key={user.id}>{user.first_name}</li>
                        })}
            </ul>
        </div>
    )
}

export default SearchUserList

useRef相当于函数组件中的属性,相当于类中的成员变量。

useRef 还可以用来获取组件中的dom

useRef可以在函数内定义有记忆能力的变量,普通函数内的变量在函数执行后会销毁,无法记忆之前的值。

import { useCallback, useRef, useState } from "react";

export default function Timer() {
    const [time, setTime] = useState(0)
  // 
    const timer = useRef(null)

    const handleStart = useCallback(() => {
        timer.current = window.setInterval(() => {
            setTime(prevTime => prevTime + 1)
        }, 100)
    }, [])

    const handlePause = useCallback(() => {
        window.clearInterval(timer.current)
        timer.current = null
    }, [])

    return (
        <div>
            {time/10} seconds.
            <br />
            <button onClick={handleStart}>start</button>
            <button onClick={handlePause}>end</button>
        </div>
    )
}
import { useRef } from "react";

export default function FocusedInput() {
    const input = useRef(null)

    return (
        <div>
            <input type="text" ref={input}/>
            <button onClick={() => input.current.focus()}>focus</button>
        </div>
    );
}

useContext 让react有定义全局响应式数据的能力。全局数据A变了,使用这个数据A的所有组件都会更新。