React -forceUpdate 中的回调有什么作用?

Yon*_*Noh 7 javascript reactjs

React文档中,forceUpdate有一个参数callback

这就像setState设置状态后调用的第二个参数吗?或者说那是为了什么?

我找不到任何相关的文章。

Gio*_*ito 4

是不是像setState的第二个参数,在设置状态后调用?

是的。答案就在React源代码中。如果你看一下react/src/ReactBaseClasses你会发现setState它的forceUpdate定义如下:

Component.prototype.setState = function(partialState, callback) {
  // ...
  this.updater.enqueueSetState(this, partialState, callback, 'setState');
};

Component.prototype.forceUpdate = function(callback) {
  this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');
};
Run Code Online (Sandbox Code Playgroud)

如果我们继续enqueueSetState实施enqueueForceUpdate,我们会看到:

const classComponentUpdater = {
  isMounted,
  enqueueSetState(inst, payload, callback) {
    const fiber = getInstance(inst);
    const currentTime = requestCurrentTimeForUpdate();
    const suspenseConfig = requestCurrentSuspenseConfig();
    const expirationTime = computeExpirationForFiber(
      currentTime,
      fiber,
      suspenseConfig,
    );

    const update = createUpdate(expirationTime, suspenseConfig);
    update.payload = payload;
    if (callback !== undefined && callback !== null) {
      // ...
      update.callback = callback;
    }

    enqueueUpdate(fiber, update);
    scheduleWork(fiber, expirationTime);
  },
  enqueueReplaceState(inst, payload, callback) {
    ...
  },
  enqueueForceUpdate(inst, callback) {
    const fiber = getInstance(inst);
    const currentTime = requestCurrentTimeForUpdate();
    const suspenseConfig = requestCurrentSuspenseConfig();
    const expirationTime = computeExpirationForFiber(
      currentTime,
      fiber,
      suspenseConfig,
    );

    const update = createUpdate(expirationTime, suspenseConfig);
    update.tag = ForceUpdate;

    if (callback !== undefined && callback !== null) {
      // ...
      update.callback = callback;
    }

    enqueueUpdate(fiber, update);
    scheduleWork(fiber, expirationTime);
  },
};
Run Code Online (Sandbox Code Playgroud)

enqueueSetState和之间的差异enqueueForceUpdate在于update.payloadupdate.tag

所以是的, callBack 具有与第二个参数forceUpdate相同的行为。setState