javascript - ReactJS - 使用 setState 和 firebase 监听
问题描述
好吧,我已经知道我们应该做这样的事情来使状态与 firebase 更改保持同步。
import FirebaseRef from '...'
.
.
.
class MyComponent extends React.Component {
state = {
maxVotes: 0
}
componentDidMount() {
const { boardId } = this.props
FirebaseRef.child(`boards/${boardId}/maxVotes`).on('value', snapshot => {
this.setState({maxVotes: snapshot.val()})
})
}
但我的编码习惯是在其他文件中委托 API 调用并将其导入组件。我可以做这样的事情吗?
import { setMaxVotes } from ...
.
.
.
componentDidMount() {
const { boardId } = this.props
setMaxVotes(boardId)
}
setMaxVotes 方法看起来如何?我应该使这样的事情复杂化,还是不是最佳实践?
解决方案
将 API 调用委托给不同的模块是很常见的,但在不同的模块中设置反应组件状态并不是最佳实践。因此,您可以为 API 调用创建不同的模块,但您应该在组件本身中设置状态。代码可能看起来像这样
componentDidMount() {
const { boardId } = this.props
setMaxVotes(boardId, 'value', snapshot => {
this.setState({maxVotes: snapshot.val()})
})
}
setMaxVotes(boardId, eventType, cb) {
FirebaseRef.child(`boards/${boardId}/maxVotes`).on(eventType, cb);
}
推荐阅读
- c++ - 是否有可能在某个日期之后不运行可执行文件?
- macos - 理解 Hello World 的 lea macOS x86-64
- mysql - 使用 nodemailer 发送电子邮件,并将表单数据插入 mysql db
- c++ - 为什么我会收到警告“C++/CLI、C++/CX 或 openmp 不支持 C4199 两阶段名称查找”?
- google-bigquery - 在 BigQuery 的嵌套数组中过滤范围,并对结果进行重复数据删除
- node.js - 如何使用 sqlite3 数据库的节点 api 正确检索数据
- python-3.x - Python 3.7 数据类:为未定义的属性赋值时引发错误
- html - 如何在 CSS 中将一些文本居中放置在矩形中?
- javascript - 如何获取独立于变量名的 JavaScript 解构参数?
- qt - 如何知道何时收到完整的数据包(QSerialPort)