在另一个 props 的验证器中访问 props 值

sup*_*ize 11 vue.js vue-component vuejs2

我想访问另一个 props 验证器中的 props 值:

props: {
  type: {
    type: String,
    default: "standard"
  },
  size: {
    type: String,
    default: "normal",
    validator(value) {
      // below I want to access the props `type` from above.
      return (this.type !== "caution" || this.type !== "primary") && value !== "mega"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但我得到TypeError: Cannot read property 'type' of undefined. 任何的想法?

tha*_*ksd 12

this在道具的变量validator不引用Vue的实例。而且,不幸的是,没有真正的方法可以在 prop 的validator函数中引用另一个 prop 的值。


您可以做的一件事是在 Vue 实例的$props对象上设置一个观察者,将immediate选项设置为true以便在创建组件时触发观察者。该观察者可以触发验证逻辑,其中this是对 Vue 实例的引用。

这是一个简单的例子:

Vue.config.productionTip = false;
Vue.config.devtools = false;

Vue.component('child', {
  template: '<div></div>',
  props: {
    type: {
      type: String,
      default: "standard"
    },
    size: {
      type: String,
      default: "normal"
    }
  },
  methods: {
    validateProps() {
      if ((this.type === "caution" || this.type === "primary") && this.size === "mega") {
        console.error('Invalid props');
      }
    }
  },
  watch: {
    $props: {
      immediate: true,
      handler() {
        this.validateProps();
      }
    }
  }
});

new Vue({
  el: '#app'
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <child type="caution" size="mega"></child>
</div>
Run Code Online (Sandbox Code Playgroud)


另一种选择是将具有typeandsize属性的对象作为单个 prop传递。这样validator,那个道具的 就会有对这两个值的引用。

Vue.config.productionTip = false;
Vue.config.devtools = false;

Vue.component('child', {
  template: '<div></div>',
  props: {
    config: {
      type: Object,
      default: () => ({ type: "standard", size: "normal" }),
      validator({ type, size }) {
        return !((type === "caution" || type === "primary") && size === "mega");
      }
    }
  }
});

new Vue({
  el: '#app'
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <child :config="{ type: 'caution', size: 'mega'}"></child>
</div>
Run Code Online (Sandbox Code Playgroud)


(请注意:您的验证逻辑可能不正确。正如所写的那样,括号中的语句将始终评估为true。我在示例中更新了该逻辑,使我认为您的意思。)