Javascript 使用VueFire,如何按日期降序排列列表(从最新到最旧)?
我目前正在使用VueJS、Firebase和VueFire创建一个项目。我遇到的问题是,从最新到最旧的帖子列表 我曾尝试使用Firebase的内置查询,如Javascript 使用VueFire,如何按日期降序排列列表(从最新到最旧)?,javascript,firebase,firebase-realtime-database,vue.js,vuefire,Javascript,Firebase,Firebase Realtime Database,Vue.js,Vuefire,我目前正在使用VueJS、Firebase和VueFire创建一个项目。我遇到的问题是,从最新到最旧的帖子列表 我曾尝试使用Firebase的内置查询,如list.orderByChild('date'),但没有成功 我知道我需要使用Array.sort((a,b)=>{returnnewdate(a.Date)-newdate(b.Date)}),但是我很难让它与VueFire一起工作,甚至用它创建Vue过滤器 如果我能提供其他任何东西,请告诉我 这就是我的数据库的外观: 这是我的密码: 假
list.orderByChild('date')
,但没有成功
我知道我需要使用Array.sort((a,b)=>{returnnewdate(a.Date)-newdate(b.Date)})
,但是我很难让它与VueFire一起工作,甚至用它创建Vue过滤器
如果我能提供其他任何东西,请告诉我
这就是我的数据库的外观:
这是我的密码:
假设您正在获取帖子并将其存储在数组[]中,然后使用
v-for
在数组中循环并显示帖子
您可以使用以下解决方法:
- 默认情况下,当您从firebase获取帖子时,您会从最早的帖子到最新的帖子
- 因此,您可以使用
方法将帖子添加到您的帖子数组中,从而颠倒添加到数组中的项目的顺序Array.unshift()
- 由于项目是按相反的顺序添加到数组中的,因此您现在可以使用
定期在帖子中循环并显示ootsv-for
orderByChild('date')
)可能是a,其中您会有如下内容:
import firebase from './firebase'
var vm = new Vue({
el: '#example',
firebase // bring in your firebase module here
data: {
message: 'Hello'
},
computed: {
// a computed getter
sortedList: function () {
// `this` points to the vm instance
return this.items.sort((a,b) => { return new Date(a.date) - new Date(b.date) })
}
}
})
var newItem = {
title: "Title to the post",
order: (this.itemListFromDatabase.length + 1) * -1
}
firebase.database().ref('itemList').push(newItem);
firebase: {
list: firebase.database().ref('list').orderByChild('order')
}
const getters = {
getPosts: state => {
if (!state.posts) return null;
return state.posts.sort((a, b) => a.date - b.date);
},
};
当它所依赖的任何属性发生更改时,此属性将自动更新,从而保持实时性和反应性:)谢谢你们两位的响应 实际上,我最后做的是向保存到数据库的列表项添加另一个值 我添加了子
顺序
,因此当我将对象保存到firebase时,它看起来像这样:
import firebase from './firebase'
var vm = new Vue({
el: '#example',
firebase // bring in your firebase module here
data: {
message: 'Hello'
},
computed: {
// a computed getter
sortedList: function () {
// `this` points to the vm instance
return this.items.sort((a,b) => { return new Date(a.date) - new Date(b.date) })
}
}
})
var newItem = {
title: "Title to the post",
order: (this.itemListFromDatabase.length + 1) * -1
}
firebase.database().ref('itemList').push(newItem);
firebase: {
list: firebase.database().ref('list').orderByChild('order')
}
const getters = {
getPosts: state => {
if (!state.posts) return null;
return state.posts.sort((a, b) => a.date - b.date);
},
};
我给它一个负值,因为当您调用orderByChild()
时,它将按升序排序。现在似乎工作得很好
当我检索列表时,它如下所示:
import firebase from './firebase'
var vm = new Vue({
el: '#example',
firebase // bring in your firebase module here
data: {
message: 'Hello'
},
computed: {
// a computed getter
sortedList: function () {
// `this` points to the vm instance
return this.items.sort((a,b) => { return new Date(a.date) - new Date(b.date) })
}
}
})
var newItem = {
title: "Title to the post",
order: (this.itemListFromDatabase.length + 1) * -1
}
firebase.database().ref('itemList').push(newItem);
firebase: {
list: firebase.database().ref('list').orderByChild('order')
}
const getters = {
getPosts: state => {
if (!state.posts) return null;
return state.posts.sort((a, b) => a.date - b.date);
},
};
根据:
如果您想要自动重新绑定(非常类似于计算属性),请使用$watch并调用$unbind,然后调用$bindAsArray
一旦给firebase变量赋值
firebase: {
posts: firebase.database().ref('posts')
}
它的行为类似于常量。要更改其值,必须先解除绑定
this.$unbind('posts')
然后用重新排序的帖子重新分配
this.$bindAsArray('posts', postsRef.orderByChild(this.order))
在下面的示例中,我们观察到,订单变量一旦发生变化,将通过firebase重新排序的响应重新分配帖子
import { postsRef } from '@/firebase' // postsRef = firebase.database().ref('posts')
export default {
data() {
return {
order: 'title' // default order
}
},
firebase: function() {
return {
posts: postsRef.orderByChild(this.order)
}
},
methods: {
setOrder(val) {
this.order = val
}
},
watch: {
order: function() {
if (this.$firebaseRefs.posts) {
this.$unbind('posts')
}
this.$bindAsArray('posts', postsRef.orderByChild(this.order))
}
}
}
附言。
我知道这个问题不再相关,但可能对其他人有帮助。我也遇到了这个问题,花了一段时间才理解它的实际工作原理。我有一个非常简单的解决方案,您可以在vuex Getter上使用基于日期字段的排序方法,或者如果您直接使用状态,您可以在组件的计算方法中使用,如下所示:
import firebase from './firebase'
var vm = new Vue({
el: '#example',
firebase // bring in your firebase module here
data: {
message: 'Hello'
},
computed: {
// a computed getter
sortedList: function () {
// `this` points to the vm instance
return this.items.sort((a,b) => { return new Date(a.date) - new Date(b.date) })
}
}
})
var newItem = {
title: "Title to the post",
order: (this.itemListFromDatabase.length + 1) * -1
}
firebase.database().ref('itemList').push(newItem);
firebase: {
list: firebase.database().ref('list').orderByChild('order')
}
const getters = {
getPosts: state => {
if (!state.posts) return null;
return state.posts.sort((a, b) => a.date - b.date);
},
};
或者,如果您的数据字段是firebase时间戳,您可以这样使用
const getters = {
getPosts: state => {
if (!state.posts) return null;
return state.posts.sort((a, b) => a.date.seconds - b.date.seconds);
},
这取决于你的日期格式,如果你使用秒,分钟或类似的东西,这个方法会很好。
我应该提到firebase时间戳使用秒。您也可以使用Array.reverse()来存档,最新条目位于数组的第一个位置。