1. ホーム
  2. javascript

[解決済み] 計算されたプロパティで予期しない副作用を処理する - VueJS

2022-02-06 09:16:05

質問

次のコードで、私は getTranslation オブジェクトに存在する値を originalKeys を配列に格納し、その値を新しい配列 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;
    }
}

解決方法は?

上記のコメントにもあるように 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
    }
  }
}