Vas*_*try 3 javascript vue.js vuejs2
在下面的代码中,我试图使用该getTranslation对象映射originalKeysarray中存在的值并将值推入新的array中allKeys。
但是ESLint给我这个错误, Unexpected side effect in "getkeys" computed property.
我尝试将getkeys函数转换为方法,但是我认为每次都调用一个方法来完成翻译是没有意义的。我该如何解决这个问题?
<template>
<select v-model="selected">
<option v-for="key in getkeys" v-bind:key="key"> {{ key }}</option
</select>
</template>
data(){
return{
selected: '',
allKeys: [],
originalKeys: [], //e.g. ["ALPHA_MIKE]
getTranslation: {} //e.g. {"ALPHA_MIKE": "ALPHA MIKE"}
}
},
computed: {
getkeys(){
let tableHeaders = [];
for( var i=0; i<this.originalKeys.length; i++){
let translation = this.getTranslation[this.originalKeys[i]];
tableHeaders.push(translation);
}
this.selected = tableHeaders[0]; //unexpected side effect here
this.allKeys = tableHeaders; //unexpected side effect here.
return this.allKeys;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 13
正如其他答案提到的,这是因为您正在改变计算属性中的原始数据。您应该使用一种方法来完成这部分工作。
methods:{
changes(tableHeaders){
this.selected = tableHeaders[0];
this.allKeys = tableHeaders;
}
},
computed:{
getkeys(){
// Your code...
this.changes(tableHeaders);
}
},
data: function(){
return{
// Your data...
}
}
Run Code Online (Sandbox Code Playgroud)
正如我上面的评论,您不应编辑computed属性中的其他数据,watch而应使用
computed: {
getkeys(){
let tableHeaders = [];
for( var i=0; i<this.originalKeys.length; i++){
let translation = this.getTranslation[this.originalKeys[i]];
tableHeaders.push(translation);
}
return tableHeaders;
}
},
watch: {
getkeys: {
deep: true,
handler: function (newVal) {
this.selected = newVal[0]
this.allKeys = newVal
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
ESLint 显示此错误是因为您正在改变计算属性中的原始数据。建议您从计算属性返回新的引用或数据。点击此链接了解详细说明。 https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/no-side-effects-in-computed-properties.md