diff --git a/core/src/components.d.ts b/core/src/components.d.ts
index 173a0537548..102f7472b98 100644
--- a/core/src/components.d.ts
+++ b/core/src/components.d.ts
@@ -2662,7 +2662,7 @@ export namespace Components {
*/
"disabled": boolean;
/**
- * Show two knobs.
+ * If `true`, the range shows two knobs and `value` is an object with `lower` and `upper` properties. If `false`, the range shows one knob and `value` is a number.
* @default false
*/
"dualKnobs": boolean;
@@ -7939,7 +7939,7 @@ declare namespace LocalJSX {
*/
"disabled"?: boolean;
/**
- * Show two knobs.
+ * If `true`, the range shows two knobs and `value` is an object with `lower` and `upper` properties. If `false`, the range shows one knob and `value` is a number.
* @default false
*/
"dualKnobs"?: boolean;
diff --git a/core/src/components/range/range.tsx b/core/src/components/range/range.tsx
index 26e5ef785dd..c3875c8e30e 100644
--- a/core/src/components/range/range.tsx
+++ b/core/src/components/range/range.tsx
@@ -134,10 +134,19 @@ export class Range implements ComponentInterface {
@Prop() label?: string;
/**
- * Show two knobs.
+ * If `true`, the range shows two knobs and `value` is an object with `lower`
+ * and `upper` properties. If `false`, the range shows one knob and `value` is
+ * a number.
*/
@Prop() dualKnobs = false;
+ @Watch('dualKnobs')
+ protected dualKnobsChanged() {
+ if (!this.noUpdate) {
+ this.updateRatio();
+ }
+ }
+
/**
* Minimum integer value of the range.
*/
diff --git a/core/src/components/range/test/dual-knobs/index.html b/core/src/components/range/test/dual-knobs/index.html
new file mode 100644
index 00000000000..a477dae62d8
--- /dev/null
+++ b/core/src/components/range/test/dual-knobs/index.html
@@ -0,0 +1,122 @@
+
+
+