Computed property "xxxx" was assigned to but it has no setter


vue使用computed屬性計算某些值時,在頁面上使用v-model去改變計算屬性時,報錯Computed property "xxxx" was assigned to but it has no setter,翻譯成中文就是“計算屬性“xxxx”已經分配了,但它沒有setter”,理解一下,就是屬性xxxx獲取了值,但是沒有設置值的方法,報錯代碼示例貼一下:

 1 <template>
 2   <div>
 3     <div>{{fullname}}</div>
 4     <input v-model="fullname"></input>
 5   </div>
 6 </template>
 7 
 8 <script>
 9     export default {
10         data(){
11           return {
12             firstname:{val:'a'},
13             lastname:{val:'b'}
14           }
15         },
16       computed:{
17         fullname(){
18           return this.firstname.val+'.'+this.lastname.val;
19         }
20       }
21     }
22 </script>

這里又需要帶一下v-model的使用原理了,v-model實現數據雙向綁定,是一個語法糖:

1 <input v-model="fullname"></input>
2 
3 <input v-bind:value="fullname" v-on:input="fullname=$event.target.value" type="text">

上面兩行代碼實現的功能是一樣的,在頁面上修改fullname的值的同時,屬性值fullname值也會改變,

綁定input的value值,通過input方法觸發實時修改input框頁面值,然后input方法中實現修改屬性值,$event 是當前的事件對象, $event.target.value指向的是當前的input的值,從而實現了數據的雙向綁定。

所以,v-model,說白了,會觸發改變computed計算屬性的值,但是以上computed的寫法只能獲取到屬性的值,不支持設置,一般看過官網就會知道computed不僅支持讀取,還支持設置:

 此時我們的代碼需要修改為:

 1 <template>
 2   <div>
 3     <div>不可編輯:{{fullname}}</div>
 4     v-model:
 5     <input v-model="fullname"></input>
 6     <br>
 7     綁定響應式數據、觸發input事件:
 8     <input v-bind:value="fullname" v-on:input="fullname=$event.target.value" type="text">
 9   </div>
10 </template>
11 
12 <script>
13     export default {
14         data(){
15           return {
16             firstname:{val:'a'},
17             lastname:{val:'b'}
18           }
19         },
20       computed:{
21         fullname:{
22           get(){
23             return this.firstname.val+'.'+this.lastname.val
24           },
25           set(val){
26             let a = val.split('.')[0];
27             let b = val.split('.')[1];
28             this.firstname = {val:a};
29             this.lastname = {val:b};
30           }
31         }
32       }
33     }
34 </script>

頁面操作input框時,同樣可以實現功能,且不會再報錯了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM