Vue: 自定义指令绑定在组件与元素上有所不同

创建于 2019-04-15  ·  6评论  ·  资料来源: vuejs/vue

2.6.10

复制链接

https://jsfiddle.net/bponomarenko/uom10qd2/

重现步骤

  1. 打开浏览器控制台。
  2. 单击切换按钮两次。

期望什么?

当应用于DOM元素和组件时(在初始化时以及单击按钮后),该指令将发出相同的控制台消息。

我不确定应该输出什么。 要么

bind: first comp
bind: first elem
unbind: first comp
unbind: first elem
bind: first comp
bind: first elem

要么

bind: first comp
bind: first elem
unbind: second comp
unbind: second elem
bind: first comp
bind: first elem

实际发生了什么?

指令中的消息在init上是相同的,但是在单击按钮后有所不同。

实际控制台输出:

bind: first comp
bind: first elem
unbind: first comp
unbind: second elem
bind: second comp
bind: first elem

似乎将指令应用于DOM元素和组件的顺序是不同的。 在我的设置中,我有一个定制指令,该指令依赖于带有配置数据的某些DOM属性。 当此自定义指令在“常规流”中绑定/解除绑定时,一切都会按预期进行(元素属性更新后,指令绑定)。 但是,如果在Vue“就地补丁策略”的情况下绑定/解除绑定指令,则行为似乎有所不同。

bug has workaround

最有用的评论

似乎该指令是用旧组件调用的(因为已被重用),但它仍然具有旧的attrs

解决方法是,在其中一个组件上设置一个键

所有6条评论

似乎该指令是用旧组件调用的(因为已被重用),但它仍然具有旧的attrs

解决方法是,在其中一个组件上设置一个键

@bponomarenko
@posva所说的内容已在文档中涵盖。
您可以参考此。

https://vuejs.org/v2/guide/conditional.html#Controlling -Reusable-Elements-with-key

@posva @pistis感谢您的回答。 是的,这就是我们最终使用的解决方法,我必须在票证中提及。 但是, key属性的存在将不允许使用Vue.js渲染优化。 修复它会很棒。

优化基于您拥有无状态元素,因此Vue在尝试重用元素时不会费心照顾正确管理事件处理程序或局部状态。 因此,我认为这不是错误,但可以在我们的文档中进行改进,以便我们的用户更容易理解。

@Justineo我了解优化本身背后的概念。 在我的情况下,自定义指令负责将state属性添加到bind上的元素,并删除unbind上的该属性。 当Vue.js重用组件时,可以完美地添加/删除指令。 但是,组件属性更新和指令初始化的顺序在组件生命周期的不同时刻是不同的,这使得很难开发自定义指令。
确实,关于这些优化技术的其他文档可能会有所帮助,但我认为不一致的指令生命周期事件是一个值得修复的错误。

解决方法是,在其中一个组件上设置一个键

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

bfis picture bfis  ·  3评论

loki0609 picture loki0609  ·  3评论

aviggngyv picture aviggngyv  ·  3评论

finico picture finico  ·  3评论

lmnsg picture lmnsg  ·  3评论