使用报错[Vue warn]: Computed property "localValue" was assigned to but it has no setter.

代码:

<a-input
class="search-input"
v-model.trim="localValue"
:allow-clear="true"
:placeholder="inputPlaceholader"
@change="onInput">
</a-input>

computed: {
localValue () {
return this.content
}
}


报错原因

computed计算属性默认只有getter方法,所以只能获取,不能设置。而v-model是数据的双向绑定,当输入框的值变化时,localValue也会跟着变化,但localValue没有设置setter方法,所以会报错。

computed的setter

有需要时,我们可以提供一个setter:

localValue: {
get () {
return this.content
},
set (value) {
this.content = value
}
}


设置setter之后,localValue就可以被重新赋值。

备注:当localValue值变化时,content也会一起变化

知识扩展

computed计算属性与方法的区别

例子如下:

<p>Reversed message: "{{ reversedMessage }}"</p>

computed: {
reversedMessage () {
return this.message.split('').reverse().join('')
}
}


同样也可以用methods中的方法来实现同样的效果:

  methods: {
reversedMessage () {
return this.message.split('').reverse().join('')
}
}


什么时候用计算属性什么时候用方法,要根据不同的需求来判断。

两者的不同点在于:计算属性是基于它们的响应式依赖进行缓存的,只要message的值不发生改变,

reversedMessage访问时会返回以前的计算结果,而不会重新计算。而方法在访问时,总会触发再次执行。

所以,如果我们需要缓存,不想每次都计算,就使用计算属性;如果不需要缓存,就使用方法。

监听watch与计算属性

通常情况下,当某个数据随着其他数据变动而变动时,我们最常用的就是计算属性而不是watch监听,但在数据需要异步执行时,watch方法才是最有效的。

例如:

watch: {
localValue (value) {
this.getData(value) // 请求接口,获取数据
}
}


在这里,当localValue数据发省变化时,watch方法允许我们去访问API,这是计算属性无法做到的。