zoukankan      html  css  js  c++  java
  • 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框时,同样可以实现功能,且不会再报错了

  • 相关阅读:
    Errors
    fix eclipse gc overhead limit exceeded in mac
    Cobub Razor
    Mac commands
    git vs svn
    SourceTree
    生成静态页技术
    URL重写技术总结
    回味手写三层-增删改查
    生成 (web): 找不到目标 .NET Framework 版本的引用程序集;请确保已安装这些程序集或选择有效的目标版本。
  • 原文地址:https://www.cnblogs.com/lhjfly/p/11800090.html
Copyright © 2011-2022 走看看