注意:有很多方法可以实现,所以以下只是一个建议。
首先,您必须考虑如何将数据存储在数据库中。如果你有用户、消息和类似消息,你可以这样构建它:
"root": {
"users": {
"$userId": {
...
"messages": {
"$messageId1": true,
"$messageId2": true,
...
}
}
},
"messages": {
"$messageId": {
"author": $userId,
"timestamp": ServerValue.TIMESTAMP
}
},
"likesToMessages": {
"$messageId": {
"$likeId": {
liker: $userId,
"message": $messageId,
"timestamp": ServerValue.TIMESTAMP
}
}
}
}
每当用户在消息上点击“喜欢”时,您就想写信给
var messageId = ?; // The id of the message that was liked
var like = {
liker: currentUserId, // id of logged in user
message: messageId,
timestamp: firebase.database.ServerValue.TIMESTAMP
};
firebase.database.ref().child('likesToMessages').child(messageId).push(like);
然后你在数据库中得到一个新的like,与建议的结构相匹配。
然后,当您想要阅读并显示一条消息的点赞数时,您可以这样做:
const Message = React.createClass({
propTypes: {
message: React.PropTypes.object,
messageId: React.PropTypes.string // you need to add this prop
}
componentWillMount() {
firebase.database.ref().child('likesToMessages').child(this.props.messageId).on('value', this.onLikesUpdated)
}
onLikesUpdated(dataSnapshot) {
var likes = snap.val();
this.setState({
likes
});
}
render() {
const {name, message} = this.props.message;
const emojifiedString = emoji.emojify(message);
return (
<p>
{name}: {emojifiedString} [{this.state.likes.length}♥]
</p>
);
}
});
此外,在您的数据库安全规则中,您希望通过timestamp 为消息等建立索引,以便您可以快速查询最新消息。
另外,请随时查看我制作的类似应用程序,代码在 GitHub 和演示在 wooperate.firebaseapp.com。