Vue Composition API vs React Hooks - paulip114/blog GitHub Wiki
🔁 Vue Composition API vs React Hooks — Feature Equivalents
Vue API | React Equivalent | Explanation |
---|---|---|
ref() |
useRef() or useState() |
ref() in Vue tracks a single primitive or object reactively. In React, use: - useRef() for non-rerendering mutable values (e.g., DOM refs or timers) - useState() for reactive state that causes rerenders |
reactive() |
useState() (with object) |
Vue makes an entire object reactive via Proxy. In React, you use useState() and update state immutably: js const [form, setForm] = useState({ name: '', age: 0 }) |
computed() |
useMemo() |
computed() is used for derived values that update reactively. In React, you use useMemo() to memoize derived values based on dependencies. |
watch() |
useEffect() |
watch() watches reactive values and runs a side effect. In React, useEffect() is used with dependencies to watch for changes. Vue's watch(() => state.x, ...) is like useEffect(() => {...}, [x]) . |
onMounted() |
useEffect(() => {...}, []) |
Vue’s onMounted() runs once after the component is mounted. In React, useEffect with an empty dependency array replicates this behavior. |
🔍 Code Comparison Examples
ref
vs useState
/ useRef
Vue:
const count = ref(0)
React:
const [count, setCount] = useState(0)
// OR
const countRef = useRef(0) // if you don't want re-renders
computed
vs useMemo
Vue:
const double = computed(() => count.value * 2)
React:
const double = useMemo(() => count * 2, [count])
// [count] means only re-run the useMemo function if count changes.
// [] double will always return the value from the first render
watch
vs useEffect
Vue:
watch(() => user.value.name, (newVal) => {
console.log('Name changed:', newVal)
})
React:
useEffect(() => {
console.log('Name changed:', user.name)
}, [user.name])
// [user.name] means only run this effect when user.name changes
onMounted
vs useEffect
Vue:
onMounted(() => {
console.log('Component mounted')
})
React:
useEffect(() => {
console.log('Component mounted')
}, [])
// let [] empty means runs once when the component loads
🧠 Summary
Vue | React |
---|---|
ref() |
useRef() / useState() |
reactive() |
useState() with object |
computed() |
useMemo() |
watch() |
useEffect() |
onMounted() |
useEffect(() => {}, []) |