【发布时间】:2020-06-05 16:13:13
【问题描述】:
我使用 React 创建了一个简单的 Meteor 应用程序。它在名为client 的文件夹中使用下面显示的三个文件(而不是其他文件)。在控制台中,应用程序打印出:
withTracker
rendering
withTracker
rendering
props {} {}
state null null
换句话说,App 组件被渲染了两次。最后两行输出表明 this.props 和 this.state 在渲染之间都没有变化。
index.html
<body>
<div id="react-target"></div>
</body>
main.jsx
import React from 'react'
import { render } from 'react-dom'
import App from './App.jsx'
Meteor.startup(() => {
render(<App/>, document.getElementById('react-target'));
})
App.jsx
import React from 'react'
import { withTracker } from 'meteor/react-meteor-data'
class App extends React.Component {
render() {
console.log("rendering")
return "Rendered"
}
componentDidUpdate(prevProps, prevState) {
console.log("props", prevProps, this.props)
console.log("state", prevState, this.state)
}
}
export default withTracker(() => {
console.log("withTracker")
})(App)
如果我将 App.jsx 更改为以下内容(删除 withTracker 包装器),则应用程序仅将 rendering 打印到控制台,并且只执行一次。
import React from 'react'
import { withTracker } from 'meteor/react-meteor-data'
export default class App extends React.Component {
render() {
console.log("rendering")
return "Rendered"
}
componentDidUpdate(prevProps, prevState) {
console.log(prevProps, this.props)
console.log(prevState, this.state)
}
}
withTracker 做了什么触发了第二次渲染?由于我无法阻止它的发生,我能否确定任何使用 withTracker 的组件都会总是呈现两次?
上下文:在我的实际项目中,我使用 withTracker 从 MongoDB 集合中读取数据,但我希望我的组件仅在 props 更改触发组件后才显示该数据重新渲染。我认为在第一次渲染后设置一个标志就足够了,但似乎我需要做一些更复杂的事情。
【问题讨论】:
标签: meteor meteor-tracker