Как получить старые и новые значения состояния магазина - PullRequest
0 голосов
/ 25 мая 2018

В моем компоненте я пытаюсь получить старое значение и новое значение определенного массива объектов, который назначен в состоянии хранилища vuex следующим образом.Однако когда newArray и oldArray возвращают один и тот же массив объектов.

Из документации я понимаю следующее, но не понимаю, каков наилучший способ получения различных версий.

Примечание: при замене (а не замене) объекта или массива старое значение будет совпадать с новым значением, поскольку они ссылаются на один и тот же объект / массив.Vue не хранит копию значения перед изменением.

здесь, как я пытаюсь сделать это прямо сейчас в компоненте

export default {
  name: 'O1_OrderBook',
  watch: {
      '$store.state.orderBookSell': {
         deep: true,
         handler (newArray, oldArray) {
           console.log(newArray,oldArray)
         }
       }
    },
}

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Исходя из ответа Джейкобса, это то, что я переставил в своем компоненте, чтобы заставить его работать.

Я создал вычисляемую переменную в компоненте, которая DeepClones конкретного массива состояний объектов.

computed: {
    orders () {
      return _.cloneDeep(this.$store.state.theArray)
    },
  },

и затем установить часы для этой вычисляемой переменной

watch: {
    orders (newValue,oldValue) {
      console.log(newValue,oldValue)
    }
  }
0 голосов
/ 25 мая 2018

скажем, когда вы создаете массив / объект в Javascript,

 var arr = [1,2,3];

Это создает массив в памяти браузера.Но то, что содержит переменная arr, это не полное значение массива, а ссылка на массив в памяти браузера.Вы можете подумать, что arr содержит адрес, который может указать вам реальное значение массива в памяти браузера.

, если вы выполните

var arr = [1,2,3];
var arr2 = arr;
arr2[0] = 4;
console.log(arr); // you would get [4,2,3];

редактирование arr2 изменение arr тоже.Поскольку оба они указывают на один и тот же массив в памяти браузера.

Вот что " старое значение будет таким же, как и новое значение, поскольку они ссылаются на один и тот же объект / массив "означает.

Тот же принцип применим и к объекту.В Javascript массив - это просто особый тип объекта.


для извлечения различных версий массива в наблюдателе, вы должны клонировать его, чтобы установить его как новый массив каждый раз, когда вы изменяете его.

Например,

state.orderBookSell = [...state.orderBookSell];

НО ..... [...array] - это мелкое клонирование, а не глубокое клонирование.И это проблема.У вас есть массив объектов.Помните, что объект также имеет те же правила.Они передаются по ссылке.Так что вам нужно выполнить глубокое клонирование, чтобы клонировать все объекты.

, используя lodash cloneDeep метод для глубокого клонирования

state.orderBookSell = _.cloneDeep(state.orderBookSell);
...