初めてのdvを探します.ショッピングカートは実戦的です.
7436 ワード
DVA概要
dvdはreduxとredux-sagaに基づくデータストリームスキームであり、開発体験を簡略化するために、dvdはreact-routerとfetchを別途内蔵しているので、dvdはライト級のアプリケーションフレームとしても理解できる.公式サイトから
ショッピングカートの例
この練習はdvd+antdを使ってカートの練習をしました.目的はより速くdvdを作るためです.練習の複雑さは高くないです.もっと多いのは基礎運用開発です.
プロジェクトの参考ソース
デモサイト githubコード
基本設定 DVD足場 をインストールします.新規プロジェクト を作成します. dvdプロジェクトで は、 .
は を要求する.
楽屋を設ける
今回の練習は主にdvdを知るために状態管理をしています.バックグラウンドに対しては高くないです.商品データを簡単に返します. に 新規 を保存します.は を編集する.
フロント開発今回の練習は 編集 ここで、私達は直接 にアクセスします.
商品リストのルートを作成します. 新規 編集 dvdはすでに をカプセル化することができます. dvdは、modelの概念を通じて一つの分野のモデルを管理し、同期更新stateのreducersを含み、非同期論理のeffectsを処理し、データソースを購読するsubscriptionsの新規 拡張:
修正 続いて、私達はコンポーネントの中で を使うことができます.
dvdはreduxとredux-sagaに基づくデータストリームスキームであり、開発体験を簡略化するために、dvdはreact-routerとfetchを別途内蔵しているので、dvdはライト級のアプリケーションフレームとしても理解できる.公式サイトから
ショッピングカートの例
この練習はdvd+antdを使ってカートの練習をしました.目的はより速くdvdを作るためです.練習の複雑さは高くないです.もっと多いのは基礎運用開発です.
プロジェクトの参考ソース
デモサイト githubコード
基本設定
npm install dva-cli -g
dva new shopping-cart-dva
cd shopping-cart-dva
antd
を使用します.yarn add antd babel-plugin-import
.webpackrc
を編集して、babel-plugin-import
プラグインを有効にする{
"extraBabelPlugins": [
["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]
]
}
.webpackrc
を編集し、proxy
属性を構成し、プロキシ要求"proxy": {
"/api": {
"target": "http://localhost:3000", //
"changeOrigin": true,
// "pathRewrite": { "^/api" : "" }
}
}
楽屋を設ける
今回の練習は主にdvdを知るために状態管理をしています.バックグラウンドに対しては高くないです.商品データを簡単に返します.
yarn add cors express
server
フォルダを新規作成し、express
で簡単なバックグランドを構築します.data/products.json
を作成し、json
形式の商品データ{
"products": [
{
"id": 12,
"bigImage":"http://localhost:3000/images/12064273040195392_1.jpg",
"smallImage": "http://localhost:3000/images/12064273040195392_2.jpg",
"sku": 12064273040195392,
"title": "Cat Tee Black T-Shirt",
"description": "4 MSL",
"availableSizes": ["S", "XS"],
"style": "Black with custom print",
"price": 10.9,
"installments": 9,
"currencyId": "USD",
"currencyFormat": "$",
"isFreeShipping": true
}
]
}
app.js
を新設し、const path = require('path');
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors());
const port = 3000;
app.get('/api/products', (req, res) => {
res.sendFile(path.join(__dirname, 'data', 'products.json'));
});
app.listen(port, () => {
console.log(`[products] API listening on port ${port}.`);
});
フロント開発
concurrently
パラレルコマンドを使用します.yarn add concurrently
package.json
"scripts": {
"start": "roadhog server",
"server": "nodemon server/app",
"build": "roadhog build",
"lint": "eslint --ext .js src test",
"precommit": "yarn run lint",
"dev": "concurrently \"yarn run server\" \"yarn run start\""
},
yarn run dev
コマンドを使って前後端を起動できます.http://localhost:8000
でsrc\routes\products\index.js
とindex.css
(dvaデフォルトサポートCSS Moduleモジュール化、connect()
方法が必要なら、dvdから導入する必要がある)import React, {Component} from 'react';
import { connect } from 'dva'; // connect()
// import { Badge, Icon } from 'antd'; antd
import styles from './index.css'; // css
class Products extends Component {
constructor(){
super();
}
render(){
return (
soooo many products!!!
);
}
};
// products namespace products model
const mapStateToProps = ({ products })=>{
return {
counts: products.counts
}
};
// react-redux connect
export default connect(mapStateToProps)(Products);
src/router.js
import React from 'react';
import { Router, Route, Switch } from 'dva/router';
import IndexPage from './routes/IndexPage';
import Products from './routes/products';
// hash
function RouterConfig({ history }) {
return (
);
}
export default RouterConfig;
src/utils/request.js
にfetch要求を実装してくれました.したがって、src/services/products.js
を新たに作って、バックグラウンドに商品データを要求する方法import request from '../utils/request';
export function fetch() {
return request('/api/products');
}
src/models/products.js
import * as productsService from '../services/products';
export default {
namespace: 'products',
state: {
list: [], //
},
reducers: {
save(state, { payload: { data: list } }) {
return { ...state, list };
}
},
effects: {
*fetch({}, { call, put }) {
const { data } = yield call(productsService.fetch);
yield put({
type: 'save',
payload: { data: data.products },
});
},
},
subscriptions: {
setup({ dispatch, history }) {
return history.listen(({ pathname }) => {
if (pathname === '/products') {
dispatch({ type: 'fetch' });
}
});
},
},
};
をここに来て、model層とservice層は簡単に構築されました.model
のsubscription
購読model
のsubscription
は、1つのモニターに相当し、ルーティングの変化、マウス、キーボードの変化、サーバの接続の変化、状態の変化などを傍受することができます.このようにすれば、異なる変化に応じて対応する処理ができます.だから、それなりの判断を加えながらsubsription
プラグインは実際の開発において、バックエンドに商品データを要求することがあるので、最初に商品データを入手することができないかもしれません.だから、データをロードする過程で、ユーザーに「ロード中です.」というヒントを与えます.dva-loading
プラグインは、このプロセスを簡略化してくれます.dva-loading
yarn add dva-loading
import createLoading from 'dva-loading';
app.use(createLoading());
const ProductsList = ({ list, loading }) => {
...
// loading true,false
// loading true false
// loading ,
}
export default connect(({ products, loading }) => ({
list: products.list,
// :products model namespace
loading: loading.models.products
}))(ProductsList);