我有一个 Meteor 模板,它在最初几秒内重新渲染大约 6 次,使微调器 (spin.js) 卡顿。
我不知道为什么模板本身会重新渲染,而添加 {{#isolate}}
和/或 {{#constant}}
标签不是帮助。
我的问题:是否有一种编程方式来确定触发给定重新渲染的事件或 react 数据源?
最佳答案
因此,要找出哪个模板助手正在失效,您有几个选择:
首先是编辑 Meteor
packages/deps/deps.js
的源代码,然后将堆栈跟踪添加到invalidate
函数。您可以使用类似
/li>try{throw new Error('');}catch(ex){ console.log(ex.stack);
Proxy
Deps.Computation.prototype.invalidate
,类似于(1)var oldInvalidate = Deps.Computation.prototype.invalidate; Deps.Computation.prototype.invalidate = function(){ try{throw new Error('');}catch(ex){ console.log(ex.stack);} return oldInvalidate.apply(this,arguments); }
创建一个响应式函数包装器,它在无效时打印一条日志消息
您可以执行类似于
isolate-value
包的操作 - 但添加一个日志记录语句(并删除值隔离)(免责声明:尚未完全测试此代码,但您可以了解大概的想法)
logInvalidation = (stmt, fn) -> value = null outerComputation = Deps.currentComputation dep = new Deps.Dependency() c = Deps.autorun (c) -> # kill this computation if the computation wrapping the handler is stopped if outerComputation?.stopped c.stop() return unless c.firstRun # a dependency from `fn` was changed (hence this computation was invalidated) # so, invalidate anything that depends on `dep` console.log("Helper invalidated #{stmt}") dep.changed() else # attach dependencies in `fn`, and pass result to `value` value = fn() return dep.depend() return value
然后像这样包装你的可疑助手:
Template.myTemplate.helpers myHelper: ()-> return logInvalidation 'myHelper invalidated!', ()-> return Session.get("myValue")
关于Meteor - 如何判断是什么导致模板重新呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616254/