【问题标题】:Vuejs: Using get and set property inside computed object in vuejs displays an errorVuejs:在 vuejs 的计算对象中使用 get 和 set 属性会显示错误
【发布时间】:2021-03-22 10:54:46
【问题描述】:

vuejs 中不允许在计算对象内声明属性(get() 和 set())吗?

代码有效,但是 vscode 显示大量红色,请参阅屏幕截图以供参考。

我不确定是vuejs还是vscode触发了错误。

Farmer.js 组件

computed: {
        ...mapState("farmers", ["crud_step"]),
        normal_data(){ //this works
              return 'test';
        },
        step: { //this also works but this line causes an error display
            get() {
              return this.crud_step;
            },
            set(value) {
              return this.SET_CRUD_STEP(value);
            }
          },
      },

farmer.js 商店

const state = {[![enter image description here][1]][1]
  crud_step: 1,
  ...

};

const mutations = {
  SET_CRUD_STEP(state, value){
    state.crud_step = value;
  },
 ...
};

注意:eslint 已禁用

回购链接:https://github.com/juanPao/acms/blob/main/src/components/Farmers/FarmerCreate.vue

【问题讨论】:

  • 提供minimal reproducible example 重现错误。如果您需要类似节点的多文件编辑器并且只包含最少量的代码来重现错误,请使用 codesandbox.io。代码图片没用。只有代码有用。提供足够的信息以使问题可重现,而您还没有这样做。

标签: vue.js visual-studio-code vuex


【解决方案1】:

您的计算结果看起来不正确。首先,你不应该从setter 返回任何东西。这是一个动作。 getter 必须返回一个值。

而你想要 settercommit 的突变。所以你的代码可能看起来像:

computed: {
  ...mapState("farmers", ["crud_step"]),
  step: {
    get() {
      return this.crud_step;
    },
    set(value) {
      this.$store.commit('farmers/SET_CRUD_STEP', value);
    }
  }
}

...,这表明您实际上并不需要两个本地道具(crud_stepstep),您可以简单地将商店的 crud_step 映射到本地 step

computed: {
  step: {
    get() {
      return this.$store.state.farmers.crud_step;
    },
    set(value) {
      this.$store.commit('farmers/SET_CRUD_STEP', value);
    }
  }
}

为了保持一致性,我实际上将本地属性命名为crud_step(这意味着您还必须在<template> 中更改它)。从长远来看,坚持一致和干净的命名模式(无论您使用的是什么)都会提高您在编码和调试方面的效率。


由于您没有显示组件中的所有代码,我猜您没有提交突变的名为SET_CRUD_STEP 的方法。即使你这样做,也没有必要。您可以简单地从setter 提交。如果您在组件的其他地方使用了该方法,请将其替换为 this.step = someValue(它调用 setter - 这就是 setter 的含义:当您为该属性分配某些内容时调用的函数)。

【讨论】:

  • 谢谢你的回答,我试过你的代码,它也有效。但是错误仍然显示在vscode中。 108 个错误中的 108 个,问题是 'CombinedVueInstance' 类型上不存在 'Property 'xxx' ......也许我的 vscode 设置是导致错误的那个。稍后我会尝试将代码上传到github。
  • 我猜你正在使用TypeScript。在这种情况下,您必须输入值:step: { get(): number { return /* stuff */ }, set(value: number) { /* commit stuff */ } }。请注意,您需要键入所有计算的内容以使错误消失,有时 Vue 在您的methods 的第一个方法中错误地报告类型注释失败。这是 Vue 2 存在的 TS 问题之一,而 Vue 3 将不再存在。
  • 我用的是普通的js,这里是repo的链接:github.com/juanPao/acms/blob/main/src/components/Farmers/…
  • 我明白为什么this.SET_CRUD_STEP 也适用于您的情况:您将存储突变映射到您的组件(它创建了一个与突变同名的方法)。这可行,但一旦您开始使用多个模块,就会变得混乱。我倾向于限制映射器的使用以避免混淆,并从设置器中调用我想要的确切突变,如上所示。至于您的 IDE 错误,除非您提供更多信息和/或重现方式,否则我真的无能为力。我只能修复我能看到的。
  • 非常感谢,我现在找到了导致错误的问题。我在 vscode 中禁用了 Vetur 扩展,错误消失了。
猜你喜欢
  • 2019-04-05
  • 2019-03-27
  • 2017-05-18
  • 2017-08-23
  • 2018-12-16
  • 2017-11-03
  • 2018-11-02
  • 2017-08-08
  • 2021-05-16
相关资源
最近更新 更多