【问题标题】:Vue - default values of nested propertiesVue - 嵌套属性的默认值
【发布时间】:2018-03-25 00:19:43
【问题描述】:

如何设置 Object prop 的嵌套属性的默认值?

显然,只有当第一级 Object propundefined 时,Vue 才会解析嵌套属性的默认值。

例子:

Vue.component('example', {
  props: {
    options: {
       type: Object,
       default: function() {
          return {
             nested: {
                type: Object,
                default: function(){
                   return 'default value'
                }
             }
          }
       }
    }
})

【问题讨论】:

    标签: vue.js vuejs2


    【解决方案1】:

    显然,Vue 解析嵌套属性的默认值只有在 第一级 Object 属性不是未定义的。

    是的,这是有道理的,因为如果您没有外部对象,您将无法拥有内部或嵌套属性。

    所以我认为它更具可读性,只需将{} 设置为第一级对象的默认对象,您应该针对 undefinednull 进行自己的防御性验证>,就像下面的例子:

    <script>
      export default {
        props: {
          option: {
            type: Object,
            default: () => {},
            required: false
          }
        },
        computed: {
          optionReceived: function () {
            const defaultNestedValue = 'Some default value'
            const option = this.option.nested || defaultNestedValue;
            return option;
          }
        }
      }
    </script>
    

    【讨论】:

    • EDIT:显然,只有当第一级 Object prop is 未定义时,Vue 才会解析嵌套属性的默认值。 (抱歉打错了)
    • 在我的示例中,如果第一级对象未定义:&lt;example&gt;&lt;example&gt; options.nested 的值设置为默认值。但是传递一个部分 option 属性:让 options = {} &lt;example :options=options&gt;&lt;example&gt; 部分选项对象没有与嵌套属性的默认值合并。
    • 我设法解决了这个定义的计算属性,它返回 this.options.nested 或默认值。但我不确定这是最好的方法。
    • @DaniloSampaio 使用计算属性是一个很好的方法,如果属性更改它在父组件上的值,它将更新子组件中的属性。关于为什么当您将空对象 {} 传递给组件并且未设置 default value 时,因为空对象是真实值。看看这个developer.mozilla.org/en-US/docs/Glossary/Truthy
    • Vue 没有将传递的对象与嵌套属性的默认值合并有什么原因吗?性能、简单性等。
    【解决方案2】:

    我认为让您的数据结构易于使用且尽可能平坦总是更好。因为 Vue 中的嵌套 props 从来都不是一个好的选择。

    假设你在你的Vue组件中提到的options里面有很多属性。

    例子:

    props: {
      options: {
        bookAttributes: {
          colorAttributes: { coverColor:   'red', ribbonColor: 'green' },
          sizeAttributes: { coverSize: 10, ribbonSize: 2 },
          ... 
        }
      }
    }
    

    你可以把它们弄平以便更好地理解。

    props: {
        coverSize: 10,
        coverColor: 'red',
        ribbonColor: 'green,
        ribbonSize: 2 ...
    }
    

    然后您和您的同事就可以像这样愉快地使用您的组件了:

    <your-component>
        coverSize="15"
        coverColor="blue"
        ribbonColor="red"
        ribbonSize="3"
    </your-component>
    

    祝你好运,祝你好运。

    【讨论】:

    • 对于一个简单的选项对象,它工作正常。但是当我有一个复杂的组件时,一个扁平的 prop 对象可能过于冗长: childCompCoverSize="15"
    • 如果您的组件很复杂,只需将其分解为小组件即可。 “亲子”模式应该为您传递道具提供便利。
    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2020-12-07
    • 2019-03-06
    • 2018-08-02
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多