diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp index 2fe7f96c02ab..62fcfb42928c 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp @@ -113,14 +113,15 @@ YogaLayoutableShadowNode::YogaLayoutableShadowNode( .yogaNode_) == YGNodeIsDirty(&yogaNode_) && "Yoga node must inherit dirty flag."); #endif - if (!getTraits().check(ShadowNodeTraits::Trait::LeafYogaNode)) { - for (auto& child : getChildren()) { - if (auto layoutableChild = - std::dynamic_pointer_cast( - child)) { - yogaLayoutableChildren_.push_back(std::move(layoutableChild)); - } - } + if (!getTraits().check(ShadowNodeTraits::Trait::LeafYogaNode) && + !fragment.children) { + // Children unchanged: copy the filtered list directly from the source, + // skipping per-child dynamic_pointer_cast. When fragment.children is set, + // updateYogaChildren() below rebuilds the vector from the new children + // list — populating it here would be immediately discarded. + yogaLayoutableChildren_ = + static_cast(sourceShadowNode) + .yogaLayoutableChildren_; } YGConfigConstRef previousConfig = @@ -349,6 +350,7 @@ void YogaLayoutableShadowNode::updateYogaChildren() { yogaNode_.setChildren({}); yogaLayoutableChildren_.clear(); + yogaLayoutableChildren_.reserve(getChildren().size()); for (size_t i = 0; i < getChildren().size(); i++) { if (auto yogaLayoutableChild =