javascript - Reactjs 渲染和状态更改依赖项
问题描述
我目前正在学习 ReactJS,并努力了解如何根据其他地方的变化来呈现/更新内容。
例子:
我有一个计时器应用程序,其中包括暂停/重启功能。它包含一个开始/暂停按钮。
计时器.js
export class Timer {
constructor(parentApp) {
this.app = app;
this.playing = false;
}
start() {
this.playing = true;
}
pause() {
this.playing = false;
}
}
按钮.js
export class IconButtonBar extends Component {
constructor(props) {
super(props);
this.state = {label: 'Start'};
}
render() {
return (
<div className="IconButtonBar">
<Button label={this.state.label} />
</div>
);
}
}
我想更新标签:
- 取决于计时器是否在初始渲染时启动/停止
- 按下按钮手动启动/停止计时器时
- 通过其他方式手动启动/停止计时器时
- 当计时器以编程方式启动/停止时(例如达到限制)
在 jQuery 中,我可能会向 body 标签触发一个自定义事件触发器:
$('body').on('start_playing', function() {
$('#playpause_button).text('Pause');
}
但是在 ReactJS 中可能有更多的“原生”方式来做到这一点。
我希望这是有道理的,你可以帮忙!
解决方案
你需要改变你对 React 应用程序结构的看法。忘记 jQuery。React 是声明性的,你需要说它应该渲染什么(当然它可以用另一种方式完成,但是为什么要使用 React 呢?)。
如果您没有第三方存储库,则可以使用有状态组件。
您可以使用条件重绘来根据不同的状态显示不同的元素。
这是您想要实现的示例有状态组件:https ://codesandbox.io/s/14vokm9q14
请记住,将状态保存在视图层中并不是一个好习惯。考虑使用 Redux/Mobx:
Redux - 它需要很多样板:创建reducer、action-creators、action-types、处理副作用(使用redux-thunk/redux-saga/redux-observable)等。但它稳定、可靠且易于测试。
Mobx - 就像你在你的例子中一样。它是 MVVM,您可以在其中拥有经典含义的模型,将属性装饰为可观察的,然后将该模型注入您的反应组件。之后,您可以更改模型的属性,这些更改将反映到您的视图中。
推荐阅读
- ruby - 理解在 Ruby 中调用变量
- javascript - Vuejs2 手表不适用于来自 ajax 调用的数据
- go - 带有代理中间件的 Echo CORS 导致带有 Access-Allow-Origins 响应标头的问题
- apache-flink - 如何从作业(应用程序)中读取 apache flink jobmanager 配置
- python - 当一个被省略时会发生什么初始化
- nginx - NGINX 无法将 https POST 请求转发到另一个端口
- python - 将类中的方法存储在新文件中
- regex - Python regex 错误:look-behind 需要固定宽度的模式
- javascript - 嵌套数组对象与另一个元素数组进行比较并使用 Javascript 或 ES6 创建新数组
- git - 允许任何人在 TFS 2018 中克隆 Git 存储库