Your search did not match any results.
Form

Customize Fields at Runtime

The Form widget allows you to add/remove items and specify item visibility at runtime. The Form only updates the affected items and does not re-render the entire form.

In this demo, the "Show Address" checkbox specifies the visibility of address-related fields. Review the widget's code to see how to set the "HomeAddress" group's visible attribute.

Click the "Add phone" button to add a new phone editor. This action adds a new item to the items array of the "phones" group. Each phone editor contains a button that deletes it from the items array and the Form.

Copy to CodeSandBox
Apply
Reset
<template> <div> <div class="long-title"><h3>Personal details</h3></div> <div id="form-container"> <dx-form id="form" :col-count="2" :form-data="employee" > <dx-group-item> <dx-group-item caption="Personal Data"> <dx-simple-item data-field="FirstName"/> <dx-simple-item data-field="LastName"/> <dx-simple-item :editor-options="checkBoxOptions" editor-type="dxCheckBox" /> </dx-group-item> <dx-group-item> <dx-group-item :visible="isHomeAddressVisible" caption="Home Address" name="HomeAddress" > <dx-simple-item data-field="Address"/> <dx-simple-item data-field="City"/> </dx-group-item> </dx-group-item> </dx-group-item> <dx-group-item caption="Phones" name="phones-container" > <dx-group-item v-for="(phone, index) in phoneOptions" :key="'Phone' + (index + 1)" item-type="group" name="phones" > <dx-simple-item :data-field="'Phones[' + index + ']'" :editor-options="phone" > <dx-label :text="'Phone ' + (index + 1)"/> </dx-simple-item> </dx-group-item> <dx-button-item :button-options="addPhoneButtonOptions" css-class="add-phone-button" horizontal-alignment="left" /> </dx-group-item> </dx-form> </div> </div> </template> <script> import { DxForm, DxSimpleItem, DxGroupItem, DxButtonItem, DxLabel } from 'devextreme-vue/form'; import service from './data.js'; export default { components: { DxForm, DxSimpleItem, DxGroupItem, DxButtonItem, DxLabel }, data() { const employee = service.getEmployee(); let isHomeAddressVisible = true; let phoneOptions = this.getPhonesOptions(employee.Phones); return { employee, isHomeAddressVisible, phoneOptions, checkBoxOptions: { text: 'Show Address', value: true, onValueChanged: (e) => { this.isHomeAddressVisible = e.component.option('value'); } }, addPhoneButtonOptions: { icon: 'add', text: 'Add phone', onClick: () => { this.employee.Phones.push(''); this.phoneOptions = this.getPhonesOptions(this.employee.Phones); } } }; }, methods: { getPhonesOptions(phones) { let options = []; for (let i = 0; i < phones.length; i++) { options.push(this.generateNewPhoneOptions(i)); } return options; }, generateNewPhoneOptions(index) { return { mask: '+1 (X00) 000-0000', maskRules: { 'X': /[01-9]/ }, buttons: [{ name: 'trash', location: 'after', options: { stylingMode: 'text', icon: 'trash', onClick: () => { this.employee.Phones.splice(index, 1); this.phoneOptions = this.getPhonesOptions(this.employee.Phones); } } }] }; } } }; </script> <style scoped> #form-container { margin: 10px 10px 30px; } .long-title h3 { font-family: 'Segoe UI Light', 'Helvetica Neue Light', 'Segoe UI', 'Helvetica Neue', 'Trebuchet MS', Verdana; font-weight: 200; font-size: 28px; text-align: center; margin-bottom: 20px; } .add-phone-button { margin-top: 10px; } </style>
import Vue from 'vue'; import App from './App.vue'; new Vue({ el: '#app', components: { App }, template: '<App/>' });
<!DOCTYPE html> <html> <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=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" /> <script src="https://unpkg.com/core-js@2.4.1/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.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>
const employee = { FirstName: 'John', LastName: 'Heart', Address: '351 S Hill St., Los Angeles, CA', City: 'Atlanta', Phones: ['8005552797', '8005953232'] }; export default { getEmployee() { return employee; } };
System.config({ transpiler: 'plugin-babel', paths: { 'npm:': 'https://unpkg.com/' }, map: { vue: 'npm:vue@2.6.3/dist/vue.esm.browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@latest/index.js', 'devextreme': 'npm:devextreme@19.2', 'devextreme-vue': 'npm:devextreme-vue@19.2', jszip: 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devexpress-gantt': 'npm:devexpress-gantt', 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, meta: { '*.vue': { loader: 'vue-loader' } }, packages: { 'devextreme-vue': { main: 'index.js' }, 'devextreme': { defaultExtension: 'js' } }, babelOptions: { sourceMaps: false, stage0: true } });