Vue.js vue如何在v型上使用getter setter?

Vue.js vue如何在v型上使用getter setter?,vue.js,vuejs2,Vue.js,Vuejs2,{{msg}} 甲级{ } A.A=1 新Vue({ el:“#应用程序”, 数据:{ }, 计算:{ 味精:{ cache:false, 设置:功能(val){ A.A=val }, get:function(){ 返回A.A } } } }) vue如何在v型上使用getter setter?我试着在v-model上使用getter和setter,但都不起作用 首先,您的输入必须位于#app元素中。Vue实例当前甚至没有监视您的 <div id="app"> <in

{{msg}}

甲级{ } A.A=1 新Vue({ el:“#应用程序”, 数据:{ }, 计算:{ 味精:{ cache:false, 设置:功能(val){ A.A=val }, get:function(){ 返回A.A } } } })


vue如何在v型上使用getter setter?我试着在v-model上使用getter和setter,但都不起作用

首先,您的
输入必须位于
#app
元素中。Vue实例当前甚至没有监视您的

<div id="app">
  <input v-model="msg"/>
  <p>{{ msg }}</p>
</div>

<script>
class A{

}
A.a = 1
new Vue({
  el: '#app',
  data: {
  },
  computed: {
    msg: {
      cache: false,
      set: function(val){
            A.a = val
      },
      get: function(){
        return A.a   
      }
    }
  }
})
</script>
对于这样的Vue实例,它将起作用:

class A {
    constructor(a) { this.a = a}
}
let myA = new A(0)
但是,我会将类实例化移动到数据:

new Vue({
  el: '#app',
  data: {
    a: myA.a = 1
  },
  computed: {
    msg: {
      set: function(val) {
        this.a = val
      },
      get: function() {
        return this.a
      }
    }
  }
})

如果将
a
保留在数据之外,则setter将工作并更新值,但getter不会工作,因为没有观察到Vue实例之外的变量。

在Vue中实现模型的代码很简单,如下所示:

data() {
    return {
        a: new A(1).a
    }
},
而html格式如下:

var v1 = new Vue({
    el:'#vue1',
  data:{
    msg:'demo'
  }
});


{{msg}}

第一个问题是范围。由于在Vue实例中,您提供的元素id为
#app
,因此所有与Vue相关的标记都应位于id为
app
的元素内,在您的情况下,则为div

其次,在保存数据的方式上,一旦使用
v-model
指令,它将直接观察模型中的更改,并相应地对dom进行更改。您不需要getter和setter方法

最后,关于A类的代码是什么?? 请查看javascript手册,因为详细解释这部分内容远远超出了本问题的范围。

你的能手和二传手都很好。(在本例中,它们不是绝对必要的,因为它们没有做任何事情来修改用户输入,但我假设为了您的问题,这是一种简化。)

您的代码有两个不同的问题:

  • 输入字段位于Vue根节点之外,因此框架无法看到它。[您在对问题的后期编辑中更正了此问题。]
  • 您在Vue之外定义数据(
    A.A
    ),因此框架不知道如何监视它的更改 要使框架对更改作出反应,必须将变量
    A
    放入组件的
    数据块中(如果确实需要外部变量,请使用setter函数将更新后的值复制到其中)

    newvue({
    el:“#应用程序”,
    数据:{
    A:{A:1}//
    
    var v1 = new Vue({
        el:'#vue1',
      data:{
        msg:'demo'
      }
    });
    
    <div id='vue1'>
    
    <input type='text' v-model='msg' />
    <p>
    {{msg}}
    </p>
    </div>