Getting started with Vue DataManager in Vue 2
6 Jul 202624 minutes to read
The Syncfusion® Vue DataManager enables efficient data management in Vue applications. It seamlessly interacts with various data sources (remote or local) and provides functionalities like sorting, filtering, paging, and CRUD (Create, Read, Update, Delete) operations, enhancing the data presentation capabilities of your Vue application.
This guide details the steps involved in setting up a Vue 2 project using Vue CLI and seamlessly integrating the Syncfusion® Vue DataManager.
Prerequisites for Syncfusion® Vue UI Components
Before integrating Syncfusion® Vue UI components, ensure that the development environment meets the following prerequisites by referring to the system requirements documentation. This documentation provides information about supported browsers, Vue.js versions, and other dependencies required for using Syncfusion® Vue UI components effectively.
System requirements for Syncfusion® Vue UI components
Dependencies
This section provides information about the Essential® dependencies required for integrating the Syncfusion® Vue DataManager into your Vue projects. These dependencies are necessary for managing and manipulating data effectively within your applications.
-
@syncfusion/ej2-data: The@syncfusion/ej2-datapackage serves as the core component for Syncfusion® data management functionalities. It includes critical features such as DataManager, which enables various data operations like sorting, filtering, and paging. By integrating this package into your Vue project, gain access to powerful tools for handling data efficiently. -
@syncfusion/ej2-base: The@syncfusion/ej2-basepackage serves as the foundational layer for other Syncfusion® packages. It provides Essential® utilities and helpers required for seamless integration and functionality of Syncfusion® components within your Vue applications.
|-- @syncfusion/ej2-data
|-- @syncfusion/ej2-base
|-- es6-promise (Required when window.Promise is not available)@syncfusion/ej2-data requires the presence of a Promise feature in global environment. In the browser, window.Promise must be available.
Installation and configuration
To set up a Vue 2 application, you can utilize the Vue CLI, which provides various commands to initialize projects, manage dependencies, and build production-ready applications. Follow the steps below:
Step 1: Install Vue CLI globally
Open the terminal or command prompt and run the following command to install Vue CLI globally using npm:
npm install -g @vue/cliAlternatively, if you prefer using yarn, you can use the following command:
yarn global add @vue/cliStep 2: Create a New Vue Project
Once Vue CLI is installed, navigate to the desired project directory using the terminal. Execute the following command to create a new Vue project
vue create data-appThis command initiates the project creation process, where you can choose features and configurations. Select the option Default ([Vue 2] babel, eslint) from the menu.

