我想在另一个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"
    }
  }
}

但我得了TypeError: Cannot read property 'type' of undefined分.

推荐答案

props validator中的this变量不引用Vue实例.不幸的是,在props 的validator函数中没有真正的方法来引用另一props 的值.


可以做的一件事是在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'
});
<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>


另一种 Select 是将具有typesize属性的对象作为单个props 传递.这样,props 的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'
});
<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>


(请注意:您的验证逻辑可能不正确.正如所写的,括号中的语句的计算结果将始终为true.我在示例中更新了该逻辑,使其符合我认为您的意思.)

Vue.js相关问答推荐

为什么 Pinia/Vuex 比使用服务类的classic 方法更受欢迎?

vuejs3 youtube-plugin YT 未定义控制台错误

使用 cypress 进行 e2e 测试的 vuejs 期间出现 Webpack 错误

在重复表行中

vuejs vue-cli 如何使用 console.log 而不会出现任何错误

Vuetify 置顶工具栏

VueJS:向左,元素的顶部位置?

Vuetify 在数据表中插入操作按钮并获取行数据

在组件的样式部分使用 Vue 变量

使用 vue-test-utils 配置过滤器

NuxtServerInit 在 Vuex 模块模式下不起作用 - Nuxt.js

Modal 内部的 Vue.js AJAX 调用

动态注册本地 Vue.js 组件

VS代码中的红点是什么意思

Vue 组件中的组件渲染函数中可能存在无限更新循环警告

npm run dev 和 npm run production 的区别

如何在 VueJS 中下载本地存储的文件

$emit 不会触发子事件

Vue.js 和 jQuery datepicker/timepicker 双向绑定

v-bind:class 的 Vue.js 计算(computed)属性