React-DnD文档代码疑问:Observer为null却被调用?
拆解这段React-DnD示例的发布订阅逻辑
嘿,我来帮你把这段代码的逻辑掰扯清楚,其实这是一个极简版的发布-订阅模式实现,专门用来处理骑士位置变化的通知,咱们逐个解答你的疑问:
1. 为什么observer初始值是null?
这里的observer是用来存储「监听骑士位置变化的回调函数」的变量。一开始还没有任何组件或逻辑注册监听,所以用null表示当前没有订阅者,等后续调用observe()时再赋值。
2. observe(o)里的o是什么?为什么要把它赋值给observer?
o是一个回调函数,是订阅者(比如某个React组件)传进来的逻辑——它的作用是「当骑士位置变化时,接收最新位置并执行相应操作(比如更新组件UI)」。
比如你代码里最后那句observe(knightPosition => { rend...,这个箭头函数就是o,它会拿到最新的knightPosition然后触发渲染。- 把
o赋值给observer,是因为这个极简实现只支持一个订阅者(如果要支持多个,应该用数组来存储多个回调)。赋值后,后续位置变化时,我们就能找到这个回调去执行通知。
3. 为什么要调用observer(knightPosition)?
这个调用就是发布通知的核心动作:
- 当第一次调用
observe(o)时,立刻执行emitChange()调用observer(knightPosition),是为了让订阅者拿到初始的骑士位置,避免初始状态没有渲染的问题。 - 当调用
moveKnight()修改了骑士位置后,调用emitChange()是为了把最新的位置传给订阅者,触发订阅者的逻辑(比如React组件的重渲染),让UI同步更新。
举个实际场景的例子
假设你有一个React组件需要展示骑士的位置,你会这么用这段代码:
import { observe, moveKnight } from './knightPosition'; function KnightComponent() { const [position, setPosition] = useState([0,0]); useEffect(() => { // 注册监听:当位置变化时,更新组件状态 observe(newPosition => { setPosition(newPosition); }); }, []); return <div>骑士位置:{position[0]}, {position[1]}</div>; }
当你调用moveKnight(2,3)时,emitChange()会触发observer回调,把[2,3]传给setPosition,组件就会自动更新UI啦。
内容的提问来源于stack exchange,提问作者Fivapr
相关产品推荐
相关产品推荐

