mirror of
https://github.com/facebook/react.git
synced 2026-02-26 07:55:55 +00:00
## Summary We had to revert the last React sync to React Native because we saw issues with Responder events using stale event handlers instead of recent versions. I reviewed the merged PRs and realized the problem was in the refactor I did in #26321. In that PR, we moved `currentProps` from `canonical`, which is a singleton referenced by all versions of the same fiber, to the fiber itself. This is causing the staleness we observed in events. This PR does a partial revert of the refactor in #26321, bringing back the `canonical` object but moving `publicInstance` to one of its fields, instead of being the `canonical` object itself. ## How did you test this change? Existing unit tests continue working (I didn't manage to get a repro using the test renderer). I manually tested this change in Meta infra and saw the problem was fixed.
53 lines
1.3 KiB
JavaScript
53 lines
1.3 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
const instanceCache = new Map();
|
|
const instanceProps = new Map();
|
|
|
|
export function precacheFiberNode(hostInst, tag) {
|
|
instanceCache.set(tag, hostInst);
|
|
}
|
|
|
|
export function uncacheFiberNode(tag) {
|
|
instanceCache.delete(tag);
|
|
instanceProps.delete(tag);
|
|
}
|
|
|
|
function getInstanceFromTag(tag) {
|
|
return instanceCache.get(tag) || null;
|
|
}
|
|
|
|
function getTagFromInstance(inst) {
|
|
let nativeInstance = inst.stateNode;
|
|
let tag = nativeInstance._nativeTag;
|
|
if (tag === undefined && nativeInstance.canonical != null) {
|
|
// For compatibility with Fabric
|
|
tag = nativeInstance.canonical.nativeTag;
|
|
nativeInstance = nativeInstance.canonical.publicInstance;
|
|
}
|
|
|
|
if (!tag) {
|
|
throw new Error('All native instances should have a tag.');
|
|
}
|
|
|
|
return nativeInstance;
|
|
}
|
|
|
|
export {
|
|
getInstanceFromTag as getClosestInstanceFromNode,
|
|
getInstanceFromTag as getInstanceFromNode,
|
|
getTagFromInstance as getNodeFromInstance,
|
|
};
|
|
|
|
export function getFiberCurrentPropsFromNode(stateNode) {
|
|
return instanceProps.get(stateNode._nativeTag) || null;
|
|
}
|
|
|
|
export function updateFiberProps(tag, props) {
|
|
instanceProps.set(tag, props);
|
|
}
|