在具有可监视的“titleString”的backdraftjs组件中,以下两者之间是否存在差异/首选项
this.watch('titleString', this.handleTitleStringChange);
以及
onMutateTitleString(newTitle, oldTitle) {
...
}
onMutate
的好处是它记住了旧值(oldTitle
),但是this.watch()
在代码中可能更容易找到,因为它包含单词titleString
--对于onMutate,您必须知道如何搜索驼峰大小写和连接的版本。
是否有其他理由使用其中一个或另一个?
1条答案
按热度按时间dly7yett1#
问得好。
首先......对问题稍作澄清:这两种方法都被提供了新值和旧值。2请参阅监视器的文档。
主要区别在于
onMutate
* property-name * 是一个成员函数,因此,它会在发生实际变化 * 之后立即无条件地应用于底层内存槽,并在应用任何监视器 * 之前 * 应用。本质上,它是框架变异机制的扩展,用于包含WatchHub
mixin的特定类中的特定属性。同样地,注意onMutate
* property-name * 可以在子类中被覆盖(因为,在结构上,onMutate
* property-name * 是一个方法,并且,启发式地,该行为是定义类的心智模型的一部分)。尽管如此,通过简单地连接一个监视器和
watch
示例方法... sans子类覆盖功能,当然可以完成onMutate
* property-name * 所做的大部分工作,并且需要额外创建一个监视器句柄和其他内容。另一方面,通过组件的
watch
示例方法连接一个监视器是为了供类示例的 * 客户端 * 使用。这些连接通常不应该导致示例状态在内部发生变化......如果不是这样,那么一个特定的示例将根据连接到它的监视接口的客户端而有不同的行为。当然,在JavaScript中,这是一个代价高昂的强制机制,因此库有意决定不构建强制机制。这是库的一般原则:鼓励规范的设计和实现范例,但不要阻止使用工程师做需要做的事情(有时世界并不完美,我们需要做我们需要做的事情)。