DevExtreme v24.1 is now available.

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

Your search did not match any results.

Directions

By default, the TileView component is oriented horizontally, but you can orient it vertically using the direction property.

Backend API
import React, { useCallback, useState } from 'react'; import TileView, { TileViewTypes } from 'devextreme-react/tile-view'; import SelectBox, { SelectBoxTypes } from 'devextreme-react/select-box'; import RenderHomeItem from './HomeItem.tsx'; import { homes, directionLabel } from './data.ts'; const directions = ['horizontal', 'vertical']; const App = () => { const [direction, setDirection] = useState<TileViewTypes.Properties['direction']>('horizontal'); const directionChanged = useCallback((e: SelectBoxTypes.ValueChangedEvent) => { setDirection(e.value); }, [setDirection]); return ( <div> <TileView items={homes} itemRender={RenderHomeItem} height={390} baseItemHeight={120} baseItemWidth={185} width='100%' itemMargin={10} direction={direction} /> <div className='options'> <div className='caption'>Options</div> <div className='option'> <span>Direction</span>&nbsp; <SelectBox items={directions} inputAttr={directionLabel} value={direction} onValueChanged={directionChanged} ></SelectBox> </div> </div> </div> ); }; export default App;
import React, { useCallback, useState } from 'react'; import TileView from 'devextreme-react/tile-view'; import SelectBox from 'devextreme-react/select-box'; import RenderHomeItem from './HomeItem.js'; import { homes, directionLabel } from './data.js'; const directions = ['horizontal', 'vertical']; const App = () => { const [direction, setDirection] = useState('horizontal'); const directionChanged = useCallback( (e) => { setDirection(e.value); }, [setDirection], ); return ( <div> <TileView items={homes} itemRender={RenderHomeItem} height={390} baseItemHeight={120} baseItemWidth={185} width="100%" itemMargin={10} direction={direction} /> <div className="options"> <div className="caption">Options</div> <div className="option"> <span>Direction</span>&nbsp; <SelectBox items={directions} inputAttr={directionLabel} value={direction} onValueChanged={directionChanged} ></SelectBox> </div> </div> </div> ); }; export default App;
import React from 'react'; export default function RenderHomeItem(data: { ImageSrc: string; }) { return ( <div className="dx-tile-image" style={{ backgroundImage: `url(${data.ImageSrc})` }} /> ); }
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
export const homes = [{ ID: '1', Address: '652 Avonwick Gate', City: 'Toronto', State: 'ON', Price: 780000, ImageSrc: '../../../../images/gallery/1.jpg', }, { ID: '2', Address: '328 S Kerema Ave', City: 'Milford', State: 'CT', Price: 350000, ImageSrc: '../../../../images/gallery/3.jpg', }, { ID: '3', Address: '8512 Tanglewood Cir', City: 'Reform', State: 'AL', Price: 250000, ImageSrc: '../../../../images/gallery/6.jpg', widthRatio: 2, }, { ID: '4', Address: '6351 Forrest St', City: 'Jersey City', State: 'NJ', Price: 320000, ImageSrc: '../../../../images/gallery/14.jpg', }, { ID: '5', Address: '61207 16th St N', City: 'Moorhead', State: 'MN', Price: 1700000, ImageSrc: '../../../../images/gallery/5.jpg', heightRatio: 2, widthRatio: 2, }, { ID: '6', Address: '5119 Beryl Dr', City: 'San Antonio', State: 'TX', Price: 455000, ImageSrc: '../../../../images/gallery/4.jpg', }, { ID: '7', Address: '7121 Bailey St', City: 'Worcester', State: 'MA', Price: 555000, ImageSrc: '../../../../images/gallery/7.jpg', }, { ID: '8', Address: '82649 Topeka St', City: 'Riverbank', State: 'CA', Price: 1750000, ImageSrc: '../../../../images/gallery/2.jpg', heightRatio: 2, }, { ID: '9', Address: '7700 Elmwood Dr', City: 'Cleveland', State: 'OK', Price: 470000, ImageSrc: '../../../../images/gallery/17.jpg', heightRatio: 2, widthRatio: 2, }, { ID: '10', Address: '620201 Plymouth Rd', City: 'Detroit', State: 'MI', Price: 610000, ImageSrc: '../../../../images/gallery/8.jpg', }, { ID: '11', Address: '1198 Theresa Cir', City: 'Whitinsville', State: 'MA', Price: 320000, ImageSrc: '../../../../images/gallery/9.jpg', }, { ID: '12', Address: '4815 Warbler Ln', City: 'Rockport', State: 'TX', Price: 700000, ImageSrc: '../../../../images/gallery/12.jpg', }, { ID: '13', Address: '420234 Rogge St', City: 'Detroit', State: 'MI', Price: 320000, ImageSrc: '../../../../images/gallery/23.jpg', }, { ID: '14', Address: '114840 Interlake Ave N', City: 'Seattle', State: 'WA', Price: 400000, ImageSrc: '../../../../images/gallery/22.jpg', }, { ID: '15', Address: '13673 Pearl Dr #7', City: 'Monroe', State: 'MI', Price: 399000, ImageSrc: '../../../../images/gallery/20.jpg', }, { ID: '16', Address: '15447 Via Viento', City: 'Atascadero', State: 'CA', Price: 1100000, ImageSrc: '../../../../images/gallery/21.jpg', }]; export const directionLabel = { 'aria-label': 'Direction Label' };
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@24.1.3/cjs', 'devextreme-react': 'npm:devextreme-react@24.1.3/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.8/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', '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.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'devextreme': { defaultExtension: 'js', }, 'devextreme-react': { main: 'index.js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/localization/messages': { format: 'json', defaultExtension: 'json', }, '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, react: true, }, }; System.config(window.config);
import React from 'react'; export default function RenderHomeItem(data) { return ( <div className="dx-tile-image" style={{ backgroundImage: `url(${data.ImageSrc})` }} /> ); }
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
export const homes = [ { ID: '1', Address: '652 Avonwick Gate', City: 'Toronto', State: 'ON', Price: 780000, ImageSrc: '../../../../images/gallery/1.jpg', }, { ID: '2', Address: '328 S Kerema Ave', City: 'Milford', State: 'CT', Price: 350000, ImageSrc: '../../../../images/gallery/3.jpg', }, { ID: '3', Address: '8512 Tanglewood Cir', City: 'Reform', State: 'AL', Price: 250000, ImageSrc: '../../../../images/gallery/6.jpg', widthRatio: 2, }, { ID: '4', Address: '6351 Forrest St', City: 'Jersey City', State: 'NJ', Price: 320000, ImageSrc: '../../../../images/gallery/14.jpg', }, { ID: '5', Address: '61207 16th St N', City: 'Moorhead', State: 'MN', Price: 1700000, ImageSrc: '../../../../images/gallery/5.jpg', heightRatio: 2, widthRatio: 2, }, { ID: '6', Address: '5119 Beryl Dr', City: 'San Antonio', State: 'TX', Price: 455000, ImageSrc: '../../../../images/gallery/4.jpg', }, { ID: '7', Address: '7121 Bailey St', City: 'Worcester', State: 'MA', Price: 555000, ImageSrc: '../../../../images/gallery/7.jpg', }, { ID: '8', Address: '82649 Topeka St', City: 'Riverbank', State: 'CA', Price: 1750000, ImageSrc: '../../../../images/gallery/2.jpg', heightRatio: 2, }, { ID: '9', Address: '7700 Elmwood Dr', City: 'Cleveland', State: 'OK', Price: 470000, ImageSrc: '../../../../images/gallery/17.jpg', heightRatio: 2, widthRatio: 2, }, { ID: '10', Address: '620201 Plymouth Rd', City: 'Detroit', State: 'MI', Price: 610000, ImageSrc: '../../../../images/gallery/8.jpg', }, { ID: '11', Address: '1198 Theresa Cir', City: 'Whitinsville', State: 'MA', Price: 320000, ImageSrc: '../../../../images/gallery/9.jpg', }, { ID: '12', Address: '4815 Warbler Ln', City: 'Rockport', State: 'TX', Price: 700000, ImageSrc: '../../../../images/gallery/12.jpg', }, { ID: '13', Address: '420234 Rogge St', City: 'Detroit', State: 'MI', Price: 320000, ImageSrc: '../../../../images/gallery/23.jpg', }, { ID: '14', Address: '114840 Interlake Ave N', City: 'Seattle', State: 'WA', Price: 400000, ImageSrc: '../../../../images/gallery/22.jpg', }, { ID: '15', Address: '13673 Pearl Dr #7', City: 'Monroe', State: 'MI', Price: 399000, ImageSrc: '../../../../images/gallery/20.jpg', }, { ID: '16', Address: '15447 Via Viento', City: 'Atascadero', State: 'CA', Price: 1100000, ImageSrc: '../../../../images/gallery/21.jpg', }, ]; export const directionLabel = { 'aria-label': 'Direction Label' };
<!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.3/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.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> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
.dx-selectbox { max-width: 400px; } .dx-tile-content { height: 100%; } .dx-tile-image { height: 100%; width: 100%; background-position: center; background-size: cover; display: block; } .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); margin-top: 20px; } .caption { font-size: 18px; font-weight: 500; } .option { margin-top: 10px; } .option > span { width: 70px; display: inline-block; } .option > .dx-widget { display: inline-block; vertical-align: middle; width: 100%; max-width: 350px; }