Vue 2 Избегайте прямого изменения реквизита, поскольку значение будет перезаписано

#vue.js #axios

#vue.js #axios

Вопрос:

Я прочитал документы, также прочитал похожий пост, но все равно не понял

Это предупреждение, которое я получаю

Избегайте прямого изменения реквизита, поскольку значение будет перезаписываться всякий раз, когда родительский компонент повторно отображает. Вместо этого используйте data или вычисляемое свойство на основе значения prop.

Дочерний компонент:

     <div>
        <v-container class="ma-0 pa-0">
            <v-col class="pa-0" cols="8">
                <v-text-field
                    class="search-field ma-0"
                    flat
                    color="black"
                    :label="$t('keyWord')"
                    v-model="searchKeyWord"
                    @click:clear="clearFilterByKeyWord"
                    clearable
                ></v-text-field>
            </v-col>
            </v-row>
            <v-btn
                depressed
                class="black--text my-10 rounded-0"
                color="primary"
                @click="globalFilter"
                >{{ $t('search_subsidiary') }}</v-btn
            >
        </v-container>
    </div>
</template>

<script>
export default {
    props: {
        dataValue: {
            require: true
        },
        dataValueOriginalCount: {
            require: true
        }
    },
    data() {
        return {
            searchKeyWord: '',
        };
    },
    methods: {
         clearFilterByKeyWord() {
            this.searchKeyWord = '';
            this.unfilterStoComponents();
        },
        globalFilter() {
            //global function which invoke all on click Search button
            if (this.searchKeyWord amp;amp; this.searchKeyWord !== '') {
                this.filterByKeyWord();
            }

            this.$emit('changeData', this.dataValue);
            this.$emit('changeDataOriginal', this.dataValueOriginalCount);
        },
     
    }
};

</script>

  

Родительский компонент:

 <v-data-table
            :headers="headers"
            :items="stoSystems"
            v-show="isLoading"
            v-if="areResultsVisible"
            @dataValue="stoSystems = event"
            @dataValueOriginalCount="originalstoSystemsCount = event"
        >
            <template v-slot:item.name="{ item }">
                <td >
                    {{ item.name }}
                </td>
            </template>
        </v-data-table>
        <script>
export default {
    data() {
        return {

            headers: [
                {
                    text: this.$t('id'),
                    value: 'id'
                },
                {
                    text: this.$t('nav_item_systems'),
                    value: 'name',
                    sortable: false
                },
           
            ],
           Systems: [],
            originalstoSystemsCount: [],
           
        };
    },
    async mounted() {
        try {
            let res = await axios.get('blbalbla/systems');
            this.Systems = res.data;
            this.originalstoSystemsCount = res.data;
        } catch (error) {
            console.error(error);
        }
    }
};
</script>```
  

Ответ №1:

Все это говорит о том, что в вашем дочернем компоненте вы не должны изменять dataValue или dataValueOriginalCount напрямую, вместо этого установите data свойство для этих значений и измените свое свойство данных в своем дочернем компоненте следующим образом:

 data() {
    return {
        originalCount: this.dataValueOriginalCount,
    };
}
  

Теперь в вашем дочернем компоненте вы можете использовать originalCount , и он будет иметь любое значение dataValueOriginalCount .

Вы можете изменять dataValueOriginalCount родительский компонент, как хотите, поскольку на данный момент они не являются реквизитом.