Step 3: Navigate to the project directory
After creating the project, navigate into the project directory using the cd command:
cd data-appStep 4: Install Syncfusion® package
Install the Syncfusion® package required for data management using the following command:
npm install @syncfusion/ej2-data --saveStep 5: Run the application
To launch the development server, use one of the following commands
Using npm
npm run serveor
Using yarn
yarn run serveConnection to a data source
Data sources serve as repositories that store and manage various types of data, enabling applications to retrieve, manipulate, and present data effectively. Establishing a connection between an application and a data source is Essential® for optimizing data utility
The Syncfusion® DataManager serves as a gateway for both local and remote data sources, utilizing query to interact with the data.
Binding to JSON data
Binding to a local data source involves connecting an application directly to a dataset stored within the application itself. This method is useful for small-scale applications where data does not need to be fetched from external sources.
To bind DataManager to a local data source, assign an array of JavaScript objects to the json property or pass them to the constructor during instantiation.
-
Create a [src/datasource.js] file and use the following dataset to provide JSON data:
exports.data = [ { OrderID: 10248, CustomerID: 'VINET', EmployeeID: 5, OrderDate: new Date(8364186e5), ShipName: 'Vins et alcools Chevalier', ShipCity: 'Reims', ShipAddress: '59 rue de l Abbaye', ShipRegion: 'CJ', ShipPostalCode: '51100', ShipCountry: 'France', Freight: 32.38, Verified: !0 }, { OrderID: 10249, CustomerID: 'TOMSP', EmployeeID: 6, OrderDate: new Date(836505e6), ShipName: 'Toms Spezialitäten', ShipCity: 'Münster', ShipAddress: 'Luisenstr. 48', ShipRegion: 'CJ', ShipPostalCode: '44087', ShipCountry: 'Germany', Freight: 11.61, Verified: !1 }, { OrderID: 10250, CustomerID: 'HANAR', EmployeeID: 4, OrderDate: new Date(8367642e5), ShipName: 'Hanari Carnes', ShipCity: 'Rio de Janeiro', ShipAddress: 'Rua do Paço, 67', ShipRegion: 'RJ', ShipPostalCode: '05454-876', ShipCountry: 'Brazil', Freight: 65.83, Verified: !0 }, { OrderID: 10251, CustomerID: 'VICTE', EmployeeID: 3, OrderDate: new Date(8367642e5), ShipName: 'Victuailles en stock', ShipCity: 'Lyon', ShipAddress: '2, rue du Commerce', ShipRegion: 'CJ', ShipPostalCode: '69004', ShipCountry: 'France', Freight: 41.34, Verified: !0 }, { OrderID: 10252, CustomerID: 'SUPRD', EmployeeID: 4, OrderDate: new Date(8368506e5), ShipName: 'Suprêmes délices', ShipCity: 'Charleroi', ShipAddress: 'Boulevard Tirou, 255', ShipRegion: 'CJ', ShipPostalCode: 'B-6000', ShipCountry: 'Belgium', Freight: 51.3, Verified: !0 }, { OrderID: 10253, CustomerID: 'HANAR', EmployeeID: 3, OrderDate: new Date(836937e6), ShipName: 'Hanari Carnes', ShipCity: 'Rio de Janeiro', ShipAddress: 'Rua do Paço, 67', ShipRegion: 'RJ', ShipPostalCode: '05454-876', ShipCountry: 'Brazil', Freight: 58.17, Verified: !0 }, { OrderID: 10254, CustomerID: 'CHOPS', EmployeeID: 5, OrderDate: new Date(8370234e5), ShipName: 'Chop-suey Chinese', ShipCity: 'Bern', ShipAddress: 'Hauptstr. 31', ShipRegion: 'CJ', ShipPostalCode: '3012', ShipCountry: 'Switzerland', Freight: 22.98, Verified: !1 }, { OrderID: 10255, CustomerID: 'RICSU', EmployeeID: 9, OrderDate: new Date(8371098e5), ShipName: 'Richter Supermarkt', ShipCity: 'Genève', ShipAddress: 'Starenweg 5', ShipRegion: 'CJ', ShipPostalCode: '1204', ShipCountry: 'Switzerland', Freight: 148.33, Verified: !0 }, { OrderID: 10256, CustomerID: 'WELLI', EmployeeID: 3, OrderDate: new Date(837369e6), ShipName: 'Wellington Importadora', ShipCity: 'Resende', ShipAddress: 'Rua do Mercado, 12', ShipRegion: 'SP', ShipPostalCode: '08737-363', ShipCountry: 'Brazil', Freight: 13.97, Verified: !1 }, { OrderID: 10257, CustomerID: 'HILAA', EmployeeID: 4, OrderDate: new Date(8374554e5), ShipName: 'HILARION-Abastos', ShipCity: 'San Cristóbal', ShipAddress: 'Carrera 22 con Ave. Carlos Soublette #8-35', ShipRegion: 'Táchira', ShipPostalCode: '5022', ShipCountry: 'Venezuela', Freight: 81.91, Verified: !0 }, { OrderID: 10258, CustomerID: 'ERNSH', EmployeeID: 1, OrderDate: new Date(8375418e5), ShipName: 'Ernst Handel', ShipCity: 'Graz', ShipAddress: 'Kirchgasse 6', ShipRegion: 'CJ', ShipPostalCode: '8010', ShipCountry: 'Austria', Freight: 140.51, Verified: !0 }, { OrderID: 10259, CustomerID: 'CENTC', EmployeeID: 4, OrderDate: new Date(8376282e5), ShipName: 'Centro comercial Moctezuma', ShipCity: 'México D.F.', ShipAddress: 'Sierras de Granada 9993', ShipRegion: 'CJ', ShipPostalCode: '05022', ShipCountry: 'Mexico', Freight: 3.25, Verified: !1 }, { OrderID: 10260, CustomerID: 'OTTIK', EmployeeID: 4, OrderDate: new Date(8377146e5), ShipName: 'Ottilies Käseladen', ShipCity: 'Köln', ShipAddress: 'Mehrheimerstr. 369', ShipRegion: 'CJ', ShipPostalCode: '50739', ShipCountry: 'Germany', Freight: 55.09, Verified: !0 }, { OrderID: 10261, CustomerID: 'QUEDE', EmployeeID: 4, OrderDate: new Date(8377146e5), ShipName: 'Que Delícia', ShipCity: 'Rio de Janeiro', ShipAddress: 'Rua da Panificadora, 12', ShipRegion: 'RJ', ShipPostalCode: '02389-673', ShipCountry: 'Brazil', Freight: 3.05, Verified: !1 }, { OrderID: 10262, CustomerID: 'RATTC', EmployeeID: 8, OrderDate: new Date(8379738e5), ShipName: 'Rattlesnake Canyon Grocery', ShipCity: 'Albuquerque', ShipAddress: '2817 Milton Dr.', ShipRegion: 'NM', ShipPostalCode: '87110', ShipCountry: 'USA', Freight: 48.29, Verified: !0 } ] -
Import the dataset in the src/App.vue file.
-
Add the following CSS to the
<style>section of the src/App.vue file to style the table:<style> .e-table { border: solid 1px #e0e0e0; border-collapse: collapse; font-family: Roboto; } .e-table td, .e-table th { border-style: solid; border-width: 1px 0 0; border-color: #e0e0e0; display: table-cell; font-size: 14px; line-height: 20px; overflow: hidden; padding: 8px 21px; vertical-align: middle; white-space: nowrap; width: auto; } </style>
The following example demonstrates how to bind JSON data using the executeLocal method of DataManager.
<template>
<div id="app">
<table class='e-table'>
<tr><th>Order ID</th><th>Customer ID</th><th>Employee ID</th><th>Ship Country</th></tr>
<tr v-for="(item, index) in items" :key="index">
<td>{{ item.OrderID }}</td>
<td>{{ item.CustomerID }}</td>
<td>{{ item.EmployeeID }}</td>
<td>{{ item.ShipCountry }}</td>
</tr>
</table>
</div>
</template>
<script>
import { data } from './datasource.js';
import { DataManager, Query } from '@syncfusion/ej2-data';
export default {
data() {
return {
items: new DataManager(data).executeLocal(new Query())
};
},
}
</script>
<style>
.e-table {
border: solid 1px #e0e0e0;
border-collapse: collapse;
font-family: Roboto;
}
.e-table td, .e-table th {
border-style: solid;
border-width: 1px 0 0;
border-color: #e0e0e0;
display: table-cell;
font-size: 14px;
line-height: 20px;
overflow: hidden;
padding: 8px 21px;
vertical-align: middle;
white-space: nowrap;
width: auto;
}
</style>Binding to ODataV4
OData (Open Data Protocol) is a standardized protocol for creating and consuming data APIs over the internet allows to access and manipulate data from various sources. Syncfusion’s® DataManager provides seamless integration with OData services, enabling binding of data from remote sources to applications.
DataManager can be bound to remote data sources by assigning the service endpoint URL to the url property. All DataManager operations address the provided service endpoint.
The following example demonstrates how to bind data to an OData service using the executeQuery method of DataManager.
<template>
<div id="app">
<table class='e-table'>
<tr><th>Order ID</th><th>Customer ID</th><th>Employee ID</th><th>Ship Country</th></tr>
<tr v-for="(item, index) in items" :key="index">
<td>{{ item.OrderID }}</td>
<td>{{ item.CustomerID }}</td>
<td>{{ item.EmployeeID }}</td>
<td>{{ item.ShipCountry }}</td>
</tr>
</table>
</div>
</template>
<script>
import { DataManager, Query, ODataV4Adaptor } from '@syncfusion/ej2-data';
export default {
data() {
return {
items: []
};
},
mounted() {
let SERVICE_URI = "https://services.odata.org/V4/Northwind/Northwind.svc/Orders";
let dataManager = new DataManager({
url: SERVICE_URI,
adaptor: new ODataV4Adaptor()
});
dataManager.executeQuery(new Query().take(12)).then((e) => {
this.items = e.result;
});
}
}
</script>
<style>
.e-table {
border: solid 1px #e0e0e0;
border-collapse: collapse;
font-family: Roboto;
}
.e-table td, .e-table th {
border-style: solid;
border-width: 1px 0 0;
border-color: #e0e0e0;
display: table-cell;
font-size: 14px;
line-height: 20px;
overflow: hidden;
padding: 8px 21px;
vertical-align: middle;
white-space: nowrap;
width: auto;
}
</style>Filter
Data filtering is a fundamental operation that enables a reduced view of data based on specified filter criteria. This feature is Essential® for efficiently managing and displaying large datasets.
The filter expression can be constructed using the where method of the query class. This method enables specification of filter criteria based on various conditions.
The following example demonstrates filtering data based on the EmployeeID field equal to 4 using the where method of the query class and executeLocal method of DataManager.
<template>
<div id="app">
<table class='e-table'>
<tr><th>Order ID</th><th>Customer ID</th><th>Employee ID</th><th>Ship Country</th></tr>
<tr v-for="(item, index) in items" :key="index">
<td>{{ item.OrderID }}</td>
<td>{{ item.CustomerID }}</td>
<td>{{ item.EmployeeID }}</td>
<td>{{ item.ShipCountry }}</td>
</tr>
</table>
</div>
</template>
<script>
import { data } from './datasource.js';
import { DataManager, Query } from '@syncfusion/ej2-data';
export default {
data() {
return {
items: new DataManager(data).executeLocal(new Query().where('EmployeeID', 'equal', 4))
};
},
}
</script>
<style>
.e-table {
border: solid 1px #e0e0e0;
border-collapse: collapse;
font-family: Roboto;
}
.e-table td, .e-table th {
border-style: solid;
border-width: 1px 0 0;
border-color: #e0e0e0;
display: table-cell;
font-size: 14px;
line-height: 20px;
overflow: hidden;
padding: 8px 21px;
vertical-align: middle;
white-space: nowrap;
width: auto;
}
</style>Sort
Sorting data enables arrangement in either ascending or descending order based on specified criteria.
The sortBy method of the query class facilitates data sorting based on specified fields and order.
The following example demonstrates sorting data based on the EmployeeID field in ascending order using the sortBy method of the query class and executeLocal method of DataManager.
<template>
<div id="app">
<table class='e-table'>
<tr><th>Order ID</th><th>Customer ID</th><th>Employee ID</th><th>Ship Country</th></tr>
<tr v-for="(item, index) in items" :key="index">
<td>{{ item.OrderID }}</td>
<td>{{ item.CustomerID }}</td>
<td>{{ item.EmployeeID }}</td>
<td>{{ item.ShipCountry }}</td>
</tr>
</table>
</div>
</template>
<script>
import { data } from './datasource.js';
import { DataManager, Query } from '@syncfusion/ej2-data';
export default {
data() {
return {
items: new DataManager(data).executeLocal(new Query().sortBy('EmployeeID').take(8))
};
},
}
</script>
<style>
.e-table {
border: solid 1px #e0e0e0;
border-collapse: collapse;
font-family: Roboto;
}
.e-table td, .e-table th {
border-style: solid;
border-width: 1px 0 0;
border-color: #e0e0e0;
display: table-cell;
font-size: 14px;
line-height: 20px;
overflow: hidden;
padding: 8px 21px;
vertical-align: middle;
white-space: nowrap;
width: auto;
}
</style>Page
Paging enables display of data in segmented pages, facilitating navigation through large datasets. The page method of the query class enables data pagination by retrieving a specific range based on the page index and page size.
The following example demonstrates applying paging to data using the page method of the query class and executeLocal method of DataManager.
<template>
<div id="app">
<table class='e-table'>
<tr><th>Order ID</th><th>Customer ID</th><th>Employee ID</th><th>Ship Country</th></tr>
<tr v-for="(item, index) in items" :key="index">
<td>{{ item.OrderID }}</td>
<td>{{ item.CustomerID }}</td>
<td>{{ item.EmployeeID }}</td>
<td>{{ item.ShipCountry }}</td>
</tr>
</table>
</div>
</template>
<script>
import { data } from './datasource.js';
import { DataManager, Query } from '@syncfusion/ej2-data';
export default {
data() {
return {
items: new DataManager(data).executeLocal(new Query().page(1, 8))
};
},
}
</script>
<style>
.e-table {
border: solid 1px #e0e0e0;
border-collapse: collapse;
font-family: Roboto;
}
.e-table td, .e-table th {
border-style: solid;
border-width: 1px 0 0;
border-color: #e0e0e0;
display: table-cell;
font-size: 14px;
line-height: 20px;
overflow: hidden;
padding: 8px 21px;
vertical-align: middle;
white-space: nowrap;
width: auto;
}
</style>Component binding
The DataManager can be seamlessly integrated with Syncfusion® components that support data binding. Before integrating DataManager, register the Syncfusion® Vue component.
In the following samples, the grid component is bound. To render the Grid with the necessary configurations, please refer to the Grid Getting Started documentation.
Local data binding
Local data binding enables direct binding of data to Syncfusion® components from within a Vue application. This method is useful when data is available locally and requires seamless integration with Syncfusion® components.
To bind local data to a Syncfusion® component, follow these steps:
-
Define data directly in the Vue component or import it from an external source.
-
Use the DataManager class to create a data source and bind it to the data.
-
Integrate the data source with the Syncfusion® grid component by setting the dataSource property.
The following example shows how to bind local data to the grid component using DataManager.
<template>
<div id="app">
<ejs-grid :dataSource="data">
<e-columns>
<e-column field='OrderID' headerText='Order ID' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='Freight' headerText='Freight' format='C2' width=90></e-column>
<e-column field='ShipName' headerText='Ship Name' width=100></e-column>
</e-columns>
</ejs-grid>
</div>
</template>
<script>
import { data } from './datasource.js';
import { GridComponent, ColumnDirective, ColumnsDirective } from '@syncfusion/ej2-vue-grids';
import { DataManager } from '@syncfusion/ej2-data';
export default {
name: "App",
components: {
"ejs-grid": GridComponent,
"e-columns": ColumnsDirective,
"e-column": ColumnDirective
},
data() {
return {
data: new DataManager(data)
};
}
}
</script>
<style>
@import "../node_modules/@syncfusion/ej2-base/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-buttons/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-calendars/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-dropdowns/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-inputs/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-navigations/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-popups/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-splitbuttons/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-vue-grids/styles/material3.css";
</style>Remote data binding
Remote data binding involves binding external data sources, such as API endpoints, to Syncfusion® components, enabling dynamic data fetching and display from a server.
To bind remote data to a Syncfusion® component, follow these steps:
-
Initialize a DataManager object and configure it with the URL of the remote service from which data is fetched.
-
Assign the
DataManagerinstance to the dataSource property of the Syncfusion® grid component.
The following example demonstrates how to bind remote data to the grid component using DataManager.
<template>
<div id="app">
<ejs-grid :dataSource="data">
<e-columns>
<e-column field='OrderID' headerText='Order ID' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='Freight' headerText='Freight' format='C2' width=90></e-column>
<e-column field='ShipName' headerText='Ship Name' width=100></e-column>
</e-columns>
</ejs-grid>
</div>
</template>
<script>
import { GridComponent, ColumnsDirective, ColumnDirective } from '@syncfusion/ej2-vue-grids';
import { DataManager } from '@syncfusion/ej2-data';
export default {
name: "App",
components: {
"ejs-grid": GridComponent,
"e-columns": ColumnsDirective,
"e-column": ColumnDirective
},
data() {
const SERVICE_URI = 'https://services.syncfusion.com/vue/production/';
return {
data: new DataManager({ url: SERVICE_URI + 'api/Orders' })
};
},
}
</script>
<style>
@import "../node_modules/@syncfusion/ej2-base/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-buttons/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-calendars/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-dropdowns/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-inputs/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-navigations/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-popups/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-splitbuttons/styles/material3.css";
@import "../node_modules/@syncfusion/ej2-vue-grids/styles/material3.css";
</style>