- Во Vue данные легко мутировать из-за чего не произойдет апдейт элемента. 2 Virtual Dom сравнятся и не будет изменений. Example: Vue:
const words = this.state.words; //ссылка на массив
words.push('marklar’); //массив мутируется напрямую
this.words = words; //нет изменения
React:
this.setState(state => ({
words: state.words.concat(['marklar’])
}));
this.setState(state => ({
words: [...state.words, 'marklar'],
}));
Конечно во Vue тоже можно избежать мутации, создав новый экземпляр массива. Но это не так очевидно, как в setState. Vue:
const words = […this.state.words, ‘marklar']
Еще один пример. Во Vue есть массив:
data: function(){
return {
arr: [1,5,6]
}
}
- При изменении массива таким образом
arr[1] = 9
обновления и ререндера не произойдет, т.к. длина не меняется и Vue подписывается только на событияpush
,pop
, изменение массива черезsplice
(меняется длина). Поскольку массив в JS под капотом - это объект. Поэтому с реактивностью и изменением данных во Vue нужно быть осторожнее. Лучше всего использовать ImmutableJS. - Two-way binding, работа с формами легче из-за наличия модели во Vue: v-model, $emit.
- Отсутствие излишних хуков, например shouldComponentUpdate, componentWillReceiveProps.
- Во Vue нет PureComponent
- Computed properties in Vue.
- В Реакте 16.8 вышло обновления, благодаря которому можно создавать компоненты функционально на хуках вместо классов. Подробнее. Во Vue3 планируется добавить такую же функциональность
- Более короткое название жизненных хуков во Vue.
- В Redux есть возможность подписаться на событие dispatch c помощью листенера subscribe.
- В Vuex есть actions and mutations. Actions позволяют возвращать промисы и менять стор через mutations. Туда же передаются state and commit. Из стейта можно взять текущее состояние, а с помощью commit вызвать действие, меняющее стор.
mutations: {
increment (state, payload) {
state.count += payload.amount
}
}
actions: {
increment(context, payload) {
context.commit('increment', payload);
}
}
- В Redux немного другая структура, там объявляются actions, в которых указывается тип действия. Потом в редьюсерах в зависимости от типа сработавшего события вызывается определенное изменение стейта: Пример
- В Редаксе необходимо описывать редьюсеры, действия и их типы. Во Vue достаточно объявить мутации и действия при необходимости.
- RxJs observable и store.subscribe чтобы подписаться на изменения стора
- Во Vuex доступ к стейту и его мутации ведутся через getters, setters. mapSetters, mapGetters, mapState Component.vue
import { mapState } from 'vuex'
export default {
computed: {
...mapState(['movies', 'genres'])
}
}
store.js
const store = new Vuex.Store({
state: {
movies: [
{ id: 1, name: 'La La Land', watched: true },
{ id: 2, name: 'Moonlight', watched: false }
],
genres: [
{ id: 1, name: 'Comedy' },
{ id: 2, name: 'Drama' }
]
}
})
В Redux state и диспатчеры привязываются к компоненту через connect. Page.js
import { connect } from 'react-redux';
const mapStateToProps = (state) => ({
value: state.value,
});
const mapDispatchToProps = (dispatch) => ({
incrementAction: () => dispatch(incrementAction()),
});
export default connect(mapStateToProps, mapDispatchToProps)(Page);