node.js - React 组件不断更新
问题描述
我正在尝试将降价文件转换为 html。我可以使用一个名为 showdown 的包来做到这一点,但是 goToPage 组件会持续运行,正如数百个控制台日志不断流动所看到的那样。
下面的代码允许用户在 url 中输入文件名,快速服务器返回一个 markdown 文件。React 然后将其转换为 html 并显示该 html。我知道第一次运行后返回的 div 是空的,并且取决于获取数据时正在更新的状态,但我不知道在那之后如何打破循环。
class App extends Component {
state = { myFile: '' }
constructor(props) {
super(props);
this.goToPage = this.goToPage.bind(this);
}
goToPage = ({ match }) => {
fetch('/' + match.params.filename)
.then((res) => res.text())
.then((text) => {
console.log(text);
var fileContents = text;
var showdown = require('showdown'),
converter = new showdown.Converter(),
markdown = fileContents,
html = converter.makeHtml(markdown);
console.log(html);
this.setState({ myFile: html });
})
.catch(err => {
console.log(err);
});
return (
<div dangerouslySetInnerHTML={{ __html: this.state.myFile }} />
)
}
render() {
return (
<Router>
<Route path="/:filename" component={this.goToPage} />
</Router >
);
}
}
export default App;
我对 React 很陌生,所以我不知道我的 goToPage 是否应该在同一个班级——仍在学习基础知识。我很想知道我是否在做一些愚蠢的事情。
解决方案
<Route path="/:filename" component={this.goToPage} />
此行要求路由器将 中的任何内容渲染this.goToPage
为所述路由上的组件。但是,如果您检查该goToPage
功能,它会使用this.setState
重新呈现浏览器。该路由尝试goToPage
再次呈现该函数并重复该循环。
相反,您需要做的是在路由中渲染另一个组件/:filename
并确保 fetch 只运行一次。
<Route path="/:filename" component={MarkdownConverter} />
现在,内部MarkdownConverter
组件:
class MarkdownConverter extends Component {
this.state = {
myFile: ""
}
componentDidMount() {
// All the logic for fetch and convert goes here.
}
render() {
return (
<div dangerouslySetInnerHTML={{ __html: this.state.myFile }} />
);
}
}
推荐阅读
- c++ - boost is_invocable_v 和 is_invocable::value 返回不同的结果
- python - Python Pandas如何获取最接近给定日期的日期
- xamarin - Xamarin Forms 命令在自定义控件中始终为空
- python - 皮查姆。'进程以退出代码 0 结束' 。print() 中没有输出
- java - Android 折线图
- java - 将整数存储在文本文件中的二维数组中
- android - 使用firebase的位置跟踪器
- routes - 使用 RTI Connext DDS 进行数据通信
- deep-learning - Pytorch 中每个时期的准确性
- php - Laravel getNameAttribute 不适用于搜索