Repository navigation
SPFx 1.24.0-rc.0: on list views the application customizer placeholders are sometimes never defined, and changedEvent never fires #11070
Description
Target SharePoint environment
SharePoint Online
What SharePoint development model, framework, SDK or API is this about?
SharePoint Framework (SPFx) 1.24.0-rc.0, Application Customizer
Developer environment
macOS, Playwright 1.63 with Chromium and with Microsoft Edge 141. It is also seen in CI on Ubuntu.
What browser(s) / client(s) have you tested
Chromium, and Microsoft Edge 141.0.3537.57.
Additional environment details
- Customizer: an application customizer that renders into
PlaceholderName.Bottomwith React 18.3.1, external, throughcreateRoot. - Pages: modern list and library views: a custom list on a hub site, and a document library on a project site.
- Related: SPFx 1.24 RC: on modern list pages an extension's hooks sometimes run against the list view host's React ("Cannot read properties of null (reading 'useContext')") #11068. On some list view loads the list view host runs twice, and the extensions get a React instance other than react-dom's.
Describe the bug / error
On some loads of a modern list view, our application customizer never gets its Bottom placeholder:
- The log line never comes. The page never logs
Defined clientSidePlaceholders: DialogContainer,Top,TopContent,Bottom. On the loads where the customizer renders, that line comes shortly before or after our bundle arrives. - The customizer is never told.
this.context.placeholderProvider.changedEventnever fires.tryCreateContent(PlaceholderName.Bottom)returnsundefinedat the end ofonInitand onnavigatedEvent.
- The element is there, empty.
[data-sp-placeholder="Bottom"]is in the DOM, our bundle is loaded, and nothing is logged as an error.
How often:
- Custom list on the hub site. We opened it in new tabs of one signed-in browser.
- 2026-10-20: the footer was missing on 7 of 28 loads.
- 2026-10-21: 1 of 6 loads lacked the log line. On that load the list view host ran once, and nothing threw. So the fault occurs without the double run in SPFx 1.24 RC: on modern list pages an extension's hooks sometimes run against the list view host's React ("Cannot read properties of null (reading 'useContext')") #11068.
- When the list view host runs twice (SPFx 1.24 RC: on modern list pages an extension's hooks sometimes run against the list view host's React ("Cannot read properties of null (reading 'useContext')") #11068). None of the 8 such loads we recorded logged the line. On a document library with a cold cache, that was 7 of 8 loads.
The customizer, in short:
public async onInit(): Promise<void> {
await super.onInit()
// ... asynchronous set-up: data for the footer ...
this.context.application.navigatedEvent.add(this, this._handleNavigatedEvent)
this.context.placeholderProvider.changedEvent.add(this, this._render)
this._render()
}
private async _handleNavigatedEvent(): Promise<void> {
// ... refreshes one permission check ...
this._render()
}
private _render(): void {
if (!this._bottomPlaceholder) {
this._bottomPlaceholder = this.context.placeholderProvider.tryCreateContent(
PlaceholderName.Bottom,
{ onDispose: () => this._onDispose() }
)
}
if (!this._bottomPlaceholder) return
// renders the footer into this._bottomPlaceholder.domElement with createRoot
}Steps to reproduce
-
Deploy an application customizer that renders into
PlaceholderName.Bottomand subscribes toplaceholderProvider.changedEvent, as above. -
Open a modern list view, such as a custom list's
AllItems.aspx, about 20 times, each in a new tab of one signed-in browser. -
On some loads:
- the console lacks
Defined clientSidePlaceholders: …; changedEventnever fires;- the customizer renders nothing.
With a cold cache in a fresh profile, it happens on most loads where the list view host runs twice (SPFx 1.24 RC: on modern list pages an extension's hooks sometimes run against the list view host's React ("Cannot read properties of null (reading 'useContext')") #11068).
- the console lacks
Expected behavior
The Bottom placeholder is defined on every load of a list view, or changedEvent fires once it is, so the customizer can render into it.
Activity
m365-agent-toolkit-assistant commentedon Oct 21, 2026
👋 Hi Remi Blom-Ohlsen (@Remi749),
Thank you for reporting this issue. Here is an AI-generated initial response:
Classification: Bug — the reported intermittent failure on modern list views appears inconsistent with the documented Application Customizer placeholder pattern; the cause is unconfirmed.
tryCreateContentreturnsundefinedandchangedEventnever fires. A DOM element alone does not establish that an SPFx placeholder is available.Upgrade check: The 1.24 preview notes list
1.24.0-rc.0and no fix for this symptom.What to do now:
changedEventbefore asynchronous setup; keep the immediate retry.Useful links:
Ashlesha-MSFT commentedon Oct 22, 2026
Hi Remi Blom-Ohlsen (@Remi749),
We tested a minimal Application Customizer targeting SPFx 1.24.0-rc.0 on a modern custom list view in SharePoint Online using Microsoft Edge.
The sample subscribes to
placeholderProvider.changedEventandapplication.navigatedEvent, attempts to acquirePlaceholderName.Bottomimmediately during initialization, and retries on those events. It intentionally excludes React rendering and asynchronous data/permission setup to isolate placeholder availability.Results: Across 20+ new-tab loads in the same signed-in browser profile, the footer appeared on every load. The captured logs showed Bottom in
placeholderNames,acquiredBottom: true, and achangedEventnotification.We have therefore not reproduced the reported issue in this test configuration. This does not rule out the intermittent behavior you observed, particularly given the differences from your customizer’s initialization and rendering sequence. Document-library and fresh-profile/cold-cache scenarios remain unverified.
To help compare passing and failing loads, please share:
placeholderNames, acquisition results, and event notifications.Please remove credentials, tokens, and sensitive tenant or business information from any shared diagnostics.