usePrevious

获取上一次渲染时的值的 Hook。

基础用法

import { usePrevious } from 'miaoma-rhooks'
import React, { useState } from 'react'

function Demo() {
    const [count, setCount] = useState(0)
    const previousCount = usePrevious(count)

    return (
        <div>
            <p>当前值: {count}</p>
            <p>上一次的值: {previousCount}</p>
            <button onClick={() => setCount(count + 1)}>增加</button>
        </div>
    )
}

API

const previousValue = usePrevious<T>(value: T);

Params

参数 说明 类型 默认值
value 需要记录上一次值的变量 T -

Result

参数 说明 类型
previousValue 上一次渲染时的值 T | undefined

进阶用法

比较变化

import { usePrevious } from 'miaoma-rhooks'
import React, { useState, useEffect } from 'react'

function CompareChanges() {
    const [count, setCount] = useState(0)
    const previousCount = usePrevious(count)
    const [direction, setDirection] = useState('')

    useEffect(() => {
        if (previousCount !== undefined) {
            if (count > previousCount) {
                setDirection('增加')
            } else if (count < previousCount) {
                setDirection('减少')
            }
        }
    }, [count, previousCount])

    return (
        <div>
            <p>当前值: {count}</p>
            <p>上一次的值: {previousCount}</p>
            <p>变化方向: {direction}</p>
            <button onClick={() => setCount(count + 1)}>增加</button>
            <button onClick={() => setCount(count - 1)}>减少</button>
        </div>
    )
}

监控对象属性变化

import { usePrevious } from 'miaoma-rhooks'
import React, { useState, useEffect } from 'react'

function ObjectPropertyMonitor() {
    const [user, setUser] = useState({
        name: '张三',
        age: 25,
        role: '开发者'
    })
    const previousUser = usePrevious(user)
    const [changes, setChanges] = useState([])

    // 检测对象属性变化
    useEffect(() => {
        if (previousUser) {
            const changedProps = []
            Object.keys(user).forEach(key => {
                if (user[key] !== previousUser[key]) {
                    changedProps.push({
                        property: key,
                        from: previousUser[key],
                        to: user[key]
                    })
                }
            })

            if (changedProps.length > 0) {
                setChanges(changedProps)
            }
        }
    }, [user, previousUser])

    const updateUser = (field, value) => {
        setUser({
            ...user,
            [field]: value
        })
    }

    return (
        <div>
            <h3>用户信息</h3>
            <div>
                <label>姓名: </label>
                <input value={user.name} onChange={e => updateUser('name', e.target.value)} />
            </div>
            <div>
                <label>年龄: </label>
                <input type="number" value={user.age} onChange={e => updateUser('age', Number(e.target.value))} />
            </div>
            <div>
                <label>角色: </label>
                <select value={user.role} onChange={e => updateUser('role', e.target.value)}>
                    <option value="开发者">开发者</option>
                    <option value="设计师">设计师</option>
                    <option value="产品经理">产品经理</option>
                </select>
            </div>

            {changes.length > 0 && (
                <div>
                    <h4>最近的变化:</h4>
                    <ul>
                        {changes.map((change, index) => (
                            <li key={index}>
                                {change.property}: {String(change.from)}{String(change.to)}
                            </li>
                        ))}
                    </ul>
                </div>
            )}
        </div>
    )
}