为什么自定义Hooks里面的使用useState然后导出状态和方法,不同组件调用不能更新

47 阅读1分钟
const useMyHook=()=>{
  const [showUploadModal, setShowUploadModal] = useState(false);
  
  return {
    showUploadModal,
    setShowUploadModal,
  };
  
}

export defaut useMyHook

然后分别在两个组件中调用,A组件设置setShowUploadModal,B组件引用showUploadModal,A调用完,B组件不会重新渲染

原因

  1. Hook的特性:自定义Hook主要用于逻辑复用,而不是状态共享。每次使用Hook时,它都会创建自己的闭包和状态。

  2. 组件独立性:React组件是独立的,它们的状态更新不会自动影响其他组件,除非它们共享同一个状态源(如父组件传递的props或全局状态管理)。

  3. 状态隔离:每次调用自定义Hook时,React都会创建一个新的状态实例。这意味着如果两个不同的组件使用了同一个自定义Hook,它们实际上会得到两个独立的状态实例。

解决方案:

  1. 使用全局状态管理:

    • 可以使用Redux、MobX或React Context API来创建一个全局状态,这样所有组件都可以访问和更新同一个状态。
  2. 将状态提升到共同的父组件:

    • 如果使用这个状态的组件有共同的父组件,可以将状态提升到父组件,然后通过props传递给子组件。
  3. 使用React Context:

    • 创建一个Context来包装这个状态,然后用Provider包裹需要共享这个状态的组件树。
  4. 使用发布-订阅模式:

    • 实现一个简单的事件总线,让组件可以订阅状态变化。
  5. 使用自定义事件:

    • 使用浏览器的自定义事件系统来在组件间通信。