在对象文字中有效地找到重复数据 属性?
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
在使用 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 中仍然放宽了 - 有关详细信息,请参阅
要在您的代码库的对象文字中找到这些(有效但无意义的)重复 属性 名称,您可以使用 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