Ответ 1
Раньше я никогда не работал с толкателем, и я не знаю точно, что такое "разные книги", о которых вы говорите, но я думаю, что могу дать вам некоторую отправную точку, чтобы сделать ваш код немного более элегантным.
Первое, что я предлагаю; не пытайтесь изобрести колесо, используйте компоненты mixins. Просто создайте mixin, как обычно, вы будете использовать свой backend, чтобы он работал с некоторыми динамическими параметрами (которые вы можете установить в data()
компонента data()
) и импортировать их на каждый компонент, который вам нужен той же функциональности, с различными параметрами.
Пример (вам нужно будет соответствующим образом адаптировать его)
// Create an ES6 module and export this function, or the whole mixin
// (in that case export the mixin instead)
const initPusher = function ({pusher, collection, key, events}, component) {
collection = component[collection]
pusher.on(events.created, (record) => {
collection.push(record)
})
pusher.on(events.updated, (record) => {
let r = _.find(collection, {[key]: record[key]})
if(r){
_.extend(r, record)
}
})
}
const PusherMixin = {
methods: {
// You can add some common methods for all your
// components making use of this mixin
},
created () {
initPusher(Object.assign({}, {
pusher: Pusher,
collection: 'collection',
key: 'id',
events: {
created: 'book-created',
updated: 'book-updated'
}
}, this.pusherOptions), this)
}
}
new Vue({
el: "#app",
mixins: [PusherMixin],
data () {
return {
books: [],
pusherOptions: {
collection: 'books',
key: 'id',
events: {
created: 'book-created',
updated: 'book-updated'
}
}
}
}
})
Мое второе предложение подразумевало прототип управляемого манипулятора с некоторыми пользовательскими методами и крючками для запуска событий и XHRequests, но после завершения кода для mixin я выяснил, что расширение прототипа массива с большим количеством методов добавило слишком много сложностей, и хороший mixin был совершенно противоположное этому.
Если вы хотите пойти глубже, вы можете взглянуть на RxJS и наблюдаемые. Вы можете создать что-то поверх этого с помощью Pusher, чтобы получить что-то вроде объекта реального времени Firebase.
- Учебное пособие: https://blog.pusher.com/building-realtime-applications-with-cyclejs-and-rxjs/
- RxJS: http://reactivex.io/rxjs/
- Официальная реализация для Vue: https://github.com/vuejs/vue-rx