Vue и React — два самых популярных современных фреймворка для построения пользовательских интерфейсов. Несмотря на различия, у них много общего в концепциях и подходах.
Оба фреймворка используют Virtual DOM для эффективного обновления реального DOM:
// React
const element = <h1>Hello</h1>;
// Vue
const vm = new Vue({
render: h => h('h1', 'Hello')
})
Обе библиотеки основаны на компонентах как основных строительных блоках:
// React
function Component(props) {
return <div>{props.message}</div>;
}
// Vue
Vue.component('my-component', {
props: ['message'],
template: '<div>{{ message }}</div>'
})
Оба обеспечивают реактивное обновление UI при изменении данных:
// React (с хуками)
const [count, setCount] = useState(0);
// Vue
data() {
return { count: 0 }
}
Поддерживают организацию кода в одном файле:
// React (JSX)
function Comp() {
return <div>Content</div>;
}
// Vue (SFC)
<template>
<div>Content</div>
</template>
<script>export default {}</script>
<style></style>
Оба используют props для передачи данных родитель→потомок:
// React
<Child prop={value} />
// Vue
<child-component :prop="value" />
Похожие подходы к управлению состоянием:
// React Context API
const MyContext = createContext();
// Vue provide/inject
provide() {
return { value: this.value }
}
Аналогичные этапы жизненного цикла компонента:
Этап | React | Vue |
---|---|---|
Создание | constructor | beforeCreate |
Монтирование | componentDidMount | mounted |
Обновление | componentDidUpdate | updated |
Размонтирование | componentWillUnmount | beforeDestroy |
Похожие подходы к условному отображению:
// React
{condition && <div>Content</div>}
// Vue
<div v-if="condition">Content</div>
// React
<button onClick={handleClick}>Click</button>
// Vue
<button @click="handleClick">Click</button>
// React
{items.map(item => <div key={item.id}>{item.text}</div>)}
// Vue
<div v-for="item in items" :key="item.id">{{ item.text }}</div>
// React (CSS-in-JS)
<div style={{ color: 'red' }}></div>
// Vue
<div :style="{ color: 'red' }"></div>
Vue и React разделяют многие фундаментальные концепции — виртуальный DOM, компонентную архитектуру, реактивность и однонаправленный поток данных. Их основные различия лежат в области синтаксиса (шаблоны vs JSX) и философии (гибкость vs строгие правила). Оба фреймворка заимствуют лучшие идеи друг у друга, постепенно сближаясь в возможностях.