diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index 95de4dd2..050d93e8 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -50,3 +50,4 @@ export {
export { type MediaOverlayProps, updateMediaOverlay } from './media-overlay.js'
export { withPane } from './pane.js'
export { type PathProps, createPathHook, usePathOptions } from './path.js'
+export { updateTileLayer } from './tile-layer.js'
diff --git a/packages/core/src/tile-layer.ts b/packages/core/src/tile-layer.ts
new file mode 100644
index 00000000..dbc00383
--- /dev/null
+++ b/packages/core/src/tile-layer.ts
@@ -0,0 +1,18 @@
+import type { TileLayer, TileLayerOptions } from 'leaflet'
+import { updateGridLayer } from './grid-layer'
+
+interface ReactLeafletTileLayerOptions extends TileLayerOptions {
+ url: string
+}
+
+export function updateTileLayer<
+ E extends TileLayer,
+ P extends ReactLeafletTileLayerOptions,
+>(layer: E, props: P, prevProps: P) {
+ updateGridLayer(layer, props, prevProps)
+
+ const { url } = props
+ if (url != null && url !== prevProps.url) {
+ layer.setUrl(url)
+ }
+}
diff --git a/packages/react-leaflet/__tests__/TileLayer.tsx b/packages/react-leaflet/__tests__/TileLayer.tsx
index 0a9f14f6..7f02dd0b 100644
--- a/packages/react-leaflet/__tests__/TileLayer.tsx
+++ b/packages/react-leaflet/__tests__/TileLayer.tsx
@@ -5,11 +5,21 @@ import { MapContainer, TileLayer } from '../src'
describe('TileLayer', () => {
test('renders', () => {
- const { container } = render(
+ const { container, rerender } = render(