---
order: 3
title: Real project with umi and dva
---
In real project development, you might need a data flow solution like Redux or MobX. Ant Design React is a UI library that can be used with any data flow solution and application framework within the React ecosystem. We have launched dva based on Redux, as well as a pluggable enterprise application framework umi, which is recommended for use in your projects.
Dva is a lightweight data flow solution based on Redux. The concept comes from elm. It supports side effects, hot module replacement, dynamic loading, react-native, SSR, etc. It has been widely used in production.
And [umi](http://umijs.org/) is a routing-based framework that supports [next.js-like conventional routing](https://umijs.org/guide/router.html) and various advanced routing functions, such as [routing-level on-demand loading](https://umijs.org/en/plugin/umi-plugin-react.html#dynamicimport). With a complete [plugin system](https://umijs.org/plugin/) that covers every life cycle from source code to build product, umi is able to support various functional extensions and business needs; meanwhile [Umi UI](https://umijs.org/guide/umi-ui.html) is provided to enhance the development experience and development efficiency through Visual Aided Programming (VAP).
> You may also be interested in [Ant Design Pro](https://pro.ant.design/), an Out-of-box UI solution for enterprise applications based on umi, dva and ant design.
This article will guide you to create a simple application from zero using Umi, dva and antd.
## Install Umi
It is recommended to use yarn to create an application and execute the following command.
```bash
$ mkdir myapp && cd myapp
$ yarn create @umijs/umi-app
$ yarn
```
> If you are using npm, execute `npm install umi -g` and the effect will be the same.
## Install presets
Execute the following command, install presets(including the antd, dva, locale plugins):
```bash
# 或 npm i @umijs/preset-react -D
$ yarn add @umijs/preset-react -D
```
> And if you want to use a fixed version of antd, you can install additional antd dependency in your project, and the antd dependencies declared in package.json will be used first.
## Create Routes
We need to write an application displaying the list of products. The first step is to create a route.
If you don't have npx, you need to install it first to execute the commands under node_modules.
```bash
$ yarn global add npx
```
Then create a `/products` route,
```bash
$ npx umi g page products --typescript
Write: src/pages/products.tsx
Write: src/pages/products.css
```
In `.umirc.ts` configured in routing, if there is need to internationalization, can configure `locale` enable antd internationalization:
```diff
import { defineConfig } from 'umi';
export default defineConfig({
+ locale: { antd: true },
routes: [
{ path: '/', component: '@/pages/index' },
+ { path: '/products', component: '@/pages/products' },
],
});
```
run `yarn start` then open [http://localhost:8000/products](http://localhost:8000/products) in your browser and you should see the corresponding page.
## Write UI Components
As your application grows and you notice you are sharing UI elements between multiple pages (or using them multiple times on the same page), in umi it's called reusable components.
Let's create a `ProductList` component that we can use in multiple places to show a list of products.
Create `src/components/ProductList.tsx` by typing:
```js
import { Table, Popconfirm, Button } from 'antd';
const ProductList = ({ onDelete, products }) => {
const columns = [
{
title: 'Name',
dataIndex: 'name',
},
{
title: 'Actions',
render: (text, record) => {
return (