You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Hooks useContext场景下如何封装调用setUserContext的可复用函数

可行解决方案

方案1:自定义返回回调函数的Hook(最推荐)

解决你之前的误区:自定义Hook不需要在onClick回调中调用,只需要在组件顶层执行,返回的回调函数可以直接绑定给onClick。

// 单独抽离的自定义Hook useFavoriteItem.js
import { useContext } from 'react'
import UserContext from '你的UserContext文件路径'

export const useFavoriteItem = () => {
  const { userContext, setUserContext } = useContext(UserContext)
  // 重复逻辑统一封装在Hook内部
  const favoriteItem = (e) => {
    e.stopPropagation()
    e.preventDefault()
    setUserContext({ 
      ...userContext, 
      favoriteItems: JSON.parse(localStorage.getItem("favoriteItems")) 
    })
  }
  return favoriteItem
}

组件内使用方式:

import { useFavoriteItem } from './useFavoriteItem'

const YourComponent = () => {
  // 组件顶层调用Hook拿到处理函数
  const handleFavorite = useFavoriteItem()
  // 直接绑定到onClick属性即可
  return <button onClick={handleFavorite}>收藏</button>
}

方案2:封装普通工具函数,传入依赖参数

不需要在工具函数内调用useContext,把需要的上下文状态和更新方法作为参数传入即可实现复用。

// 单独抽离的工具函数 favoriteUtils.js
export const favoriteItemHandler = (e, userContext, setUserContext) => {
  e.stopPropagation()
  e.preventDefault()
  setUserContext({ 
    ...userContext, 
    favoriteItems: JSON.parse(localStorage.getItem("favoriteItems")) 
  })
}

组件内使用方式:

import { useContext } from 'react'
import UserContext from '你的UserContext文件路径'
import { favoriteItemHandler } from './favoriteUtils'

const YourComponent = () => {
  const { userContext, setUserContext } = useContext(UserContext)
  return <button onClick={(e) => favoriteItemHandler(e, userContext, setUserContext)}>收藏</button>
}

方案3:逻辑封装到Context Provider层直接导出

如果该逻辑只会和UserContext绑定使用,可以直接把处理函数放在Provider里,所有消费组件直接取用即可,不需要额外引入其他依赖。

// UserContextProvider.js
import { createContext, useContext, useState } from 'react'

const UserContext = createContext()

export const UserContextProvider = ({ children }) => {
  const [userContext, setUserContext] = useState(你的初始上下文值)
  // 逻辑直接封装在Provider内部
  const favoriteItem = (e) => {
    e.stopPropagation()
    e.preventDefault()
    setUserContext({ 
      ...userContext, 
      favoriteItems: JSON.parse(localStorage.getItem("favoriteItems")) 
    })
  }
  return (
    <UserContext.Provider value={{ userContext, setUserContext, favoriteItem }}>
      {children}
    </UserContext.Provider>
  )
}

// 导出统一的消费Hook
export const useUserContext = () => useContext(UserContext)

组件内使用方式:

import { useUserContext } from './UserContextProvider'

const YourComponent = () => {
  const { favoriteItem } = useUserContext()
  return <button onClick={favoriteItem}>收藏</button>
}

内容的提问来源于stack exchange,提问作者SoGoddamnUgly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:27:01