DevExtreme v23.2 is now available.

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

Your search did not match any results.

Text Box

The TextBox is a UI component that allows users to enter and edit a single line of text. This demo illustrates the following TextBox properties:

  • value
    A value the TextBox displays.

  • placeholder
    An input prompt the TextBox displays when the value is not defined.

  • showClearButton
    Specifies whether to display the button that clears the TextBox value.

  • mode
    Affects a set of keyboard characters displayed on a mobile device when the TextBox gets focus and modifies the component's display style. In this example, the mode is set to "password" so that entered characters are obscured, and the password cannot be read.

  • mask
    An input mask.

  • maskRules
    Custom mask rules.

  • disabled
    Specifies whether the TextBox responds to user interaction.

  • onValueChanged event handler
    Use this function to perform an action when a user enters a new value. In this demo, this function uses the entered value to construct a dummy email address and assign it to another TextBox.

  • valueChangeEvent
    One or several DOM events that trigger the onValueChanged event handler.

  • readOnly
    Prevents users from changing the editor's value.

  • hoverStateEnabled
    Specifies whether the TextBox responds when users long press or hover the mouse pointer over it.

Backend API
import React, { useCallback, useState } from 'react'; import TextBox, { TextBoxTypes } from 'devextreme-react/text-box'; const nameLabel = { 'aria-label': 'Name' }; const fullNameLabel = { 'aria-label': 'Full Name' }; const passwordLabel = { 'aria-label': 'Password' }; const maskLabel = { 'aria-label': 'Mask' }; const emailLabel = { 'aria-label': 'Email' }; const rules = { X: /[02-9]/ }; function App() { const [emailValue, setEmailValue] = useState('smith@corp.com'); const valueChanged = useCallback((data: TextBoxTypes.ValueChangedEvent) => { setEmailValue(`${data.value.replace(/\s/g, '').toLowerCase()}@corp.com`); }, []); return ( <div> <div className="dx-fieldset"> <div className="dx-field"> <div className="dx-field-label">Default mode</div> <div className="dx-field-value"> <TextBox defaultValue="John Smith" inputAttr={nameLabel} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">With placeholder</div> <div className="dx-field-value"> <TextBox placeholder="Enter full name here..." inputAttr={fullNameLabel} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">With clear button</div> <div className="dx-field-value"> <TextBox defaultValue="John Smith" inputAttr={nameLabel} showClearButton={true} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Password mode</div> <div className="dx-field-value"> <TextBox mode="password" inputAttr={passwordLabel} placeholder="Enter password" showClearButton={true} defaultValue="f5lzKs0T" /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Text mask</div> <div className="dx-field-value"> <TextBox mask="+1 (X00) 000-0000" inputAttr={maskLabel} maskRules={rules} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Disabled</div> <div className="dx-field-value"> <TextBox defaultValue="John Smith" inputAttr={nameLabel} disabled={true} /> </div> </div> </div> <div className="dx-fieldset"> <div className="dx-fieldset-header">Events and API</div> <div className="dx-field"> <div className="dx-field-label">Full Name</div> <div className="dx-field-value"> <TextBox defaultValue="Smith" inputAttr={fullNameLabel} showClearButton={true} placeholder="Enter full name" valueChangeEvent="keyup" onValueChanged={valueChanged} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Email (read only)</div> <div className="dx-field-value"> <TextBox readOnly={true} inputAttr={emailLabel} hoverStateEnabled={false} value={emailValue} /> </div> </div> </div> </div> ); } export default App;
import React, { useCallback, useState } from 'react'; import TextBox from 'devextreme-react/text-box'; const nameLabel = { 'aria-label': 'Name' }; const fullNameLabel = { 'aria-label': 'Full Name' }; const passwordLabel = { 'aria-label': 'Password' }; const maskLabel = { 'aria-label': 'Mask' }; const emailLabel = { 'aria-label': 'Email' }; const rules = { X: /[02-9]/ }; function App() { const [emailValue, setEmailValue] = useState('smith@corp.com'); const valueChanged = useCallback((data) => { setEmailValue(`${data.value.replace(/\s/g, '').toLowerCase()}@corp.com`); }, []); return ( <div> <div className="dx-fieldset"> <div className="dx-field"> <div className="dx-field-label">Default mode</div> <div className="dx-field-value"> <TextBox defaultValue="John Smith" inputAttr={nameLabel} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">With placeholder</div> <div className="dx-field-value"> <TextBox placeholder="Enter full name here..." inputAttr={fullNameLabel} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">With clear button</div> <div className="dx-field-value"> <TextBox defaultValue="John Smith" inputAttr={nameLabel} showClearButton={true} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Password mode</div> <div className="dx-field-value"> <TextBox mode="password" inputAttr={passwordLabel} placeholder="Enter password" showClearButton={true} defaultValue="f5lzKs0T" /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Text mask</div> <div className="dx-field-value"> <TextBox mask="+1 (X00) 000-0000" inputAttr={maskLabel} maskRules={rules} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Disabled</div> <div className="dx-field-value"> <TextBox defaultValue="John Smith" inputAttr={nameLabel} disabled={true} /> </div> </div> </div> <div className="dx-fieldset"> <div className="dx-fieldset-header">Events and API</div> <div className="dx-field"> <div className="dx-field-label">Full Name</div> <div className="dx-field-value"> <TextBox defaultValue="Smith" inputAttr={fullNameLabel} showClearButton={true} placeholder="Enter full name" valueChangeEvent="keyup" onValueChanged={valueChanged} /> </div> </div> <div className="dx-field"> <div className="dx-field-label">Email (read only)</div> <div className="dx-field-value"> <TextBox readOnly={true} inputAttr={emailLabel} hoverStateEnabled={false} value={emailValue} /> </div> </div> </div> </div> ); } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render(<App />, document.getElementById('app'));
window.exports = window.exports || {}; window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, jsx: 'react', }, meta: { 'react': { 'esModule': true, }, 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, defaultExtension: 'js', map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', 'react': 'npm:react@17.0.2/umd/react.development.js', 'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js', 'prop-types': 'npm:prop-types@15.8.1/prop-types.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@23.2.5/cjs', 'devextreme-react': 'npm:devextreme-react@23.2.5/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.6.4/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.5/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.51/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.12', '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', 'devextreme-cldr-data': 'npm:devextreme-cldr-data@1.0.3', // SystemJS plugins '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.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js', }, packages: { 'devextreme': { defaultExtension: 'js', }, 'devextreme-react': { main: 'index.js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/localization/messages': { format: 'json', defaultExtension: '', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.12/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, react: true, }, }; System.config(window.config);
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('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/23.2.5/css/dx.light.css" /> <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.tsx"); </script> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>