Vue计算方法无法使用模板中的setter更改数据

uplii1fm  于 2023-11-21  发布在  Vue.js
关注(0)|答案(2)|浏览(137)

我需要使用计算更改数据:

<template>
    <div>{{ userDataTest }}</div>
</template>

props: {
    exampleData: {
        type: Object,
        required: true,
    },
},

computed: {
    userDataTest: {
        get: function() {
            return this.exampleData;
        },
        set: function(newValue) {
            console.log(newValue);
            return newValue;
        },
    },
}

mounted () {
    setTimeout(() => {
        console.log('Change now to null!');
        this.userDataTest = null;
    }, 5000);
},

字符串
我使用props获取数据,接下来我使用getter和setter创建计算方法。我在<template>中添加了userDataTest。我使用setter将this.userDataTest中的数据更改为null(使用mounted)。在setter中的console.log(newValue);中,我看到newValuenull,但在<template>中没有任何更改,我仍然有来自getter的数据。
为什么setter不将<template>中的数据更改为null

wn9m85ua

wn9m85ua1#

看起来你试图通过返回一个新值来设置computed属性的值,但是Vue实际上并不检查setter的返回值。也许你试图通过一个computed属性来代理一个data变量。如果是这样,setter应该在setter主体中设置这个data变量。
例如,你的组件可以声明一个名为userDatadata变量,它总是通过一个监视器拥有exampleData属性的最新值:

export default {
  props: {
    exampleData: Object
  },
  data() {
    return {
      userData: {}
    }
  },
  watch: {
    exampleData(exampleData) {
      this.userData = exampleData
    }
  },
}

字符串
然后,你的模板和计算的prop将使用userData

<template>
  <div>{{ userData }}</div>
</template>

<script>
export default {
  //...
  computed: {
    userDataTest: {
      get() {
        return this.userData
      },
      set(newValue) {
        this.userData = newValue
      }
    }
  }
}
</script>


的数据

e5nszbig

e5nszbig2#

局部地改变属性被认为是一种反模式
但是,您可以使用.sync修饰符,如下所示,但您不能将prop设置为null,因为您指定它必须是Object类型。

Vue.component('my-component', {
  template: `<div>{{ userDataTest }}</div>`,
  props: {
    exampleData: {
      type: Object,
      required: true
    }
  },

  computed: {
    userDataTest: {
      get: function() {
        return this.exampleData
      },
      set: function(newValue) {
        this.$emit('update:exampleData', newValue)
      }
    }
  },

  mounted() {
    setTimeout(() => {
      console.log('Change now!')
      this.userDataTest = {}
    }, 2500)
  }
})

new Vue({
  el: '#app',

  data() {
    return {
      exampleData: {
        foo: 'bar'
      }
    }
  }
})

个字符

相关问题