【问题标题】:Set Vue prop's default to parent's options将 Vue 道具的默认设置为父选项
【发布时间】:2019-05-08 01:10:27
【问题描述】:

我有一个子组件需要接受组件父级的$options 对象中给定的值作为可能的默认值。

背景:组件应该能够通过 prop 或配置获取其数据。但是有一些遗留代码依赖于作为选项传递给主 Vue 实例的数据。

创建Vue实例的新方法是这样的:

new Vue({
    el: '#app',
    render: h => h(MainComp, { 
        props: {
            document: 'data.json'
        }
    })
});

如果没有提供 prop 的值(或将其设置为最终默认值 null),组件会负责从配置文件中获取该值:

import Config from './config.js';
[...]    
props: {
    document: {
        default: Config.document || null
    },

效果很好。

但是,在旧代码中,实例过去是这样创建的:

new Vue({
    el: '#app',
    document: 'data.json',
    render: h => h(MainComp)
});

数据通过调用this.$parent.$options['document']传递到data()函数中。

我的第一个想法是将这个完全相同的代码添加到新的default

default: this.$parent.$options['document'] || Config.document || null

但显然它不起作用,因为as the docs say“在创建组件实例之前验证了道具,因此实例属性[不]可用”。

所以我尝试通过data() 函数指定我的“特殊默认值”,如下所示:

data() {
    return {
        document: document || this.$parent.$options['document']
    };
},

但是,Vue 理所当然地抱怨:“数据属性“文档”已被声明为道具。请改用道具默认值。”

如何解决这个恶性循环?

【问题讨论】:

  • 所以......使用最后一个例子,数据返回文档,但不要将它作为道具发送到这个组件?或者使用 inheritAttrs: false 禁用 props 继承?

标签: javascript vue.js vuejs2


【解决方案1】:

这可能有效:

default: () => this.$parent.$options['document'] || Config.document || null

【讨论】:

  • 我没有费心尝试一个函数,因为我在我的问题中引用的文档说“实例属性 [...] 在默认或验证器函数中不可用”,并且 $parent @ 987654321@。尽管如此,我还是尝试了您的代码-一开始没有运气:(但后来我将箭头函数重写为标准函数,即default: function() { return this.$parent.$options['document'] || Config.document || null } 并且它起作用了!:)
  • 很高兴听到这个消息 ;-) @Christallkeks
猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 2019-04-08
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2017-06-20
  • 1970-01-01
相关资源
最近更新 更多