Meteor.js:如何用点符号避免无用的 refresh/computation/re-render
Meteor.js: How to avoid useless refresh/computation/re-render with dot notation
我需要一种方法来避免无用的计算;
在反应函数中,我有一个反应对象,我只需要一个属性,但是如果这个对象的另一个改变,所有的函数都会重新计算:
Template.registerHelper('name', function() {
console.log("running");
return Meteor.user().profile.name;
});
(在html
<body><p>My name: {{name}}</p></body>
)
现在让我们更改您的年龄:
Meteor.users.update({_id:Meteor.userId()},{$set:{"profile.age":20}});
你猜你在控制台看到了什么(第二次...)
running x2
但它应该 运行 只有一次,因为名称没有改变
为什么它很重要?在我的应用程序中,我有复杂的计算,并且用户 online/idle 状态很容易改变
只要使用的反应函数的值发生变化,就会重新运行计算。在您的情况下,反应函数是 Meteor.user()
,因此只要该方法的结果发生变化,就会触发重新运行。
要将重新运行限制在真正需要的地方,您需要使用(或创建)一个反应函数,该函数将 return 准确地跟踪您想要跟踪的值,仅此而已。例如:
var prop = new ReactiveVar();
Template.template.onRendered(function() {
this.autorun(function() {
prop.set(Meteor.user().profile.name);
});
});
Template.template.helpers({
hlpr: function() {
console.log("RERUN!!!");
return prop.get();
},
});
我需要一种方法来避免无用的计算; 在反应函数中,我有一个反应对象,我只需要一个属性,但是如果这个对象的另一个改变,所有的函数都会重新计算:
Template.registerHelper('name', function() {
console.log("running");
return Meteor.user().profile.name;
});
(在html
<body><p>My name: {{name}}</p></body>
)
现在让我们更改您的年龄:
Meteor.users.update({_id:Meteor.userId()},{$set:{"profile.age":20}});
你猜你在控制台看到了什么(第二次...)
running x2
但它应该 运行 只有一次,因为名称没有改变
为什么它很重要?在我的应用程序中,我有复杂的计算,并且用户 online/idle 状态很容易改变
只要使用的反应函数的值发生变化,就会重新运行计算。在您的情况下,反应函数是 Meteor.user()
,因此只要该方法的结果发生变化,就会触发重新运行。
要将重新运行限制在真正需要的地方,您需要使用(或创建)一个反应函数,该函数将 return 准确地跟踪您想要跟踪的值,仅此而已。例如:
var prop = new ReactiveVar();
Template.template.onRendered(function() {
this.autorun(function() {
prop.set(Meteor.user().profile.name);
});
});
Template.template.helpers({
hlpr: function() {
console.log("RERUN!!!");
return prop.get();
},
});