@@ -185,12 +185,16 @@ export const QuillEditor = defineComponent({
185185 )
186186 }
187187
188+ const maybeClone = ( delta : Delta | string ) => {
189+ return typeof delta === 'object' ? delta . slice ( ) : delta
190+ }
191+
188192 const deltaHasValuesOtherThanRetain = ( delta : Delta ) : boolean => {
189193 return Object . values ( delta . ops ) . some ( ( v ) => ! v . retain )
190194 }
191195
192- // eslint-disable-next-line vue/no-setup-props-destructure
193- let internalModel = props . content // Doesn't need reactivity
196+ // Doesn't need reactivity, but does need to be cloned to avoid deep mutations always registering as equal
197+ let internalModel : typeof props . content
194198 const internalModelEquals = ( against : Delta | String | undefined ) => {
195199 if ( typeof internalModel === typeof against ) {
196200 if ( against === internalModel ) {
@@ -214,7 +218,7 @@ export const QuillEditor = defineComponent({
214218 // Quill should never be null at this point because we receive an event
215219 // so content should not be undefined but let's make ts and eslint happy
216220 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
217- internalModel = getContents ( ) !
221+ internalModel = maybeClone ( getContents ( ) ! )
218222 // Update v-model:content when text changes
219223 if ( ! internalModelEquals ( props . content ) ) {
220224 ctx . emit ( 'update:content' , internalModel )
@@ -302,6 +306,7 @@ export const QuillEditor = defineComponent({
302306 } else {
303307 quill ?. setContents ( content as Delta , source )
304308 }
309+ internalModel = maybeClone ( content )
305310 }
306311
307312 const getText = ( index ?: number , length ?: number ) : string => {
@@ -338,14 +343,14 @@ export const QuillEditor = defineComponent({
338343 ( newContent ) => {
339344 if ( ! quill || ! newContent || internalModelEquals ( newContent ) ) return
340345
341- internalModel = newContent
342346 // Restore the selection and cursor position after updating the content
343347 const selection = quill . getSelection ( )
344348 if ( selection ) {
345349 nextTick ( ( ) => quill ?. setSelection ( selection ) )
346350 }
347351 setContents ( newContent )
348- }
352+ } ,
353+ { deep : true }
349354 )
350355
351356 watch (
0 commit comments