金華網(wǎng)站建設(shè)外包百度定位店鋪位置怎么設(shè)置
公司的項(xiàng)目源碼用的是react和dva,所以我必須抓緊時(shí)間學(xué)習(xí)一下dva了,一天時(shí)間,看看我學(xué)到了什么(dva官網(wǎng)DvaJS)[這是很久之前就打算寫的了,一直沒時(shí)間,一直存著草稿,今天發(fā)出來吧]
1.介紹
dva 首先是一個(gè)基于?redux?和?redux-saga?的數(shù)據(jù)流方案,然后為了簡化開發(fā)體驗(yàn),dva 還額外內(nèi)置了?react-router?和?fetch,所以也可以理解為一個(gè)輕量級的應(yīng)用框架。【redux-saga】
2.安裝 dva-cli
通過 npm 安裝 dva-cli 并確保版本是?0.9.1
?或以上。
$ npm install dva-cli -g
$ dva -v
dva-cli version 0.9.1
3.?創(chuàng)建新應(yīng)用
dva new dva-quickstart
4.?通過 npm 安裝?antd
?和?babel-plugin-import
?。babel-plugin-import
?是用來按需加載antd 的腳本和樣式的
$ npm install antd babel-plugin-import --save
編輯?.webpackrc
,使?babel-plugin-import
?插件生效。
{
+ "extraBabelPlugins": [
+ ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]
+ ]
}
注:dva-cli 基于 roadhog 實(shí)現(xiàn) build 和 dev,
5.定義路由
新建 route component?routes/Products.js
,內(nèi)容如下:
import React from 'react';const Products = (props) => (<h2>List of Products</h2>
);export default Products;
添加路由信息到路由表,編輯?router.js
?:
+ import Products from './routes/Products';
...
+ <Route path="/products" exact component={Products} />
npm start 啟動(dòng)服務(wù)
在瀏覽器里打開 http://localhost:8000/#/products ,你應(yīng)該能看到前面定義的?<h2>
?標(biāo)簽
6.?編寫 UI Component
隨著應(yīng)用的發(fā)展,你會(huì)需要在多個(gè)頁面分享 UI 元素 (或在一個(gè)頁面使用多次),在 dva 里你可以把這部分抽成 component 。
我們來編寫一個(gè)?ProductList
?component,這樣就能在不同的地方顯示產(chǎn)品列表了。
新建?components/ProductList.js
?文件:
import React from 'react';
import PropTypes from 'prop-types';
import { Table, Popconfirm, Button } from 'antd';const ProductList = ({ onDelete, products }) => {const columns = [{title: 'Name',dataIndex: 'name',}, {title: 'Actions',render: (text, record) => {return (<Popconfirm title="Delete?" onConfirm={() => onDelete(record.id)}><Button>Delete</Button></Popconfirm>);},}];return (<TabledataSource={products}columns={columns}/>);
};ProductList.propTypes = {onDelete: PropTypes.func.isRequired,products: PropTypes.array.isRequired,
};export default ProductList;
7.?定義 Model
完成 UI 后,現(xiàn)在開始處理數(shù)據(jù)和邏輯。
dva 通過 model 的概念把一個(gè)領(lǐng)域的模型管理起來,包含同步更新 state 的 reducers,處理異步邏輯的 effects,訂閱數(shù)據(jù)源的 subscriptions 。
新建 model?models/products.js
?:
export default {namespace: 'products',state: [],reducers: {'delete'(state, { payload: id }) {return state.filter(item => item.id !== id);},},
};
這個(gè) model 里:
namespace
?表示在全局 state 上的 keystate
?是初始值,在這里是空數(shù)組reducers
?等同于 redux 里的 reducer,接收 action,同步更新 state
然后別忘記在?index.js
?里載入他:
// 3. Model
+ app.model(require('./models/products').default);
8.?connect 起來
到這里,我們已經(jīng)單獨(dú)完成了 model 和 component,那么他們?nèi)绾未?lián)起來呢?
dva 提供了 connect 方法。如果你熟悉 redux,這個(gè) connect 就是 react-redux 的 connect 。
編輯?routes/Products.js
,替換為以下內(nèi)容:
import React from 'react';
import { connect } from 'dva';
import ProductList from '../components/ProductList';const Products = ({ dispatch, products }) => {function handleDelete(id) {dispatch({type: 'products/delete',payload: id,});}return (<div><h2>List of Products</h2><ProductList onDelete={handleDelete} products={products} /></div>);
};// export default Products;
export default connect(({ products }) => ({products,
}))(Products);
最后,我們還需要一些初始數(shù)據(jù)讓這個(gè)應(yīng)用 run 起來。編輯?index.js
:
- const app = dva();
+ const app = dva({
+ initialState: {
+ products: [
+ { name: 'dva', id: 1 },
+ { name: 'antd', id: 2 },
+ ],
+ },
+ });
?9.打包
npm run build