上下文:,我目前的Meteor项目是一个教学应用程序,老师可以远程观察学习者在做什么。有很多不同的观点,学习者可以使用,所以我需要区分数据共享方面和观点本身。同样的视图将显示在教师的设备上,显示由学生的行为控制。
问题:*是我使用声音的技术吗?*当组件的输入没有改变时,如何防止它被重新呈现?
详细信息:我已经创建了一个基本的原型(见下文)。它使用Source实例(应用程序本身将通过MongoDB集更新该实例)为视图组件提供反应性数据。在我的原型中,我只生成随机数据。
我有过两个惊喜。
一个:我发现,如果我在源中的一个.get()
上调用ReactiveVar,这就足以触发Tracker对象读取新值,即使我返回一个完全非反应性变量的值。可以预期,如果ReactiveVar的值没有变化,跟踪器将忽略对非反应性变量的任何更改。
二:跟踪器获得的值被转发给组件s
props`‘,即使该值不变,也会导致重呈现。
代码:
import React, { Component } from 'react'
import { ReactiveVar } from 'meteor/reactive-var'
import { withTracker } from 'meteor/react-meteor-data'
/// SOURCE ——————————————————————————————————————————————————————————
class Source {
constructor() {
this.updateData = this.updateData.bind(this)
this.updateData()
}
updateData() {
const reactive = Math.floor(Math.random() * 1.25) // 4 times as many 0s as 1s
data.set(reactive)
console.log("reactive:", reactive)
this.usable = ["a", "b", "c"][Math.floor(Math.random() * 3)]
console.log("usable: ", this.usable)
setTimeout(this.updateData, 1000)
}
get() {
data.get() // We MUST get a reactive value to trigger Tracker...
return this.usable // ... but we CAN return a non-reactive value
}
}
let data = new ReactiveVar(0)
const source = new Source()
/// COMPONENT ———————————————————————————————————————————————————————
class Test extends Component{
render() {
console.log("rendered:", this.props.data)
return (
<div>
{this.props.data}
</div>
)
}
}
export default withTracker(() => {
const data = source.get()
console.log("UPDATE: ", data)
console.log("")
const props = {
data
}
return props
})(Test)
示例控制台输出,附带注释:
reactive: 1
usable: b
UPDATE: b
rendered: b <<< initial value rendered
reactive: 1 <<< no change to reactive value...
usable: a <<< ...so usable value is ignored
reactive: 0 <<< reactive value changes...
usable: c <<< ... so an update is sent to the component
UPDATE: c
rendered: c <<< c rendered
reactive: 0 <<< no change to the reactive value...
usable: c
reactive: 0
usable: b
reactive: 0
usable: c
reactive: 0
usable: b
reactive: 1 <<< but when reactive value changes
usable: c <<< the usable value does not
UPDATE: c
rendered: c <<< c re-rendered, although unchanged
To recap:,我的计划是在每次来自学生的新数据到达时,在instance实例中增加一个ReactiveVar。但是,如果学生只是移动光标,那么我只希望显示学生光标的组件重新呈现,而不是整个视图。
我很感激任何关于我如何能做到这一点的见解。
发布于 2020-04-12 15:03:21
你所看到的行为是流星“魔法”的一部分--它看到你的反应变量依赖于一个简单的变量,并且使它也是反应性的,或者更准确地说,它设置了一个手表。
withTracker通常会触发多个呈现,因此优化这些呈现的最佳方法是使用React.memo()
我个人不喜欢React.memo,它让我觉得很笨拙,并且让开发人员做一些不必要的工作。这里有一篇很好的文章对此作了解释:
https://dmitripavlutin.com/use-react-memo-wisely/
当组件被包装在React.memo()中时,React呈现组件并回传结果。在下一次呈现之前,如果新的道具是相同的,请重新使用回忆录结果,跳过下一个呈现。
。
https://stackoverflow.com/questions/61176435
复制相似问题