我使用 React 创建了一个简单的 Meteor 应用程序。它使用名为client
. 在控制台中,应用程序打印出:
withTracker
rendering
withTracker
rendering
props {} {}
state null null
换句话说,App 组件被渲染了两次。最后两行输出表明渲染之间既没有this.props
也没有变化。this.state
索引.html
<body>
<div id="react-target"></div>
</body>
主.jsx
import React from 'react'
import { render } from 'react-dom'
import App from './App.jsx'
Meteor.startup(() => {
render(<App/>, document.getElementById('react-target'));
})
应用程序.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
更改触发组件重新呈现后才显示该数据。我认为在第一次渲染后设置一个标志就足够了,但似乎我需要做一些更复杂的事情。