#javascript #vue.js #vuejs2
Вопрос:
У любого ветерана vuejs это происходит на VueJS(v2), где у вас есть 2 массива на компоненте, и вы передаете значение в 1-й массив, а 2-й массив также получает значение, НЕ ПРИКАСАЯСЬ К НЕМУ.
Это первый раз, когда я сталкиваюсь с этим, к вашему сведению, я использую VueJS уже более 2 лет.
Дополнительная информация У меня есть ОЧЕНЬ похожий компонент с точно таким же data variables
, и этого не происходит, только на 2-м компоненте.
array1 = [];
array2 = [];
array1.push('gether');
результат должен быть
array1 = ['gether'];
array2 = [];
ЧТО НА САМОМ ДЕЛЕ ПРОИСХОДИТ
array1 = ['gether'];
array2 = ['gether'];
Я также играл с отладчиком Google DevTools Vue.
Добавление записи в поле array1
«ТОЛЬКО» также добавляет значение в поле array2
.
немного умопомрачительно
Комментарии:
1. Можете ли вы воспроизвести проблему в CodeSandbox или аналогичном?
2. @Lars Я еще не пробовал, но, похоже, это происходит, когда я присваиваю одно и то же значение array1 и array2, ЗАТЕМ я добавил запись в array1, а затем array2 также получает значение волшебным образом, и наоборот, когда я добавляю запись в array2, array1 тоже получает значение волшебным образом.
3. Можете ли вы добавить еще немного кода ? Я думаю, что вы справляетесь с массивом от 1 до 2 … Проверьте эту скрипку js
4. @Sanmeet, очевидно, мой код слишком сложен, чтобы его можно было воспроизвести в codesandbox, но кто-то ответил на мой вопрос, и это именно то, что происходит.
5. @Skeeith22 проверьте ответ, это тоже то, с чем я сталкивался в прошлом, поэтому я просто хотел посмотреть, создаете ли вы массивы или копируете !
Ответ №1:
Поскольку массивы в JS являются ссылочными значениями, поэтому при попытке скопировать его с помощью = он будет копировать только ссылку на исходный массив, а не значение массива. Чтобы создать реальную копию массива, вам нужно скопировать значение массива в новую переменную значения. Таким образом, этот новый массив не ссылается на старый адрес массива в памяти.
Для этого вы можете использовать array.slice()
метод, так как он создает новый массив, а не просто ссылку !
Смотрите Пример и разбирайтесь в различиях =>
Использование ссылки (=)
let array = ["some text"]
// Making it equal to main array and using reference to copy
array1 = array;
array2 = array;
array1.push('gether');
console.log(array2)
Использование array.slice()
для клонирования
let array = ["some text"]
// Making it equal to main array and using slice to copy
array1 = array.slice();
array2 = array.slice();
array1.push('gether');
console.log(array2)
Ответ №2:
Когда вы делаете два массива равными одному и тому же значению, вы делаете их равными по ссылке. Так
foo = ['a', 'b', 'z']
array1 = foo;
array2 = foo;
array1.push('d');
console.log(array2) //Outputs: ['a', 'b', 'c', 'd']
Это ожидаемое поведение.
Однако это не то же самое, что в приведенном примере в вашем вопросе. Запустите фрагмент ниже, чтобы увидеть разницу.
Чтобы избежать этого, вы можете использовать slice()
для создания копии исходного массива. Я добавил пример к фрагменту кода.
let foo = ["a", "b"];
let array1 = foo;
let array2 = foo;
array2.push("c");
console.log(foo); // Outputs ["a", "b", "c"]
console.log(array1); // Outputs ["a", "b", "c"]
let array3 = [];
let array4 = [];
array4.push("a");
console.log(array3); // Outputs []
console.log(array4); // Outputs ["a"]
let bar = ["a", "b"];
let array5 = bar.slice();
bar.push("c");
console.log(bar); // Outputs ["a", "b", "c"]
console.log(array5); // Outputs ["a", "b"]
Комментарии:
1. На самом деле это то, что происходит, это именно то, о чем вы упомянули. Я назначил точно одинаковые значения для обоих массивов.
2. Как я могу сделать так, чтобы это не отражалось на другом массиве? есть ли способ или что-то в этом роде?
3. @Skeeith22 я добавил решение к ответу.