Javascript 是否有一种标准/优雅的方法可以在没有Firebase的情况下实现类似Firebase的反应对象?
像Firebase这样的实时数据库,我喜欢的是它们的推送功能。例如,vuefire使自更新对象变得非常简单,而不需要串联数百个套接字侦听器和回调 这是一个例子:Javascript 是否有一种标准/优雅的方法可以在没有Firebase的情况下实现类似Firebase的反应对象?,javascript,ruby-on-rails,vue.js,Javascript,Ruby On Rails,Vue.js,像Firebase这样的实时数据库,我喜欢的是它们的推送功能。例如,vuefire使自更新对象变得非常简单,而不需要串联数百个套接字侦听器和回调 这是一个例子: data(){ return { books: [] } }, created(){ axios.get('/books', (books) => { this.books = books }) } 为了增加db反应性,我需要至少3个事件“book created”、“book Update”、
data(){
return {
books: []
}
},
created(){
axios.get('/books', (books) => {
this.books = books
})
}
为了增加db反应性,我需要至少3个事件“book created”、“book Update”、“book removed”
Pusher.on('book-created', (book) {
this.books.push(book)
})
Pusher.on('book-updated', (book) {
let b = _.find(this.books, {id: book.id})
if(b){
_.extend(b, book)
}
})
etc..
当您有许多模型和许多视图时,它会变得非常复杂,一些视图有一组不同的书籍,因此我不能只使用一个标准的books vuex变量。是否有一种合理/快速的方法来实现这一点
我当然可以在后端提取发送的事件,这样我的所有模型都会自动推送事件。但前端是我感到困惑的地方。我以前从未与pusher合作过,我也不知道您所指的“不同的书籍集”是什么,但我想我可以给您一些起点,让您的代码看起来更优雅一些 我建议的第一件事;不要试图重新发明轮子,使用它。只需像通常使用后端一样创建一个mixin,使用一些动态选项(可以在组件的
data()
中设置),并将其导入到每个需要相同功能、不同选项的组件上
(您需要相应地调整它)
我的第二个建议是使用一些定制方法和钩子来触发事件和请求,但在完成mixin的代码后,我发现使用更多方法扩展数组的原型会增加太多的复杂性,而一个好的mixin恰恰相反
如果你想深入研究,你可能想看看RXJ和可观测数据。您可以使用Pusher在上面构建一些东西,以获得类似Firebase实时对象的东西
- 教程:
- RxJS:
- Vue的正式实施:
// 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'
}
}
}
}
})