@@ -185,12 +185,18 @@ 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 => {
189- return Object . values ( delta ) . some ( ( v ) => ! v . retain )
193+ return Object . values ( delta . ops ) . some (
194+ ( v ) => ! v . retain || Object . keys ( v ) . length !== 1
195+ )
190196 }
191197
192- // eslint-disable-next-line vue/no-setup-props-destructure
193- let internalModel = props . content // Doesn't need reactivity
198+ // Doesn't need reactivity, but does need to be cloned to avoid deep mutations always registering as equal
199+ let internalModel : typeof props . content
194200 const internalModelEquals = ( against : Delta | String | undefined ) => {
195201 if ( typeof internalModel === typeof against ) {
196202 if ( against === internalModel ) {
@@ -211,10 +217,7 @@ export const QuillEditor = defineComponent({
211217 oldContents : Delta ,
212218 source : Sources
213219 ) => {
214- // Quill should never be null at this point because we receive an event
215- // so content should not be undefined but let's make ts and eslint happy
216- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
217- internalModel = getContents ( ) !
220+ internalModel = maybeClone ( getContents ( ) as string | Delta )
218221 // Update v-model:content when text changes
219222 if ( ! internalModelEquals ( props . content ) ) {
220223 ctx . emit ( 'update:content' , internalModel )
@@ -302,6 +305,7 @@ export const QuillEditor = defineComponent({
302305 } else {
303306 quill ?. setContents ( content as Delta , source )
304307 }
308+ internalModel = maybeClone ( content )
305309 }
306310
307311 const getText = ( index ?: number , length ?: number ) : string => {
@@ -338,14 +342,14 @@ export const QuillEditor = defineComponent({
338342 ( newContent ) => {
339343 if ( ! quill || ! newContent || internalModelEquals ( newContent ) ) return
340344
341- internalModel = newContent
342345 // Restore the selection and cursor position after updating the content
343346 const selection = quill . getSelection ( )
344347 if ( selection ) {
345348 nextTick ( ( ) => quill ?. setSelection ( selection ) )
346349 }
347350 setContents ( newContent )
348- }
351+ } ,
352+ { deep : true }
349353 )
350354
351355 watch (
0 commit comments