• 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框时,同样可以实现功能,且不会再报错了

  • 相关阅读:
    nyoj118 修路工程 次小生成树
    nyoj99 单词连接 欧拉回路
    NYOJ289 苹果 典型背包
    nyoj 139 牌数 康拓展开
    poj1423 NYOJ_69 数字长度 斯特林公式 对数应用
    NYOJ311 完全背包 对照苹果
    sort 函数的应用
    NYOJ120 校园网络 强连接
    nyoj219 计算日期 吉姆拉森公式
    把SmartQ5系统装在SD卡上
  • 原文地址:https://www.cnblogs.com/lhjfly/p/11800090.html
Copyright © 2020-2023  润新知