【问题标题】:Nuxtjs/Vuejs Watchers running into endless loop due to change in the valuesNuxtjs/Vuejs Watchers 由于值的变化而陷入无限循环
【发布时间】:2021-11-28 13:36:35
【问题描述】:

我正在开发一个Nuxtjs/Vuejs 应用程序来转换XML->JSON,反之亦然。用户可以向textarea 提供值,这些textareasCodeMirror 管理。

textareaVex Store 绑定到V-model。我在这些Vuex 状态变量上添加了Watchers,因此每当它们更改值时,我都想将相应的数据转换为不同的格式。即,如果XML 值发生变化,则需要将XML 转换为JSON。同样,如果JSON 的值发生变化,则需要将JSON 转换为XML

当我将XML 复制粘贴到XML textarea 中时,它第一次可以完美运行,但我进行了任何修改并尝试在XML 中引入一些Syntax 错误,然后我遇到了以下问题: watchers 开始互相调用,最终陷入无限循环。

我在CodeSandbox:https://codesandbox.io/s/boring-water-g14zd?file=/pages/index.vue中提供了示例代码

重现问题的步骤:

  1. XML Area中提供Sample XML
<root>
<name>Batman</name>
</root>

我们得到的输出为:CONVERT TO JSON-LD 内的JSON textarea

  1. 现在通过删除一些 anchor 选项卡 (&lt;/&gt;) 对 XML Textarea 中的相同 XML 进行修改

现在textarea 都填充了Error Message,但实际上我只希望JSON 区域填充Error Message 指示XML 中有什么问题,Modified XML 应该在@987654359 中@。

如果您观察Console,那么您可以看到由于watchers,我遇到了cyclic issue。每当XML 值在XML Editor 内发生变化时,我都想调用jsonConverter,反之亦然,但我不想在convertingJSON 之后进入XMLConverter

有人可以向我解释一下如何避免这个问题吗?我没有所有想法,因为我无法直接获得onChangeCodeMirror 我正在使用Watchers。如果有人有任何想法或解决方案,那就太好了,因为我花了一天多的时间来解决这个问题,但最终一无所获。

代码沙盒: https://codesandbox.io/s/boring-water-g14zd?file=/pages/index.vue

【问题讨论】:

    标签: javascript vue.js nuxt.js onchange codemirror


    【解决方案1】:

    我认为这里的主要问题是您的 JSON 和 XML 值在太多地方受到控制。 v-models、观察者和 CodeMirror 事件。

    我已经更改了您的代码并使 CodeMirror 成为值的主控制器。你可以在这里看到结果:CodeSandbox

    为了防止解析循环,我将新值与存储中保存的值进行了比较。如果它们相同,则该值已由我们自己设置。如果它们不同,那么用户已经改变了它,我们应该尝试解析。

    【讨论】:

    • 非常感谢您检查代码并提供响应。这似乎是处理所有事情的最佳方法。再次感谢您的回答。祝你有美好的一天:)
    • 感谢您的回复。一切正常。我有一个小疑问:如果您观察到JSON Textarea,即使Empty 值也会执行lint 操作。有没有办法避免对Empty JSON Area 进行 lint 操作?我尝试了这里提到的方法,但它对我不起作用:stackoverflow.com/a/40658428/7584240
    • 我已经更新了codesanbox来处理你描述的问题。
    • 非常感谢您的指正。它的。现在按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 2020-05-13
    • 1970-01-01
    • 2012-11-21
    • 2013-03-17
    相关资源
    最近更新 更多