使用Ember中的组件生命周期事件
Using component lifecycle events in Ember
根据最新的Ember文档,不鼓励使用观测器来覆盖组件生命周期挂钩。我不确定的是如何有效地使用这些钩子。文档中说,您可以使用didUpdateAttrs
和didReceiveAttrs
来替换观察者。
让我们假设我有一个组件,它绘制出一些数据。组件看起来像:
{{my-chart data=data showLabels=showLabels otherProps=otherProps}}
当设置了data
时,它需要对数据执行一些分析,因此只有当data
是真正的新数据时才会发生这种情况。showLabels
属性显示/隐藏图表中的标签,并通过my-chart
之外的东西进行切换。
我选择在didReceiveAttrs
在初始和后续渲染中运行时使用它,并对其进行了如下编码:
didReceiveAttrs() {
let data = this.getAttr('data');
this.performAnalytics(data);
let showLabels = this.get('showLabels');
this.updateHideLabels(showLabels);
}
这样做的问题是,每次更改任何属性时,didReceiveAttrs
中的所有代码都会运行。因此,如果用户重复执行导致showLabels
更改的操作,那么也会调用performAnalytics
,这很糟糕,因为它会导致图表刷新。
我的具体问题是,如何使用像didReceiveAttrs
这样的生命周期事件作为观察者,以便只有发生更改的属性才能执行其代码路径?
我要说的是,我尝试存储掉属性,并将其与传入属性进行比较,但我觉得这效率很低,尤其是在data
的情况下,它是一个复杂对象数组。
您可以编写一个实用程序文件,比如utils/component-lifecycle.js
。
export const attrsHaveChanged = ((changes, attr) => {
const { oldAttrs, newAttrs } = changes;
if (oldAttrs) {
const oldAttrsValue = JSON.stringify(oldAttrs[attr].value);
const newAttrsValue = JSON.stringify(newAttrs[attr].value);
return oldAttrsValue !== newAttrsValue;
} else {
return true;
}
});
现在在你的组件中,你可以导入它,
import { attrsHaveChanged } from 'appname/utils/component-lifecycle';
并使用
didReceiveAttrs(changes) {
if (attrsHaveChanged(changes, 'chartData')) {
doSomething();
}
}
相关文章:
- 组件生命周期问题/无法处理未定义的问题
- 渲染方法与生命周期方法中的React计算
- 注册后是否可以定义HTML5自定义元素中的生命周期回调
- 管理动态磁贴和应用程序生命周期
- 主干网的生命周期.js创建过程中的视图
- 使用Ember中的组件生命周期事件
- 关于Angular 1.5零部件生命周期挂钩
- 更新数据时的React.js生命周期
- 雷杜克斯.从容器组件描述表示组件的生命周期方法
- 增加服务工作线程的生命周期
- 是否有一种自动方法来确定(或查找)库的生命周期结束/支持终止通知
- 如何将请求生命周期事件封装在 happy.js 中
- 使用 Async.parallel 我的参数的生命周期不会超过使用 MongoDB 的 NodeJS 中的异步调用
- 聚合物元素注册和生命周期(创建和准备调用两次)
- E_UNKNOWN beforeCreate 和其他生命周期回调的响应错误
- Aurelia 组件生命周期中的远程服务
- 节点.js简单的 Web 服务器请求生命周期
- 角度引导程序生命周期:在完全加载后运行代码
- 主干提取集合生命周期,从响应设置属性
- JQuery 插件架构,用于定义对象和变量生命周期