@Stijlbreuk, мы ❤️ VueJS. Мы быстро влюбились в него после тестирования и сравнения с обычными подозреваемыми, такими как Angular, React, Ember и некоторыми необычными подозреваемыми, такими как Mithril и очень красивой компактной Vue-подобной библиотекой: RivetsJS.

Для нас победителем вышел Vue. Это было просто хорошо. Кривая обучения не слишком крутая по сравнению с другими фреймворками. Эта ментальная модель имеет смысл только для наших дизайнеров и разработчиков. Также сообщество растет и имеет позитивную атмосферу.

Когда вы применяете библиотеку или фреймворк, такой как Vue, на практике, есть вероятность, что вы столкнетесь с некоторыми проблемами, проблемами или проблемами, из которых вы не сразу знаете, как их решить.

Конечно, вы можете прочитать Руководство по Vue, найти в Stack Overflow других людей, столкнувшихся с той же проблемой, или спросить (очень отзывчивых и дружелюбных) людей в чате Vue. Но чтобы сэкономить вам время, мы собрали некоторые из наших проблем и их решений, с которыми мы столкнулись при более глубоком изучении Vue и Vuex;

  1. Как преобразовать строку поля ввода в число?
  2. Почему мой массив не реагирует на обновление индекса?
  3. Как наблюдать за конкретным свойством объекта?
  4. Как следить за изменением ЛЮБОГО свойства объекта?
  5. Как отправить действие в другой модуль с пространством имен в Vuex?
  6. Как передать данные методу получения в модуле в Vuex?

Реактивность

1. Как преобразовать строку поля ввода в число?

Начнем с простого. Следующее поможет вам сэкономить время при преобразовании String в Number:

<template>
    <input v-model.number="age" type="number">
</template>
<script>
    export default {
        data() {
            return {
                age: 0
            }
        }
    };
</script>

СОВЕТ. Вы также можете использовать v-model.trim, чтобы обрезать пробелы во вводе.

2. Почему мой массив не реагирует на обновление индекса?

Вы можете подумать, что данные вашего массива не обновляются при непосредственной установке данных в индекс. Vue не обнаруживает, напрямую устанавливая значение индекса массива. Следующее НЕ обновляет ваши привязки:

this.artists[5] = 'Totally Enormous Extinct Dinosaurs';

Вы можете использовать Array.splice для решения этой проблемы:

this.artists.splice(5, 1, 'Totally Enormous Extinct Dinosaurs');

3. Как отслеживать конкретное свойство объекта?

Одна из замечательных особенностей Vue - это, конечно же, его реактивность. Когда вы изменяете свойство объекта данных, он волшебным образом обновляет свои привязки. Вы, наверное, знаете, что Vue позволяет вам наблюдать за свойством объекта данных следующим образом:

data() {
    return {
        track: 'Household goods'
    }
},
watch: {
    track(newValue, oldValue) {
        // do something with newValue or oldValue
    }
}

Однако вам может быть интересно наблюдать за определенным свойством в объекте. Вы можете сделать это, указав имя метода с ключевым путем как String внутри объекта наблюдения:

data() {
    return {
        house: {
            livingroom: {
                lights: 4
            }
        }
    }
},
watch: {
    'house.livingroom.lights' : function(newVal, oldVal) {
        // triggered when lights is changed
    }
}

4. Как следить за изменением ЛЮБОГО свойства объекта?

Также может быть, что вы хотите знать, когда какое-либо свойство изменяется в объекте. Это несколько сложнее, так как вы должны указать объект с методом и установить для свойства «deep» значение true. Это вызовет обработчик при изменении любого вложенного свойства в наблюдаемом объекте:

watch: {
    house: {
        handler(newVal, oldVal) {
            // triggered when anything is changed within the Object
        },
        deep: true
    }
}

Vuex

Когда ваше приложение немного масштабируется и использование шины событий больше не сокращает его, вы можете потратить некоторое время на изучение Vuex. Vuex управляет состоянием вашего приложения. Хотя поначалу это может показаться пугающим и несколько громоздким, на самом деле это не так уж плохо, и его правильное использование сделает ваше приложение более структурированным и, следовательно, менее загроможденным.

5. Как отправить действие в другой модуль с пространством имен в Vuex?

Иногда вы хотите вызвать действие из одного модуля с пространством имен в другом модуле с пространством имен:

dispatch('namespace/action', {
    data: 'your payload',
}, { root: true });

Обратите внимание на параметры Object с root, установленным в true после полезной нагрузки.

6. Как передать данные методу получения в модуле Vuex?

Геттеры позволяют запрашивать данные из вашего магазина Vuex. Иногда вам нужны какие-то конкретные данные из магазина без изменения состояния. Есть умный способ использовать для этого метод получения, о котором упоминалось в этом выпуске GitHub.

getters: {
    getMessageById: state => id =>
        state.messages.find(message => message.id === id),
},

Синтаксис ES6 может быть коротким, но не всегда понятным, если вы с ним не знакомы. Итак, вот менее изящный синтаксис ES5, чтобы сделать его более подробным:

getters: {
    getMessageById: function(state) {
        return function(id) {
            return state.messages.find(function(message) { 
                return message.id === id;
            });
        }
    }
}

В JavaScript функции - это первоклассные граждане. Это дает возможность передавать их. Это также означает, что функция может возвращать другую функцию, как в данном случае. Когда вы вызываете getMessageById, параметр state является зависимостью, введенной Vuex. Это позволит вам получить доступ ... ну ... к вашему состоянию. Вы можете вернуть функцию из этой функции, которая позволит вам передать один (или несколько) аргументов из вашего компонента.

Вы можете вызвать геттер из вашего компонента следующим образом:

computed: {
    …mapGetters('messageModuleNamespace', [
        'getMessageById',
    ]),
},
methods: {
    someMethod() {
        const message = this.getMessageById(1);
    }
}

Мы надеемся, что хотя бы одна из этих случайных проблем и их решения помогут вам в вашем пути к тому, чтобы стать мастером VueJS! Если у вас есть какие-либо вопросы или у вас были проблемы и решения, которые подошли бы к этому списку, не стесняйтесь оставлять комментарии.