Skip to content

By passing option straight to v-bind, it converts a model class to plain object, losing access to virtual getters #1857

Open
@adamreisnz

Description

@adamreisnz

Please respect maintainers time by filling in these sections. Your issue will likely be closed without this information.

  • Vue Version: 3.5.12
  • Vue Select Version: 4.0.0-beta.6

Describe the bug
By passing option straight to v-bind, it converts a model class to plain object, losing access to virtual getters that may be defined on the option (e.g. for the label prop).

This happens here: https://github.com/sagalbot/vue-select/blob/beta/src/components/Select.vue#L116:

<slot name="option" v-bind="normalizeOptionForSlot(option)">

Instead, it should imo pass the option as is, in the same way as the option is passed to the selected-option-container slot, e.g.:

<slot name="option" :option="normalizeOptionForSlot(option)">

This passes the option as-is, without conversion to a plain object.

Reproduction Link
https://codepen.io/adamreisnz/pen/bGXMRwX

You can see that the fullName virtual property of the options does not work in the #option template, but once you select the options, it shows up correctly in the #selected-options-container template, because the option is bound to it as-is:

image

Note: I've used an older version of VSelect and Vue for this pen, but the same problem exists in 4.0.0-beta.6

Steps To Reproduce
As per the reproduction script. Create an array of options with objects that have virtual getters, and try to use the #option template slot to access the virtual prop. It fails and doesn't exist due to v-bind converting this to a plain object.

Expected behavior
Expect the option to be bound to the slot via :option="option" instead of v-bind="option" so that this conversion does not take place, so that we can access virtual getters in the template.

Screenshots
image

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions