DevExtreme v24.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

Vue Drop Down Box - Single Selection

DropDownBox is an advanced editor whose drop-down window can include other components.

DevExtreme ships with multiple other drop-down editors. To find out which editor best suits your task, review the following article: How to Choose a Drop-Down Editor.

To get started with the DevExtreme DropDownBox component, refer to the following step-by-step tutorial: Getting Started with DropDownBox.

Backend API
<template> <div class="dx-fieldset"> <div class="dx-field"> <div class="dx-field-label">DropDownBox with embedded TreeView</div> <div class="dx-field-value"> <DxDropDownBox v-model:value="treeBoxValue" v-model:opened="isTreeBoxOpened" :input-attr="{ 'aria-label': 'Owner' }" :show-clear-button="true" :data-source="treeDataSource" value-expr="ID" display-expr="name" placeholder="Select a value..." @value-changed="syncTreeViewSelection($event)" > <template #content="{ data }"> <DxTreeView :data-source="treeDataSource" :select-by-click="true" data-structure="plain" key-expr="ID" parent-id-expr="categoryId" selection-mode="single" display-expr="name" @content-ready="treeViewContentReady($event)" @item-selection-changed="treeViewItemSelectionChanged($event)" @item-click="onTreeItemClick($event)" /> </template> </DxDropDownBox> </div> </div> <div class="dx-field"> <div class="dx-field-label">DropDownBox with embedded DataGrid</div> <div class="dx-field-value"> <DxDropDownBox v-model:value="gridBoxValue" v-model:opened="isGridBoxOpened" :input-attr="{ 'aria-label': 'Owner' }" :defer-rendering="false" :display-expr="gridBoxDisplayExpr" :show-clear-button="true" :data-source="gridDataSource" value-expr="ID" placeholder="Select a value..." > <template #content="{ data }"> <DxDataGrid :data-source="gridDataSource" :columns="gridColumns" :hover-state-enabled="true" :show-borders="true" v-model:selected-row-keys="gridBoxValue" @selection-changed="onGridSelectionChanged($event)" height="100%" > <DxSelection mode="single"/> <DxPaging :enabled="true" :page-size="10" /> <DxFilterRow :visible="true"/> <DxScrolling mode="virtual"/> </DxDataGrid> </template> </DxDropDownBox> </div> </div> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import DxDropDownBox from 'devextreme-vue/drop-down-box'; import DxTreeView from 'devextreme-vue/tree-view'; import { DxDataGrid, DxSelection, DxPaging, DxFilterRow, DxScrolling, } from 'devextreme-vue/data-grid'; import CustomStore from 'devextreme/data/custom_store'; import 'whatwg-fetch'; const treeBoxValue = ref('1_1'); const isGridBoxOpened = ref(false); const isTreeBoxOpened = ref(false); const gridBoxValue = ref([3]); const gridDataSource = makeAsyncDataSource('customers.json'); const treeDataSource = makeAsyncDataSource('treeProducts.json'); const gridColumns = ['CompanyName', 'City', 'Phone']; let treeView = null; function treeViewContentReady({ component }) { treeView = component; syncTreeViewSelection(); } function makeAsyncDataSource(jsonFile) { return new CustomStore({ loadMode: 'raw', key: 'ID', load() { return fetch(`../../../../data/${jsonFile}`) .then((response) => response.json()); }, }); } function syncTreeViewSelection() { treeView?.unselectAll(); if (treeBoxValue.value) { treeView?.selectItem(treeBoxValue.value); } } function treeViewItemSelectionChanged(e) { treeBoxValue.value = e.component.getSelectedNodeKeys(); } function gridBoxDisplayExpr(item) { return item && `${item.CompanyName} <${item.Phone}>`; } function onTreeItemClick() { isTreeBoxOpened.value = false; } function onGridSelectionChanged() { isGridBoxOpened.value = false; } </script> <style scoped> .dx-fieldset { height: 500px; } </style>
window.exports = window.exports || {}; window.config = { transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader', }, '*.ts': { loader: 'demo-ts-loader', }, '*.svg': { loader: 'svg-loader', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'root:': '../../../../', 'npm:': 'https://unpkg.com/', }, map: { 'vue': 'npm:vue@3.2.47/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js', 'demo-ts-loader': 'root:utils/demo-ts-loader.js', 'svg-loader': 'root:utils/svg-loader.js', 'whatwg-fetch': 'npm:whatwg-fetch@2.0.4/fetch.js', 'mitt': 'npm:mitt/dist/mitt.umd.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@24.1.6/cjs', 'devextreme-vue': 'npm:devextreme-vue@24.1.6/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.11/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'devextreme-vue': { main: 'index.js', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.13/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);
const products = [{ id: '1', text: 'Stores', expanded: true, items: [{ id: '1_1', text: 'Super Mart of the West', expanded: true, items: [{ id: '1_1_1', text: 'Video Players', items: [{ id: '1_1_1_1', text: 'HD Video Player', price: 220, image: '../../../../images/products/1.png', }, { id: '1_1_1_2', text: 'SuperHD Video Player', image: '../../../../images/products/2.png', price: 270, }], }, { id: '1_1_2', text: 'Televisions', expanded: true, items: [{ id: '1_1_2_1', text: 'SuperLCD 42', image: '../../../../images/products/7.png', price: 1200, }, { id: '1_1_2_2', text: 'SuperLED 42', image: '../../../../images/products/5.png', price: 1450, }, { id: '1_1_2_3', text: 'SuperLED 50', image: '../../../../images/products/4.png', price: 1600, }, { id: '1_1_2_4', text: 'SuperLCD 55', image: '../../../../images/products/6.png', price: 1350, }, { id: '1_1_2_5', text: 'SuperLCD 70', image: '../../../../images/products/9.png', price: 4000, }], }, { id: '1_1_3', text: 'Monitors', expanded: true, items: [{ id: '1_1_3_1', text: '19"', expanded: true, items: [{ id: '1_1_3_1_1', text: 'DesktopLCD 19', image: '../../../../images/products/10.png', price: 160, }], }, { id: '1_1_3_2', text: '21"', items: [{ id: '1_1_3_2_1', text: 'DesktopLCD 21', image: '../../../../images/products/12.png', price: 170, }, { id: '1_1_3_2_2', text: 'DesktopLED 21', image: '../../../../images/products/13.png', price: 175, }], }], }, { id: '1_1_4', text: 'Projectors', items: [{ id: '1_1_4_1', text: 'Projector Plus', image: '../../../../images/products/14.png', price: 550, }, { id: '1_1_4_2', text: 'Projector PlusHD', image: '../../../../images/products/15.png', price: 750, }], }], }, { id: '1_2', text: 'Braeburn', items: [{ id: '1_2_1', text: 'Video Players', items: [{ id: '1_2_1_1', text: 'HD Video Player', image: '../../../../images/products/1.png', price: 240, }, { id: '1_2_1_2', text: 'SuperHD Video Player', image: '../../../../images/products/2.png', price: 300, }], }, { id: '1_2_2', text: 'Televisions', items: [{ id: '1_2_2_1', text: 'SuperPlasma 50', image: '../../../../images/products/3.png', price: 1800, }, { id: '1_2_2_2', text: 'SuperPlasma 65', image: '../../../../images/products/8.png', price: 3500, }], }, { id: '1_2_3', text: 'Monitors', items: [{ id: '1_2_3_1', text: '19"', items: [{ id: '1_2_3_1_1', text: 'DesktopLCD 19', image: '../../../../images/products/10.png', price: 170, }], }, { id: '1_2_3_2', text: '21"', items: [{ id: '1_2_3_2_1', text: 'DesktopLCD 21', image: '../../../../images/products/12.png', price: 180, }, { id: '1_2_3_2_2', text: 'DesktopLED 21', image: '../../../../images/products/13.png', price: 190, }], }], }], }, { id: '1_3', text: 'E-Mart', items: [{ id: '1_3_1', text: 'Video Players', items: [{ id: '1_3_1_1', text: 'HD Video Player', image: '../../../../images/products/1.png', price: 220, }, { id: '1_3_1_2', text: 'SuperHD Video Player', image: '../../../../images/products/2.png', price: 275, }], }, { id: '1_3_3', text: 'Monitors', items: [{ id: '1_3_3_1', text: '19"', items: [{ id: '1_3_3_1_1', text: 'DesktopLCD 19', image: '../../../../images/products/10.png', price: 165, }], }, { id: '1_3_3_2', text: '21"', items: [{ id: '1_3_3_2_1', text: 'DesktopLCD 21', image: '../../../../images/products/12.png', price: 175, }], }], }], }, { id: '1_4', text: 'Walters', items: [{ id: '1_4_1', text: 'Video Players', items: [{ id: '1_4_1_1', text: 'HD Video Player', image: '../../../../images/products/1.png', price: 210, }, { id: '1_4_1_2', text: 'SuperHD Video Player', image: '../../../../images/products/2.png', price: 250, }], }, { id: '1_4_2', text: 'Televisions', items: [{ id: '1_4_2_1', text: 'SuperLCD 42', image: '../../../../images/products/7.png', price: 1100, }, { id: '1_4_2_2', text: 'SuperLED 42', image: '../../../../images/products/5.png', price: 1400, }, { id: '1_4_2_3', text: 'SuperLED 50', image: '../../../../images/products/4.png', price: 1500, }, { id: '1_4_2_4', text: 'SuperLCD 55', image: '../../../../images/products/6.png', price: 1300, }, { id: '1_4_2_5', text: 'SuperLCD 70', image: '../../../../images/products/9.png', price: 4000, }, { id: '1_4_2_6', text: 'SuperPlasma 50', image: '../../../../images/products/3.png', price: 1700, }], }, { id: '1_4_3', text: 'Monitors', items: [{ id: '1_4_3_1', text: '19"', items: [{ id: '1_4_3_1_1', text: 'DesktopLCD 19', image: '../../../../images/products/10.png', price: 160, }], }, { id: '1_4_3_2', text: '21"', items: [{ id: '1_4_3_2_1', text: 'DesktopLCD 21', image: '../../../../images/products/12.png', price: 170, }, { id: '1_4_3_2_2', text: 'DesktopLED 21', image: '../../../../images/products/13.png', price: 180, }], }], }, { id: '1_4_4', text: 'Projectors', items: [{ id: '1_4_4_1', text: 'Projector Plus', image: '../../../../images/products/14.png', price: 550, }, { id: '1_4_4_2', text: 'Projector PlusHD', image: '../../../../images/products/15.png', price: 750, }], }], }], }]; export default { getProducts() { return products; }, };
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
<!DOCTYPE html> <html lang="en"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.6/css/dx.light.css" /> <script type="module"> import * as vueCompilerSFC from "https://unpkg.com/@vue/compiler-sfc@3.4.16/dist/compiler-sfc.esm-browser.js"; window.vueCompilerSFC = vueCompilerSFC; </script> <script src="https://unpkg.com/typescript@4.9.5/lib/typescript.js"></script> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.ts"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>
[{ "ID": 1, "CompanyName": "Premier Buy", "Address": "7601 Penn Avenue South", "City": "Richfield", "State": "Minnesota", "Zipcode": 55423, "Phone": "(612) 291-1000", "Fax": "(612) 291-2001", "Website": "http://www.nowebsitepremierbuy.dx" }, { "ID": 2, "CompanyName": "ElectrixMax", "Address": "263 Shuman Blvd", "City": "Naperville", "State": "Illinois", "Zipcode": 60563, "Phone": "(630) 438-7800", "Fax": "(630) 438-7801", "Website": "http://www.nowebsiteelectrixmax.dx" }, { "ID": 3, "CompanyName": "Video Emporium", "Address": "1201 Elm Street", "City": "Dallas", "State": "Texas", "Zipcode": 75270, "Phone": "(214) 854-3000", "Fax": "(214) 854-3001", "Website": "http://www.nowebsitevideoemporium.dx" }, { "ID": 4, "CompanyName": "Screen Shop", "Address": "1000 Lowes Blvd", "City": "Mooresville", "State": "North Carolina", "Zipcode": 28117, "Phone": "(800) 445-6937", "Fax": "(800) 445-6938", "Website": "http://www.nowebsitescreenshop.dx" }, { "ID": 5, "CompanyName": "Braeburn", "Address": "1 Infinite Loop", "City": "Cupertino", "State": "California", "Zipcode": 95014, "Phone": "(408) 996-1010", "Fax": "(408) 996-1012", "Website": "http://www.nowebsitebraeburn.dx" }, { "ID": 6, "CompanyName": "PriceCo", "Address": "30 Hunter Lane", "City": "Camp Hill", "State": "Pennsylvania", "Zipcode": 17011, "Phone": "(717) 761-2633", "Fax": "(717) 761-2334", "Website": "http://www.nowebsitepriceco.dx" }, { "ID": 7, "CompanyName": "Ultimate Gadget", "Address": "1557 Watson Blvd", "City": "Warner Robbins", "State": "Georgia", "Zipcode": 31093, "Phone": "(995) 623-6785", "Fax": "(995) 623-6786", "Website": "http://www.nowebsiteultimategadget.dx" }, { "ID": 8, "CompanyName": "EZ Stop", "Address": "618 Michillinda Ave.", "City": "Arcadia", "State": "California", "Zipcode": 91007, "Phone": "(626) 265-8632", "Fax": "(626) 265-8633", "Website": "http://www.nowebsiteezstop.dx" }, { "ID": 9, "CompanyName": "Clicker", "Address": "1100 W. Artesia Blvd.", "City": "Compton", "State": "California", "Zipcode": 90220, "Phone": "(310) 884-9000", "Fax": "(310) 884-9001", "Website": "http://www.nowebsiteclicker.dx" }, { "ID": 10, "CompanyName": "Store of America", "Address": "2401 Utah Ave. South", "City": "Seattle", "State": "Washington", "Zipcode": 98134, "Phone": "(206) 447-1575", "Fax": "(206) 447-1576", "Website": "http://www.nowebsiteamerica.dx" }, { "ID": 11, "CompanyName": "Zone Toys", "Address": "1945 S Cienega Boulevard", "City": "Los Angeles", "State": "California", "Zipcode": 90034, "Phone": "(310) 237-5642", "Fax": "(310) 237-5643", "Website": "http://www.nowebsitezonetoys.dx" }, { "ID": 12, "CompanyName": "ACME", "Address": "2525 E El Segundo Blvd", "City": "El Segundo", "State": "California", "Zipcode": 90245, "Phone": "(310) 536-0611", "Fax": "(310) 536-0612", "Website": "http://www.nowebsiteacme.dx" }]
[ { "ID": 1, "name": "Stores", "expanded": true }, { "ID": "1_1", "categoryId": 1, "name": "Super Mart of the West", "expanded": true }, { "ID": "1_1_1", "categoryId": "1_1", "name": "Video Players" }, { "ID": "1_1_1_1", "categoryId": "1_1_1", "name": "HD Video Player", "price": 220 }, { "ID": "1_1_1_2", "categoryId": "1_1_1", "name": "SuperHD Video Player", "price": 270 }, { "ID": "1_1_2", "categoryId": "1_1", "name": "Televisions", "expanded": true }, { "ID": "1_1_2_1", "categoryId": "1_1_2", "name": "SuperLCD 42", "price": 1200 }, { "ID": "1_1_2_2", "categoryId": "1_1_2", "name": "SuperLED 42", "price": 1450 }, { "ID": "1_1_2_3", "categoryId": "1_1_2", "name": "SuperLED 50", "price": 1600 }, { "ID": "1_1_2_4", "categoryId": "1_1_2", "name": "SuperLCD 55", "price": 1750 }, { "ID": "1_1_2_5", "categoryId": "1_1_2", "name": "SuperLCD 70", "price": 4000 }, { "ID": "1_1_3", "categoryId": "1_1", "name": "Monitors" }, { "ID": "1_1_3_1", "categoryId": "1_1_3", "name": "19\"" }, { "ID": "1_1_3_1_1", "categoryId": "1_1_3_1", "name": "DesktopLCD 19", "price": 160 }, { "ID": "1_1_4", "categoryId": "1_1", "name": "Projectors" }, { "ID": "1_1_4_1", "categoryId": "1_1_4", "name": "Projector Plus", "price": 550 }, { "ID": "1_1_4_2", "categoryId": "1_1_4", "name": "Projector PlusHD", "price": 750 } ]

The following instructions show how to synchronize the DropDownBox with any other embedded DevExtreme component:

  1. Specify data sources
    The DropDownBox's and embedded component's data sources can be the same or different. If they are different, the embedded's key field should be present in the DropDownBox's data source.

  2. Specify which data field provides the DropDownBox's values and the embedded component's keys
    Assign the field's name to the DropDownBox's valueExpr property and to the key property of the embedded component's store.

  3. Synchronize the DropDownBox's value and the embedded component's selection
    Bind the DropDownBox's value and the embedded's selectedRowKeys/selectedItemKeys property to the same variable.