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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:08:36