const useMyHook=()=>{
const [showUploadModal, setShowUploadModal] = useState(false);
return {
showUploadModal,
setShowUploadModal,
};
}
export defaut useMyHook
然后分别在两个组件中调用,A组件设置setShowUploadModal,B组件引用showUploadModal,A调用完,B组件不会重新渲染
原因
-
Hook的特性:自定义Hook主要用于逻辑复用,而不是状态共享。每次使用Hook时,它都会创建自己的闭包和状态。
-
组件独立性:React组件是独立的,它们的状态更新不会自动影响其他组件,除非它们共享同一个状态源(如父组件传递的props或全局状态管理)。
-
状态隔离:每次调用自定义Hook时,React都会创建一个新的状态实例。这意味着如果两个不同的组件使用了同一个自定义Hook,它们实际上会得到两个独立的状态实例。
解决方案:
-
使用全局状态管理:
- 可以使用Redux、MobX或React Context API来创建一个全局状态,这样所有组件都可以访问和更新同一个状态。
-
将状态提升到共同的父组件:
- 如果使用这个状态的组件有共同的父组件,可以将状态提升到父组件,然后通过props传递给子组件。
-
使用React Context:
- 创建一个Context来包装这个状态,然后用Provider包裹需要共享这个状态的组件树。
-
使用发布-订阅模式:
- 实现一个简单的事件总线,让组件可以订阅状态变化。
-
使用自定义事件:
- 使用浏览器的自定义事件系统来在组件间通信。