为什么 useEffect 注册外部资源时必须提供清理函数? 如果 effect 注册了事件监听、订阅、定时器或外部实例,就需要在下次 effect 执行前或组件卸载时清理。 否则旧资源会继续存在,导致重复监听、内存泄漏或使用过期状态。