在对象文字中有效地找到重复数据 属性?

Efficiently find duplicate data property in object literal?

在使用 babel 在 Vue 中创建我们的新系统后,我开始测试对旧设备的兼容性。我们的 babel 正在将源代码与 webpack 一起转译为 es2015。

我现在已经用 browserstack against both Ios & android. Newer OS works on both platforms. However on android phones that use the default browser, I get an error in sentry 进行了测试; Duplicate data property in object literal not allowed in strict mode 它没有给我任何关于这可能在哪里的提示,因此使调试过程非常困难。

我现在能看到的隧道尽头的唯一亮光是 ios 部分。 Ios 运行 IOS < 9 的设备显示错误 Attempted to redefine property 'value'. also in sentry

如果我没记错的话,ios 问题是同一问题的改写错误? 当我阅读 over here 时,我想 'value' 可能在一个对象或元素中定义了两次。

这一切都归结为一个问题,如何找到重复的数据属性?

你能分享你的一些代码吗(只是几个组件的区域?)

要检查的一件事是 data() 内部,确保您返回的是一个对象。当我开始使用 Vue 时,这发生在我身上。

示例:

// component a
data () {
  a: ''
}

// component b 
data () {
  a: '' // ERROR! Duplicate
}

发生这种情况是因为 data 在主 Vue 实例上合并。所以在这种情况下它应该是这样的:

// component a
data () {
  return {
    a: ''
  }
}

// component b 
data () {
  return {
    a: '' // ok now
  }
}

没有一些代码很难做出任何其他猜测。

我设法找出错误发生在哪一行,并发现我使用的名称为 Vue-numeric 的插件创建了一个重复值:

 domProps: {
   value: n.value,
   value: n.amount
 },

我不小心将插件锁定在存在此问题的旧版本上。只需更新即可解决此问题。

感谢@xenetics 花时间解决这个问题。

是的,这是一个仅在 ES5 严格模式下有效的限制,您显然在这些环境中使用了该模式。它绝对有道理,但由于计算属性,在 ES6 中仍然放宽了 - 有关详细信息,请参阅 。这就是为什么 babel 在转译时不会报错的原因。

要在您的代码库的对象文字中找到这些(有效但无意义的)重复 属性 名称,您可以使用 linter such as ESLint 和针对这些的规则。

我在一台旧 android 设备上报告了同样的问题,这是我所做的:

我们的组件具有 mapActions(["something"]) 和定义的方法 something() { this.$store.dispatch('something') } 所以我删除了方法声明。

它仍然没有工作,所以我检查了 eslint 上的构建 main.xxxx.js 并在 domProps:{value:t.value,value:t.value} 之类的东西上发现了一些“试图重新定义 属性 'value'” 查看代码,发现我们有包含 v-model:value 的组件以及一些使用 v-model:checked 的复选框。 我只保留了 v-model 并且它有效。

问题似乎也可能来自此处所述的重复道具:https://www.tutorialfor.com/blog-267252.htm