news May 22, 2026 · 19 views · 2 min read

Transforming Vue 3's watchEffect() Into React with VuReact

Discover how VuReact seamlessly compiles Vue 3's watchEffect() into React, maintaining core functionality and automatically managing dependencies. Learn about runtime adaptations like useWatchEffect(), useWatchPostEffect(), and useWatchSyncEffect().

Introduction

VuReact is an innovative tool designed to convert Vue 3 code into standard React code while maintaining functionality and manageability. This article delves into how VuReact translates Vue 3's watchEffect() API into React's useWatchEffect().

Understanding watchEffect() in Vue 3

watchEffect() in Vue 3 is an API that executes side effects while automatically tracking their reactive dependencies. This feature is crucial for developers seeking to build dynamic applications that react to data changes.

The Compilation Process

Vue watchEffect() -> React useWatchEffect()

VuReact takes the watchEffect() pattern and compiles it into useWatchEffect() for React. During this process, the tool performs a static analysis of the reactive reads within the effect, generating a corresponding React dependency array.

Vue Example

<script setup>
import { ref, watchEffect } from 'vue';

const count = ref(0);

watchEffect(() => {
  console.log(`Current count: ${count.value}`);
});
</script>

Compiled React Example

import { useVRef, useWatchEffect } from '@vureact/runtime-core';

const count = useVRef(0);

useWatchEffect(() => {
  console.log(`Current count: ${count.value}`);
}, [count.value]);

The conversion from watchEffect() to useWatchEffect() retains Vue-style behavior, including automatic dependency collection, cleanup operations, and control over stopping the effect.

Handling Flush Options

Vue watchEffect() with flush -> React useWatchPostEffect() / useWatchSyncEffect()

Vue's watchEffect() can control execution timing using the flush option, enabling different timing models. VuReact mirrors this by converting flush modes into appropriate React runtime APIs.

Vue Example with Flush

<script setup>
import { ref, watchEffect } from 'vue';

const width = ref(0);
const elRef = ref(null);

watchEffect(
  () => {
    if (elRef.value) {
      width.value = elRef.value.offsetWidth;
    }
  },
  { flush: 'post' },
);

watchEffect(
  () => {
    console.log(elRef.value);
  },
  { flush: 'sync' },
);
</script>

Compiled React Example

import { useVRef, useWatchPostEffect, useWatchSyncEffect } from '@vureact/runtime-core';

const width = useVRef(0);
const elRef = useVRef(null);

useWatchPostEffect(
  () => {
    if (elRef.value) {
      width.value = elRef.value.offsetWidth;
    }
  },
  [elRef.value, width.value, elRef.value?.offsetWidth],
);

useWatchSyncEffect(
  () => {
    console.log(elRef.value);
  },
  [elRef.value],
);

VuReact's compilation process effectively analyzes dependencies within each effect, ensuring that the resulting React code preserves the intended behavior of Vue's API.

Conclusion

VuReact streamlines the process of converting Vue 3's watchEffect() to React, maintaining the nuanced behavior of Vue's reactivity system. This tool not only simplifies the transition between frameworks but also automates the management of dependencies, saving developers time and effort.

Further Resources

Discussion

0 Comments

Leave a Comment

Comments are moderated and will appear after approval.