Error message. "Props with type Object/Array must use a factory function to return the default value."

JavascriptTypescriptvue.jsVuejs2

Javascript Problem Overview


I am using Vue-Cli3.0. I used this module for Vue.js. https://github.com/holiber/sl-vue-tree

This is a customizable draggable tree component for Vue.js but I found that it could not copy functions of object.

https://github.com/holiber/sl-vue-tree/blob/master/src/sl-vue-tree.js#L715

Because of here.

JSON.parse(JSON.stringify(entity))

So I used this module and edited the copy function.

https://www.npmjs.com/package/clone

var clone = require('clone');

copy(entity) {
    return clone(entity)
},

In this way, the function of the object is correctly copied.

I already have tested it, and it worked correctly. There was no problem with the performance but I got a console error.

[Vue warn]: Invalid default value for prop "multiselectKey": Props with type Object/Array must use a factory function to return the default value.

found in

---> <SlVueTree> 

I want to know the way to erase this error. Thank you for reading my question.

Javascript Solutions


Solution 1 - Javascript

A factory function in props looks like this:

props: {
	exampleDefaultObject: {
        type: Object,
		default() {
            return {}
        }
	},
	exampleDefaultArray: {
        type: Array,
		default() {
            return []
        }
	}
},

or in ES6:

props: {
	exampleDefaultObject: {
        type: Object,
		default: () => ({})
	},
	exampleDefaultArray: {
        type: Array,
        default: () => []
  	}
},

(for people who come here looking for an explanation of the error in the question 'props with type object/array must use a factory function to return the default value')

Note that when returning an object in an es6 arrow function, you need the parentheses: () => ({}) instead of () => {}

Solution 2 - Javascript

according to your console warn, i find the error

https://github.com/holiber/sl-vue-tree/blob/master/src/sl-vue-tree.js#L30

try to fix it like this:

multiselectKey: {
  type: [String, Array],
  default: function () {
    return ['ctrlKey', 'metaKey']
  },
  validator: function (value) {
    let allowedKeys = ['ctrlKey', 'metaKey', 'altKey'];
    let multiselectKeys = Array.isArray(value) ? value : [value];
    multiselectKeys = multiselectKeys.filter(keyName => allowedKeys.indexOf(keyName ) !== -1);
    return !!multiselectKeys.length;
  }
},

the component default value must use a factory function to return!

try it and hope it can help you

Solution 3 - Javascript

these cases require a function than produce the default value, not an object or array:

obj_param:{
		type:Object,
		default:()=>({})
},
array_param:{
		type:Array,
		default:()=>[]
},

this is for performance reasons, since the function is called only if needed (no value so use default), while the direct value would be instantiated everytime the component is used

Solution 4 - Javascript

In TS format in my class component I have used it similarly as follows. It solved my error. Thanks to Trick & Katinka for solution above!

@Prop({default(){return []}}) private markerList!: Array<markerType>;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKuruView Question on Stackoverflow
Solution 1 - JavascriptKatinka HesselinkView Answer on Stackoverflow
Solution 2 - JavascriptTrickView Answer on Stackoverflow
Solution 3 - JavascriptLuca C.View Answer on Stackoverflow
Solution 4 - JavascriptYogesh VadekarView Answer on Stackoverflow