Skip to content

Instantly share code, notes, and snippets.

@jinnyMcKindy
Last active September 15, 2019 10:12
Show Gist options
  • Save jinnyMcKindy/1b815894d302513d3e4deb8047173475 to your computer and use it in GitHub Desktop.
Save jinnyMcKindy/1b815894d302513d3e4deb8047173475 to your computer and use it in GitHub Desktop.
Различия Vue and React

Различия Vue/Vuex and React/Redux

  1. Во 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]
    }
}
  1. При изменении массива таким образом arr[1] = 9 обновления и ререндера не произойдет, т.к. длина не меняется и Vue подписывается только на события push, pop, изменение массива через splice (меняется длина). Поскольку массив в JS под капотом - это объект. Поэтому с реактивностью и изменением данных во Vue нужно быть осторожнее. Лучше всего использовать ImmutableJS.
  2. Two-way binding, работа с формами легче из-за наличия модели во Vue: v-model, $emit.
  3. Отсутствие излишних хуков, например shouldComponentUpdate, componentWillReceiveProps.
  4. Во Vue нет PureComponent
  5. Computed properties in Vue.
  6. В Реакте 16.8 вышло обновления, благодаря которому можно создавать компоненты функционально на хуках вместо классов. Подробнее. Во Vue3 планируется добавить такую же функциональность
  7. Более короткое название жизненных хуков во Vue.

Vuex vs Redux

  1. В Redux есть возможность подписаться на событие dispatch c помощью листенера subscribe.
  2. В 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);
    }
}
  1. В Redux немного другая структура, там объявляются actions, в которых указывается тип действия. Потом в редьюсерах в зависимости от типа сработавшего события вызывается определенное изменение стейта: Пример
  2. В Редаксе необходимо описывать редьюсеры, действия и их типы. Во Vue достаточно объявить мутации и действия при необходимости.
  3. RxJs observable и store.subscribe чтобы подписаться на изменения стора
  4. Во 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);

Example

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment