Files
ant-design/docs/react/practical-projects-cn.html
T
2017-04-24 18:06:27 +08:00

223 lines
60 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="An enterprise-class UI design language and React-based implementation">
<meta name="description" content="A set of high-quality React components">
<meta name="description" content="One of best React UI library for enterprise background">
<title>Ant Design - A UI Design Language</title>
<script>
(function() {
function isLocalStorageNameSupported() {
var testKey = 'test';
var storage = window.localStorage;
try {
storage.setItem(testKey, '1');
storage.removeItem(testKey);
return true;
} catch (error) {
return false;
}
}
// 优先级提高到所有静态资源的前面,语言不对,加载其他静态资源没意义
var pathname = location.pathname;
function isZhCN(pathname) {
return /-cn\/?$/.test(pathname);
}
function getLocalizedPathname(path, zhCN) {
var pathname = path.startsWith('/') ? path : '/' + path;
if (!zhCN) { // to enUS
return /\/?index-cn/.test(pathname) ? '/' : pathname.replace('-cn', '');
} else if (pathname === '/') {
return '/index-cn';
} else if (pathname.endsWith('/')) {
return pathname.replace(/\/$/, '-cn/');
}
return pathname + '-cn';
}
// 兼容旧的 URL `?locale=...`
var queryString = location.search;
if (queryString) {
var isZhCNConfig = queryString.indexOf('zh-CN') > -1;
if (isZhCNConfig && !isZhCN(pathname)) {
location.pathname = getLocalizedPathname(pathname, isZhCNConfig)
}
}
// 首页无视链接里面的语言设置 https://github.com/ant-design/ant-design/issues/4552
if (isLocalStorageNameSupported() && (pathname === '/' || pathname === '/index-cn')) {
var lang = (window.localStorage && localStorage.getItem('locale')) || (navigator.language.toLowerCase() === 'zh-cn' ? 'zh-CN' : 'en-US');
// safari is 'zh-cn', while other browser is 'zh-CN';
if ((lang === 'zh-CN') !== isZhCN(pathname)) {
location.pathname = getLocalizedPathname(pathname, lang === 'zh-CN');
}
}
document.documentElement.className += isZhCN(pathname) ? 'zh-cn' : 'en-us';
})()
</script>
<link rel="icon" href="https://t.alipayobjects.com/images/T1QUBfXo4fXXXXXXXX.png" type="image/x-icon">
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.cnpmjs.org/css?family=Lato:400,700|Raleway"/>
<link rel="stylesheet" type="text/css" href="/index-1.css"/>
<link rel="stylesheet" type="text/css" href="/index-2.css"/>
<style id="nprogress-style">
#nprogress { display: none }
</style>
<!--[if lte IE 10]>
<script
src="https://as.alipayobjects.com/g/component/??console-polyfill/0.2.2/index.js,media-match/2.0.2/media.match.min.js"></script>
<![endif]-->
<script>
if (!window.Intl) {
document.writeln('<script src="https://as.alipayobjects.com/g/component/intl/1.0.1/??Intl.js,locale-data/jsonp/en.js,locale-data/jsonp/zh.js">' + '<' + '/script>');
}
if (!window.Promise) {
document.writeln('<script src="https://as.alipayobjects.com/g/component/es6-promise/3.2.2/es6-promise.min.js"' + '>' + '<' + '/' + 'script>');
}
// Enable Google Analytics
if (!location.port) {
/* eslint-disable */
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-72788897-1', 'auto');
ga('send', 'pageview');
/* eslint-enable */
}
</script>
<!-- Hotjar Tracking Code for ant.design -->
<script>
(function(h,o,t,j,a,r){
h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
h._hjSettings={hjid:473408,hjsv:5};
a=o.getElementsByTagName('head')[0];
r=o.createElement('script');r.async=1;
r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
a.appendChild(r);
})(window,document,'//static.hotjar.com/c/hotjar-','.js?sv=');
</script>
</head>
<body>
<div id="react-content">
<div class="page-wrapper" data-reactroot="" data-reactid="1" data-react-checksum="857814740"><header id="header" class="clearfix" data-reactid="2"><div class="ant-row" data-reactid="3"><div class="ant-col-xs-24 ant-col-sm-24 ant-col-md-5 ant-col-lg-4" data-reactid="4"><a id="logo" href="/index-cn" data-reactid="5"><img alt="logo" src="https://t.alipayobjects.com/images/rmsweb/T1B9hfXcdvXXXXXXXX.svg" data-reactid="6"/><span data-reactid="7">Ant Design</span></a></div><div class="ant-col-xs-0 ant-col-sm-0 ant-col-md-19 ant-col-lg-20" data-reactid="8"><div id="search-box" data-reactid="9"><div class="ant-select ant-select-combobox ant-select-enabled" data-reactid="10"><div class="ant-select-selection
ant-select-selection--single" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false" data-reactid="11"><div class="ant-select-selection__rendered" data-reactid="12"><div style="display:block;user-select:none;-webkit-user-select:none;" unselectable="unselectable" class="ant-select-selection__placeholder" data-reactid="13">搜索组件...</div><ul data-reactid="14"><li class="ant-select-search ant-select-search--inline" data-reactid="15"><div class="ant-select-search__field__wrap" data-reactid="16"><input value="" class="ant-select-search__field" data-reactid="17"/><span class="ant-select-search__field__mirror" data-reactid="18"><!-- react-text: 19 --><!-- /react-text --><!-- react-text: 20 --> <!-- /react-text --></span></div></li></ul></div><span class="ant-select-arrow" style="user-select:none;-webkit-user-select:none;" unselectable="unselectable" data-reactid="21"><b data-reactid="22"></b></span></div></div></div><button type="button" class="ant-btn ant-btn-ghost ant-btn-sm lang" data-reactid="23"><span data-reactid="24">EN</span></button><div class="ant-select-sm version ant-select ant-select-enabled" data-reactid="25"><div class="ant-select-selection
ant-select-selection--single" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false" tabindex="0" data-reactid="26"><div class="ant-select-selection__rendered" data-reactid="27"><div class="ant-select-selection-selected-value" title="2.9.3" style="display:block;opacity:1;" data-reactid="28">2.9.3</div></div><span class="ant-select-arrow" style="user-select:none;-webkit-user-select:none;" unselectable="unselectable" data-reactid="29"><b data-reactid="30"></b></span></div></div><ul class="ant-menu ant-menu-horizontal ant-menu-light ant-menu-root" role="menu" aria-activedescendant="" id="nav" tabindex="0" data-reactid="31"><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="32"><a href="/index-cn" data-reactid="33"><span data-reactid="34">首页</span></a></li><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="35"><a href="/docs/spec/introduce-cn" data-reactid="36"><span data-reactid="37">指引</span></a></li><li class="ant-menu-item-selected ant-menu-item" role="menuitem" aria-selected="true" data-reactid="38"><a href="/docs/react/introduce-cn" data-reactid="39"><span data-reactid="40">组件</span></a></li><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="41"><a href="/docs/pattern/navigation-cn" data-reactid="42"><span data-reactid="43">模式</span></a></li><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="44"><a href="/docs/resource/download-cn" data-reactid="45"><span data-reactid="46">资源</span></a></li></ul></div></div></header><div class="main-wrapper" data-reactid="47"><div class="ant-row" data-reactid="48"><div class="ant-col-xs-24 ant-col-sm-24 ant-col-md-6 ant-col-lg-4" data-reactid="49"><ul class="ant-menu ant-menu-inline aside-container ant-menu-light ant-menu-root" role="menu" aria-activedescendant="" tabindex="0" data-reactid="50"><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="51"><a href="/docs/react/introduce-cn" data-reactid="52">Ant Design of React</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="53"><a href="/docs/react/getting-started-cn" data-reactid="54">快速上手</a></li><li style="padding-left:24px;" class="ant-menu-item-selected ant-menu-item" role="menuitem" aria-selected="true" data-reactid="55"><a href="/docs/react/practical-projects-cn" data-reactid="56">项目实战</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="57"><a href="/docs/react/use-with-create-react-app-cn" data-reactid="58">在 create-react-app 中使用</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="59"><a href="/docs/react/customize-theme-cn" data-reactid="60">定制主题</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="61"><a href="/changelog-cn" data-reactid="62">更新日志</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="63"><a href="/docs/react/recommendation-cn" data-reactid="64">社区精选组件</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="65"><a href="/docs/react/i18n-cn" data-reactid="66">国际化</a></li><li class="ant-menu-submenu-inline ant-menu-submenu-open ant-menu-submenu" data-reactid="67"><div style="padding-left:24px;" class="ant-menu-submenu-title" aria-expanded="true" aria-owns="Components$Menu" aria-haspopup="true" data-reactid="68"><h4 data-reactid="69">Components</h4></div><ul class="ant-menu ant-menu-inline ant-menu-sub" role="menu" aria-activedescendant="" id="Components$Menu" data-reactid="70"><li class=" ant-menu-item-group" data-reactid="71"><div class="ant-menu-item-group-title" data-reactid="72">General</div><ul class="ant-menu-item-group-list" data-reactid="73"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="74"><a href="/components/button-cn/" data-reactid="75"><span data-reactid="76">Button</span><span class="chinese" data-reactid="77">按钮</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="78"><a href="/components/icon-cn/" data-reactid="79"><span data-reactid="80">Icon</span><span class="chinese" data-reactid="81">图标</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="82"><div class="ant-menu-item-group-title" data-reactid="83">Layout</div><ul class="ant-menu-item-group-list" data-reactid="84"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="85"><a href="/components/grid-cn/" data-reactid="86"><span data-reactid="87">Grid</span><span class="chinese" data-reactid="88">栅格</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="89"><a href="/components/layout-cn/" data-reactid="90"><span data-reactid="91">Layout</span><span class="chinese" data-reactid="92">布局</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="93"><div class="ant-menu-item-group-title" data-reactid="94">Navigation</div><ul class="ant-menu-item-group-list" data-reactid="95"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="96"><a href="/components/affix-cn/" data-reactid="97"><span data-reactid="98">Affix</span><span class="chinese" data-reactid="99">固钉</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="100"><a href="/components/breadcrumb-cn/" data-reactid="101"><span data-reactid="102">Breadcrumb</span><span class="chinese" data-reactid="103">面包屑</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="104"><a href="/components/back-top-cn/" data-reactid="105"><span data-reactid="106">BackTop</span><span class="chinese" data-reactid="107">回到顶部</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="108"><a href="/components/dropdown-cn/" data-reactid="109"><span data-reactid="110">Dropdown</span><span class="chinese" data-reactid="111">下拉菜单</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="112"><a href="/components/menu-cn/" data-reactid="113"><span data-reactid="114">Menu</span><span class="chinese" data-reactid="115">导航菜单</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="116"><a href="/components/pagination-cn/" data-reactid="117"><span data-reactid="118">Pagination</span><span class="chinese" data-reactid="119">分页</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="120"><a href="/components/steps-cn/" data-reactid="121"><span data-reactid="122">Steps</span><span class="chinese" data-reactid="123">步骤条</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="124"><a href="/components/tabs-cn/" data-reactid="125"><span data-reactid="126">Tabs</span><span class="chinese" data-reactid="127">标签页</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="128"><div class="ant-menu-item-group-title" data-reactid="129">Data Entry</div><ul class="ant-menu-item-group-list" data-reactid="130"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="131"><a href="/components/auto-complete-cn/" data-reactid="132"><span data-reactid="133">AutoComplete</span><span class="chinese" data-reactid="134">自动完成</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="135"><a href="/components/cascader-cn/" data-reactid="136"><span data-reactid="137">Cascader</span><span class="chinese" data-reactid="138">级联选择</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="139"><a href="/components/checkbox-cn/" data-reactid="140"><span data-reactid="141">Checkbox</span><span class="chinese" data-reactid="142">多选框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="143"><a href="/components/date-picker-cn/" data-reactid="144"><span data-reactid="145">DatePicker</span><span class="chinese" data-reactid="146">日期选择框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="147"><a href="/components/form-cn/" data-reactid="148"><span data-reactid="149">Form</span><span class="chinese" data-reactid="150">表单</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="151"><a href="/components/input-number-cn/" data-reactid="152"><span data-reactid="153">InputNumber</span><span class="chinese" data-reactid="154">数字输入框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="155"><a href="/components/input-cn/" data-reactid="156"><span data-reactid="157">Input</span><span class="chinese" data-reactid="158">输入框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="159"><a href="/components/mention-cn/" data-reactid="160"><span data-reactid="161">Mention</span><span class="chinese" data-reactid="162">提及</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="163"><a href="/components/rate-cn/" data-reactid="164"><span data-reactid="165">Rate</span><span class="chinese" data-reactid="166">评分</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="167"><a href="/components/radio-cn/" data-reactid="168"><span data-reactid="169">Radio</span><span class="chinese" data-reactid="170">单选框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="171"><a href="/components/select-cn/" data-reactid="172"><span data-reactid="173">Select</span><span class="chinese" data-reactid="174">选择器</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="175"><a href="/components/slider-cn/" data-reactid="176"><span data-reactid="177">Slider</span><span class="chinese" data-reactid="178">滑动输入条</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="179"><a href="/components/switch-cn/" data-reactid="180"><span data-reactid="181">Switch</span><span class="chinese" data-reactid="182">开关</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="183"><a href="/components/tree-select-cn/" data-reactid="184"><span data-reactid="185">TreeSelect</span><span class="chinese" data-reactid="186">树选择</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="187"><a href="/components/time-picker-cn/" data-reactid="188"><span data-reactid="189">TimePicker</span><span class="chinese" data-reactid="190">时间选择框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="191"><a href="/components/transfer-cn/" data-reactid="192"><span data-reactid="193">Transfer</span><span class="chinese" data-reactid="194">穿梭框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="195"><a href="/components/upload-cn/" data-reactid="196"><span data-reactid="197">Upload</span><span class="chinese" data-reactid="198">上传</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="199"><div class="ant-menu-item-group-title" data-reactid="200">Data Display</div><ul class="ant-menu-item-group-list" data-reactid="201"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="202"><a href="/components/badge-cn/" data-reactid="203"><span data-reactid="204">Badge</span><span class="chinese" data-reactid="205">徽标数</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="206"><a href="/components/calendar-cn/" data-reactid="207"><span data-reactid="208">Calendar</span><span class="chinese" data-reactid="209">日历</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="210"><a href="/components/card-cn/" data-reactid="211"><span data-reactid="212">Card</span><span class="chinese" data-reactid="213">卡片</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="214"><a href="/components/carousel-cn/" data-reactid="215"><span data-reactid="216">Carousel</span><span class="chinese" data-reactid="217">走马灯</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="218"><a href="/components/collapse-cn/" data-reactid="219"><span data-reactid="220">Collapse</span><span class="chinese" data-reactid="221">折叠面板</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="222"><a href="/components/popover-cn/" data-reactid="223"><span data-reactid="224">Popover</span><span class="chinese" data-reactid="225">气泡卡片</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="226"><a href="/components/tooltip-cn/" data-reactid="227"><span data-reactid="228">Tooltip</span><span class="chinese" data-reactid="229">文字提示</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="230"><a href="/components/table-cn/" data-reactid="231"><span data-reactid="232">Table</span><span class="chinese" data-reactid="233">表格</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="234"><a href="/components/tag-cn/" data-reactid="235"><span data-reactid="236">Tag</span><span class="chinese" data-reactid="237">标签</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="238"><a href="/components/timeline-cn/" data-reactid="239"><span data-reactid="240">Timeline</span><span class="chinese" data-reactid="241">时间轴</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="242"><a href="/components/tree-cn/" data-reactid="243"><span data-reactid="244">Tree</span><span class="chinese" data-reactid="245">树形控件</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="246"><div class="ant-menu-item-group-title" data-reactid="247">Feedback</div><ul class="ant-menu-item-group-list" data-reactid="248"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="249"><a href="/components/alert-cn/" data-reactid="250"><span data-reactid="251">Alert</span><span class="chinese" data-reactid="252">警告提示</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="253"><a href="/components/modal-cn/" data-reactid="254"><span data-reactid="255">Modal</span><span class="chinese" data-reactid="256">对话框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="257"><a href="/components/message-cn/" data-reactid="258"><span data-reactid="259">Message</span><span class="chinese" data-reactid="260">全局提示</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="261"><a href="/components/notification-cn/" data-reactid="262"><span data-reactid="263">Notification</span><span class="chinese" data-reactid="264">通知提醒框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="265"><a href="/components/progress-cn/" data-reactid="266"><span data-reactid="267">Progress</span><span class="chinese" data-reactid="268">进度条</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="269"><a href="/components/popconfirm-cn/" data-reactid="270"><span data-reactid="271">Popconfirm</span><span class="chinese" data-reactid="272">气泡确认框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="273"><a href="/components/spin-cn/" data-reactid="274"><span data-reactid="275">Spin</span><span class="chinese" data-reactid="276">加载中</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="277"><div class="ant-menu-item-group-title" data-reactid="278">Other</div><ul class="ant-menu-item-group-list" data-reactid="279"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="280"><a href="/components/anchor-cn/" data-reactid="281"><span data-reactid="282">Anchor</span><span class="chinese" data-reactid="283">锚点</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="284"><a href="/components/locale-provider-cn/" data-reactid="285"><span data-reactid="286">LocaleProvider</span><span class="chinese" data-reactid="287">国际化</span></a></li></ul></li></ul></li></ul></div><div class="main-container ant-col-xs-24 ant-col-sm-24 ant-col-md-18 ant-col-lg-20" data-reactid="288"><article class="markdown" data-reactid="289"><h1 data-reactid="290"><!-- react-text: 291 -->项目实战<!-- /react-text --><a class="edit-button" href="https://github.com/ant-design/ant-design/edit/master/docs/react/practical-projects.zh-CN.md" data-reactid="292"><i class="anticon anticon-edit" data-reactid="293"></i></a></h1><section class="markdown" data-reactid="294"><p data-reactid="295"><a href="https://github.com/dvajs/dva" data-reactid="296"><!-- react-text: 297 -->dva<!-- /react-text --></a><!-- react-text: 298 --> 是一个基于 react 和 redux 的轻量应用框架,概念来自 elm,支持 side effects、热替换、动态加载、react-native、SSR 等,已在生产环境广泛应用。<!-- /react-text --></p><p data-reactid="299"><!-- react-text: 300 -->本文会引导你使用 dva 和 antd 从 0 开始创建一个简单应用。<!-- /react-text --></p><p data-reactid="301"><!-- react-text: 302 -->会包含以下内容:<!-- /react-text --></p></section><section class="toc" data-reactid="303"><ul data-reactid="304"><li data-reactid="305"><a class="bisheng-toc-h2" href="#安装-dva-cli" title="安装 dva-cli" data-reactid="306"><!-- react-text: 307 -->安装 dva-cli<!-- /react-text --></a></li><li data-reactid="308"><a class="bisheng-toc-h2" href="#创建新应用" title="创建新应用" data-reactid="309"><!-- react-text: 310 -->创建新应用<!-- /react-text --></a></li><li data-reactid="311"><a class="bisheng-toc-h2" href="#使用-antd" title="使用 antd" data-reactid="312"><!-- react-text: 313 -->使用 antd<!-- /react-text --></a></li><li data-reactid="314"><a class="bisheng-toc-h2" href="#定义路由" title="定义路由" data-reactid="315"><!-- react-text: 316 -->定义路由<!-- /react-text --></a></li><li data-reactid="317"><a class="bisheng-toc-h2" href="#编写-UI-Component" title="编写 UI Component" data-reactid="318"><!-- react-text: 319 -->编写 UI Component<!-- /react-text --></a></li><li data-reactid="320"><a class="bisheng-toc-h2" href="#定义-Model" title="定义 Model" data-reactid="321"><!-- react-text: 322 -->定义 Model<!-- /react-text --></a></li><li data-reactid="323"><a class="bisheng-toc-h2" href="#connect-起来" title="connect 起来" data-reactid="324"><!-- react-text: 325 -->connect 起来<!-- /react-text --></a></li><li data-reactid="326"><a class="bisheng-toc-h2" href="#构建应用" title="构建应用" data-reactid="327"><!-- react-text: 328 -->构建应用<!-- /react-text --></a></li><li data-reactid="329"><a class="bisheng-toc-h2" href="#下一步" title="下一步" data-reactid="330"><!-- react-text: 331 -->下一步<!-- /react-text --></a></li></ul></section><section class="markdown" data-reactid="332"><h2 id="安装-dva-cli" data-reactid="333"><span data-reactid="334"><!-- react-text: 335 -->安装 dva-cli<!-- /react-text --></span><a href="#安装-dva-cli" class="anchor" data-reactid="336">#</a></h2><p data-reactid="337"><!-- react-text: 338 -->通过 npm 安装 dva-cli 并确保版本是 <!-- /react-text --><code data-reactid="339"><!-- react-text: 340 -->0.7.0<!-- /react-text --></code><!-- react-text: 341 --> 或以上。<!-- /react-text --></p><pre class="language-bash" data-reactid="342"><code data-reactid="343">$ <span class="token function">npm</span> <span class="token function">install</span> dva-cli -g
$ dva -v
0.7.0</code></pre><h2 id="创建新应用" data-reactid="344"><span data-reactid="345"><!-- react-text: 346 -->创建新应用<!-- /react-text --></span><a href="#创建新应用" class="anchor" data-reactid="347">#</a></h2><p data-reactid="348"><!-- react-text: 349 -->安装完 dva-cli 之后,就可以在命令行里访问到 <!-- /react-text --><code data-reactid="350"><!-- react-text: 351 -->dva<!-- /react-text --></code><!-- react-text: 352 --> 命令(<!-- /react-text --><a href="http://stackoverflow.com/questions/15054388/global-node-modules-not-installing-correctly-command-not-found" data-reactid="353"><!-- react-text: 354 -->不能访问?<!-- /react-text --></a><!-- react-text: 355 -->)。现在,你可以通过 <!-- /react-text --><code data-reactid="356"><!-- react-text: 357 -->dva new<!-- /react-text --></code><!-- react-text: 358 --> 创建新应用。<!-- /react-text --></p><pre class="language-bash" data-reactid="359"><code data-reactid="360">$ dva new dva-quickstart</code></pre><p data-reactid="361"><!-- react-text: 362 -->这会创建 <!-- /react-text --><code data-reactid="363"><!-- react-text: 364 -->dva-quickstart<!-- /react-text --></code><!-- react-text: 365 --> 目录,包含项目初始化目录和文件,并提供开发服务器、构建脚本、数据 mock 服务、代理服务器等功能。<!-- /react-text --></p><p data-reactid="366"><!-- react-text: 367 -->然后我们 <!-- /react-text --><code data-reactid="368"><!-- react-text: 369 -->cd<!-- /react-text --></code><!-- react-text: 370 --> 进入 <!-- /react-text --><code data-reactid="371"><!-- react-text: 372 -->dva-quickstart<!-- /react-text --></code><!-- react-text: 373 --> 目录,并启动开发服务器:<!-- /react-text --></p><pre class="language-bash" data-reactid="374"><code data-reactid="375">$ <span class="token function">cd</span> dva-quickstart
$ <span class="token function">npm</span> start</code></pre><p data-reactid="376"><!-- react-text: 377 -->几秒钟后,你会看到以下输出:<!-- /react-text --></p><pre class="language-bash" data-reactid="378"><code data-reactid="379">Compiled successfully<span class="token operator">!</span>
The app is running at:
http://localhost:8000/
Note that the development build is not optimized.
To create a production build, use <span class="token function">npm</span> run build.</code></pre><p data-reactid="380"><!-- react-text: 381 -->在浏览器里打开 <!-- /react-text --><a href="http://localhost:8000" data-reactid="382"><!-- react-text: 383 -->http://localhost:8000<!-- /react-text --></a><!-- react-text: 384 --> ,你会看到 dva 的欢迎界面。<!-- /react-text --></p><h2 id="使用-antd" data-reactid="385"><span data-reactid="386"><!-- react-text: 387 -->使用 antd<!-- /react-text --></span><a href="#使用-antd" class="anchor" data-reactid="388">#</a></h2><p data-reactid="389"><!-- react-text: 390 -->通过 npm 安装 <!-- /react-text --><code data-reactid="391"><!-- react-text: 392 -->antd<!-- /react-text --></code><!-- react-text: 393 --><!-- /react-text --><code data-reactid="394"><!-- react-text: 395 -->babel-plugin-import<!-- /react-text --></code><!-- react-text: 396 --><!-- /react-text --><code data-reactid="397"><!-- react-text: 398 -->babel-plugin-import<!-- /react-text --></code><!-- react-text: 399 --> 是用来按需加载 antd 的脚本和样式的,详见 <!-- /react-text --><a href="https://github.com/ant-design/babel-plugin-import" data-reactid="400"><!-- react-text: 401 -->repo<!-- /react-text --></a><!-- react-text: 402 --><!-- /react-text --></p><pre class="language-bash" data-reactid="403"><code data-reactid="404">$ <span class="token function">npm</span> <span class="token function">install</span> antd babel-plugin-import --save</code></pre><p data-reactid="405"><!-- react-text: 406 -->编辑 <!-- /react-text --><code data-reactid="407"><!-- react-text: 408 -->.roadhogrc<!-- /react-text --></code><!-- react-text: 409 -->,使 <!-- /react-text --><code data-reactid="410"><!-- react-text: 411 -->babel-plugin-import<!-- /react-text --></code><!-- react-text: 412 --> 插件生效。<!-- /react-text --></p><pre class="language-diff" data-reactid="413"><code data-reactid="414"> "extraBabelPlugins": [
<span class="token deleted">- "transform-runtime"</span>
<span class="token inserted">+ "transform-runtime",</span>
<span class="token inserted">+ ["import", { "libraryName": "antd", "style": "css" }]</span>
],</code></pre><blockquote data-reactid="415"><p data-reactid="416"><!-- react-text: 417 -->注:dva-cli 基于 roadhog 实现 build 和 server,更多 <!-- /react-text --><code data-reactid="418"><!-- react-text: 419 -->.roadhogrc<!-- /react-text --></code><!-- react-text: 420 --> 的配置详见 <!-- /react-text --><a href="https://github.com/sorrycc/roadhog#配置" data-reactid="421"><!-- react-text: 422 -->roadhog#配置<!-- /react-text --></a></p></blockquote><h2 id="定义路由" data-reactid="423"><span data-reactid="424"><!-- react-text: 425 -->定义路由<!-- /react-text --></span><a href="#定义路由" class="anchor" data-reactid="426">#</a></h2><p data-reactid="427"><!-- react-text: 428 -->我们要写个应用来先显示产品列表。首先第一步是创建路由,路由可以想象成是组成应用的不同页面。<!-- /react-text --></p><p data-reactid="429"><!-- react-text: 430 -->新建 route component <!-- /react-text --><code data-reactid="431"><!-- react-text: 432 -->routes/Products.js<!-- /react-text --></code><!-- react-text: 433 -->,内容如下:<!-- /react-text --></p><pre class="language-javascript" data-reactid="434"><code data-reactid="435"><span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> Products <span class="token operator">=</span> <span class="token punctuation">(</span>props<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span>
<span class="token operator">&lt;</span>h2<span class="token operator">></span>List <span class="token keyword">of</span> Products<span class="token operator">&lt;</span><span class="token operator">/</span>h2<span class="token operator">></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> Products<span class="token punctuation">;</span></code></pre><p data-reactid="436"><!-- react-text: 437 -->添加路由信息到路由表,编辑 <!-- /react-text --><code data-reactid="438"><!-- react-text: 439 -->router.js<!-- /react-text --></code><!-- react-text: 440 --> :<!-- /react-text --></p><pre class="language-diff" data-reactid="441"><code data-reactid="442"><span class="token inserted">+ import Products from './routes/Products';</span>
...
<span class="token inserted">+ &lt;Route path="/products" component={Products} /></span></code></pre><p data-reactid="443"><!-- react-text: 444 -->然后在浏览器里打开 <!-- /react-text --><a href="http://localhost:8000/#/products" data-reactid="445"><!-- react-text: 446 -->http://localhost:8000/#/products<!-- /react-text --></a><!-- react-text: 447 --> ,你应该能看到前面定义的 <!-- /react-text --><code data-reactid="448"><!-- react-text: 449 -->&lt;h2&gt;<!-- /react-text --></code><!-- react-text: 450 --> 标签。<!-- /react-text --></p><h2 id="编写-UI-Component" data-reactid="451"><span data-reactid="452"><!-- react-text: 453 -->编写 UI Component<!-- /react-text --></span><a href="#编写-UI-Component" class="anchor" data-reactid="454">#</a></h2><p data-reactid="455"><!-- react-text: 456 -->随着应用的发展,你会需要在多个页面分享 UI 元素 (或在一个页面使用多次),在 dva 里你可以把这部分抽成 component 。<!-- /react-text --></p><p data-reactid="457"><!-- react-text: 458 -->我们来编写一个 <!-- /react-text --><code data-reactid="459"><!-- react-text: 460 -->ProductList<!-- /react-text --></code><!-- react-text: 461 --> component,这样就能在不同的地方显示产品列表了。<!-- /react-text --></p><p data-reactid="462"><!-- react-text: 463 -->新建 <!-- /react-text --><code data-reactid="464"><!-- react-text: 465 -->components/ProductList.js<!-- /react-text --></code><!-- react-text: 466 --> 文件:<!-- /react-text --></p><pre class="language-javascript" data-reactid="467"><code data-reactid="468"><span class="token keyword">import</span> React<span class="token punctuation">,</span> <span class="token punctuation">{</span> PropTypes <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Table<span class="token punctuation">,</span> Popconfirm<span class="token punctuation">,</span> Button <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'antd'</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> ProductList <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">{</span> onDelete<span class="token punctuation">,</span> products <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> columns <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">{</span>
title<span class="token punctuation">:</span> <span class="token string">'Name'</span><span class="token punctuation">,</span>
dataIndex<span class="token punctuation">:</span> <span class="token string">'name'</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
title<span class="token punctuation">:</span> <span class="token string">'Actions'</span><span class="token punctuation">,</span>
render<span class="token punctuation">:</span> <span class="token punctuation">(</span>text<span class="token punctuation">,</span> record<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator">&lt;</span>Popconfirm title<span class="token operator">=</span><span class="token string">"Delete?"</span> onConfirm<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">onDelete</span><span class="token punctuation">(</span>record<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token operator">></span>
<span class="token operator">&lt;</span>Button<span class="token operator">></span>Delete<span class="token operator">&lt;</span><span class="token operator">/</span>Button<span class="token operator">></span>
<span class="token operator">&lt;</span><span class="token operator">/</span>Popconfirm<span class="token operator">></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator">&lt;</span>Table
dataSource<span class="token operator">=</span><span class="token punctuation">{</span>products<span class="token punctuation">}</span>
columns<span class="token operator">=</span><span class="token punctuation">{</span>columns<span class="token punctuation">}</span>
<span class="token operator">/</span><span class="token operator">></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
ProductList<span class="token punctuation">.</span>propTypes <span class="token operator">=</span> <span class="token punctuation">{</span>
onDelete<span class="token punctuation">:</span> PropTypes<span class="token punctuation">.</span>func<span class="token punctuation">.</span>isRequired<span class="token punctuation">,</span>
products<span class="token punctuation">:</span> PropTypes<span class="token punctuation">.</span>array<span class="token punctuation">.</span>isRequired<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> ProductList<span class="token punctuation">;</span></code></pre><h2 id="定义-Model" data-reactid="469"><span data-reactid="470"><!-- react-text: 471 -->定义 Model<!-- /react-text --></span><a href="#定义-Model" class="anchor" data-reactid="472">#</a></h2><p data-reactid="473"><!-- react-text: 474 -->完成 UI 后,现在开始处理数据和逻辑。<!-- /react-text --></p><p data-reactid="475"><!-- react-text: 476 -->dva 通过 model 的概念把一个领域的模型管理起来,包含同步更新 state 的 reducers,处理异步逻辑的 effects,订阅数据源的 subscriptions 。<!-- /react-text --></p><p data-reactid="477"><!-- react-text: 478 -->新建 model <!-- /react-text --><code data-reactid="479"><!-- react-text: 480 -->models/products.js<!-- /react-text --></code><!-- react-text: 481 --> <!-- /react-text --></p><pre class="language-javascript" data-reactid="482"><code data-reactid="483"><span class="token keyword">import</span> dva <span class="token keyword">from</span> <span class="token string">'dva'</span><span class="token punctuation">;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
namespace<span class="token punctuation">:</span> <span class="token string">'products'</span><span class="token punctuation">,</span>
state<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
reducers<span class="token punctuation">:</span> <span class="token punctuation">{</span>
<span class="token string">'delete'</span><span class="token punctuation">(</span>state<span class="token punctuation">,</span> <span class="token punctuation">{</span> payload<span class="token punctuation">:</span> id <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> state<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>item <span class="token operator">=</span><span class="token operator">></span> item<span class="token punctuation">.</span>id <span class="token operator">!==</span> id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre><p data-reactid="484"><!-- react-text: 485 -->这个 model 里:<!-- /react-text --></p><ul data-reactid="486"><li data-reactid="487"><p data-reactid="488"><code data-reactid="489"><!-- react-text: 490 -->namespace<!-- /react-text --></code><!-- react-text: 491 --> 表示在全局 state 上的 key<!-- /react-text --></p></li><li data-reactid="492"><p data-reactid="493"><code data-reactid="494"><!-- react-text: 495 -->state<!-- /react-text --></code><!-- react-text: 496 --> 是初始值,在这里是空数组<!-- /react-text --></p></li><li data-reactid="497"><p data-reactid="498"><code data-reactid="499"><!-- react-text: 500 -->reducers<!-- /react-text --></code><!-- react-text: 501 --> 等同于 redux 里的 reducer,接收 action,同步更新 state<!-- /react-text --></p></li></ul><p data-reactid="502"><!-- react-text: 503 -->然后别忘记在 <!-- /react-text --><code data-reactid="504"><!-- react-text: 505 -->index.js<!-- /react-text --></code><!-- react-text: 506 --> 里载入他:<!-- /react-text --></p><pre class="language-diff" data-reactid="507"><code data-reactid="508">// 3. Model
<span class="token inserted">+ app.model(require('./models/products'));</span></code></pre><h2 id="connect-起来" data-reactid="509"><span data-reactid="510"><!-- react-text: 511 -->connect 起来<!-- /react-text --></span><a href="#connect-起来" class="anchor" data-reactid="512">#</a></h2><p data-reactid="513"><!-- react-text: 514 -->到这里,我们已经单独完成了 model 和 component,那么他们如何串联起来呢?<!-- /react-text --></p><p data-reactid="515"><!-- react-text: 516 -->dva 提供了 connect 方法。如果你熟悉 redux,这个 connect 就是 react-redux 的 connect 。<!-- /react-text --></p><p data-reactid="517"><!-- react-text: 518 -->编辑 <!-- /react-text --><code data-reactid="519"><!-- react-text: 520 -->routes/Products.js<!-- /react-text --></code><!-- react-text: 521 -->,替换为以下内容:<!-- /react-text --></p><pre class="language-javascript" data-reactid="522"><code data-reactid="523"><span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> connect <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'dva'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> ProductList <span class="token keyword">from</span> <span class="token string">'../components/ProductList'</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> Products <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">{</span> dispatch<span class="token punctuation">,</span> products <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
<span class="token keyword">function</span> <span class="token function">handleDelete</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
type<span class="token punctuation">:</span> <span class="token string">'products/delete'</span><span class="token punctuation">,</span>
payload<span class="token punctuation">:</span> id<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator">&lt;</span>div<span class="token operator">></span>
<span class="token operator">&lt;</span>h2<span class="token operator">></span>List <span class="token keyword">of</span> Products<span class="token operator">&lt;</span><span class="token operator">/</span>h2<span class="token operator">></span>
<span class="token operator">&lt;</span>ProductList onDelete<span class="token operator">=</span><span class="token punctuation">{</span>handleDelete<span class="token punctuation">}</span> products<span class="token operator">=</span><span class="token punctuation">{</span>products<span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">></span>
<span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">// export default Products;</span>
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">connect</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">{</span> products <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token punctuation">{</span>
products<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">(</span>Products<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p data-reactid="524"><!-- react-text: 525 -->最后,我们还需要一些初始数据让这个应用 run 起来。编辑 <!-- /react-text --><code data-reactid="526"><!-- react-text: 527 -->index.js<!-- /react-text --></code><!-- react-text: 528 --><!-- /react-text --></p><pre class="language-diff" data-reactid="529"><code data-reactid="530"><span class="token deleted">- const app = dva();</span>
<span class="token inserted">+ const app = dva({</span>
<span class="token inserted">+ initialState: {</span>
<span class="token inserted">+ products: [</span>
<span class="token inserted">+ { name: 'dva', id: 1 },</span>
<span class="token inserted">+ { name: 'antd', id: 2 },</span>
<span class="token inserted">+ ],</span>
<span class="token inserted">+ },</span>
<span class="token inserted">+ });</span></code></pre><p data-reactid="531"><!-- react-text: 532 -->刷新浏览器,应该能看到以下效果:<!-- /react-text --></p><p style="text-align:center;" data-reactid="533"><img src="https://zos.alipayobjects.com/rmsportal/GQJeDDeUCSTRMMg.gif" data-reactid="534"/></p><h2 id="构建应用" data-reactid="535"><span data-reactid="536"><!-- react-text: 537 -->构建应用<!-- /react-text --></span><a href="#构建应用" class="anchor" data-reactid="538">#</a></h2><p data-reactid="539"><!-- react-text: 540 -->完成开发并且在开发环境验证之后,就需要部署给我们的用户了。先执行下面的命令:<!-- /react-text --></p><pre class="language-bash" data-reactid="541"><code data-reactid="542">$ <span class="token function">npm</span> run build</code></pre><p data-reactid="543"><!-- react-text: 544 -->几秒后,输出应该如下:<!-- /react-text --></p><pre class="language-bash" data-reactid="545"><code data-reactid="546"><span class="token operator">></span> @ build /private/tmp/myapp
<span class="token operator">></span> roadhog build
Creating an optimized production build<span class="token punctuation">..</span>.
Compiled successfully.
File sizes after gzip:
82.98 KB dist/index.js
270 B dist/index.css</code></pre><p data-reactid="547"><code data-reactid="548"><!-- react-text: 549 -->build<!-- /react-text --></code><!-- react-text: 550 --> 命令会打包所有的资源,包含 JavaScript, CSS, web fonts, images, html 等。然后你可以在 <!-- /react-text --><code data-reactid="551"><!-- react-text: 552 -->dist/<!-- /react-text --></code><!-- react-text: 553 --> 目录下找到这些文件。<!-- /react-text --></p><h2 id="下一步" data-reactid="554"><span data-reactid="555"><!-- react-text: 556 -->下一步<!-- /react-text --></span><a href="#下一步" class="anchor" data-reactid="557">#</a></h2><p data-reactid="558"><!-- react-text: 559 -->我们已经完成了一个简单应用,你可能还有很多疑问,比如:<!-- /react-text --></p><ul data-reactid="560"><li data-reactid="561"><p data-reactid="562"><!-- react-text: 563 -->如何处理异步请求<!-- /react-text --></p></li><li data-reactid="564"><p data-reactid="565"><!-- react-text: 566 -->如何优雅地加载初始数据<!-- /react-text --></p></li><li data-reactid="567"><p data-reactid="568"><!-- react-text: 569 -->如何统一处理出错,以及特定操作的出错<!-- /react-text --></p></li><li data-reactid="570"><p data-reactid="571"><!-- react-text: 572 -->如何动态加载路由和 Model,以加速页面载入速度<!-- /react-text --></p></li><li data-reactid="573"><p data-reactid="574"><!-- react-text: 575 -->如何实现 hmr<!-- /react-text --></p></li><li data-reactid="576"><p data-reactid="577"><!-- react-text: 578 -->如何 mock 数据<!-- /react-text --></p></li><li data-reactid="579"><p data-reactid="580"><!-- react-text: 581 -->等等<!-- /react-text --></p></li></ul><p data-reactid="582"><!-- react-text: 583 -->你可以:<!-- /react-text --></p><ul data-reactid="584"><li data-reactid="585"><p data-reactid="586"><!-- react-text: 587 -->访问 <!-- /react-text --><a href="https://github.com/dvajs/dva" data-reactid="588"><!-- react-text: 589 -->dva 官网<!-- /react-text --></a></p></li><li data-reactid="590"><p data-reactid="591"><!-- react-text: 592 -->理解 dva 的 <!-- /react-text --><a href="https://github.com/dvajs/dva/blob/master/docs/Concepts_zh-CN.md" data-reactid="593"><!-- react-text: 594 -->8 个概念<!-- /react-text --></a><!-- react-text: 595 --> ,以及他们是如何串起来的<!-- /react-text --></p></li><li data-reactid="596"><p data-reactid="597"><!-- react-text: 598 -->掌握 dva 的<!-- /react-text --><a href="https://github.com/dvajs/dva/blob/master/docs/API_zh-CN.md" data-reactid="599"><!-- react-text: 600 -->所有 API<!-- /react-text --></a></p></li><li data-reactid="601"><p data-reactid="602"><!-- react-text: 603 -->查看 <!-- /react-text --><a href="https://github.com/dvajs/dva-knowledgemap" data-reactid="604"><!-- react-text: 605 -->dva 知识地图<!-- /react-text --></a><!-- react-text: 606 --> ,包含 ES6, React, dva 等所有基础知识<!-- /react-text --></p></li><li data-reactid="607"><p data-reactid="608"><!-- react-text: 609 -->查看 <!-- /react-text --><a href="https://github.com/dvajs/dva/issues?q=is%3Aissue+is%3Aclosed+label%3Afaq" data-reactid="610"><!-- react-text: 611 -->更多 FAQ<!-- /react-text --></a><!-- react-text: 612 -->,看看别人通常会遇到什么问题<!-- /react-text --></p></li><li data-reactid="613"><p data-reactid="614"><!-- react-text: 615 -->如果你基于 dva-cli 创建项目,最好了解他的 <!-- /react-text --><a href="https://github.com/sorrycc/roadhog#配置" data-reactid="616"><!-- react-text: 617 -->配置方式<!-- /react-text --></a></p></li></ul></section></article></div></div><div class="ant-row" data-reactid="618"><div class="ant-col-xs-24 ant-col-sm-24 ant-col-md-18 ant-col-md-offset-6 ant-col-lg-20 ant-col-lg-offset-4" data-reactid="619"><section class="prev-next-nav" data-reactid="620"><a class="prev-page" href="/docs/react/getting-started-cn" data-reactid="621">快速上手</a><a class="next-page" href="/docs/react/use-with-create-react-app-cn" data-reactid="622">在 create-react-app 中使用</a></section></div></div></div><footer id="footer" data-reactid="623"><ul data-reactid="624"><li data-reactid="625"><h2 data-reactid="626"><i class="anticon anticon-github" data-reactid="627"></i><!-- react-text: 628 --> GitHub<!-- /react-text --></h2><div data-reactid="629"><a target="_blank " href="https://github.com/ant-design/ant-design" data-reactid="630"><span data-reactid="631">源码仓库</span></a></div><div data-reactid="632"><a target="_blank " href="https://ant.design/docs/react/customize-theme" data-reactid="633"><span data-reactid="634">定制主题</span></a></div><div data-reactid="635"><a target="_blank " href="https://github.com/websemantics/awesome-ant-design" data-reactid="636"><span data-reactid="637">Awesome Ant Design</span></a></div></li><li data-reactid="638"><h2 data-reactid="639"><i class="anticon anticon-link" data-reactid="640"></i><!-- react-text: 641 --> <!-- /react-text --><span data-reactid="642">相关站点</span></h2><div data-reactid="643"><a href="https://design.alipay.com/" data-reactid="644"><span data-reactid="645">蚂蚁金服设计平台</span></a></div><div data-reactid="646"><a href="http://mobile.ant.design" data-reactid="647">Ant Design Mobile</a><span data-reactid="648"> - </span><span data-reactid="649">移动版</span></div><div data-reactid="650"><a target="_blank" rel="noopener noreferrer" href="https://github.com/dvajs/dva" data-reactid="651">dva</a><!-- react-text: 652 --> - <!-- /react-text --><span data-reactid="653">应用框架</span></div><div data-reactid="654"><a target="_blank" rel="noopener noreferrer" href="https://github.com/dvajs/dva-cli" data-reactid="655">dva-cli</a><!-- react-text: 656 --> -<!-- /react-text --><span data-reactid="657">开发工具</span></div><div data-reactid="658"><a target="_blank" rel="noopener noreferrer" href="https://eggjs.org/" data-reactid="659">Egg</a><span data-reactid="660"> - </span><span data-reactid="661">企业级 Node 开发框架</span></div><div data-reactid="662"><a target="_blank" rel="noopener noreferrer" href="https://antv.alipay.com/" data-reactid="663">AntV</a><span data-reactid="664"> - </span><span data-reactid="665">数据可视化</span></div><div data-reactid="666"><a target="_blank" rel="noopener noreferrer" href="http://motion.ant.design" data-reactid="667">Ant Motion</a><span data-reactid="668"> - </span><span data-reactid="669">设计动效</span></div><div data-reactid="670"><a target="_blank" rel="noopener noreferrer" href="http://library.ant.design/" data-reactid="671">AntD Library</a><span data-reactid="672"> - </span><span data-reactid="673">Axure 部件库</span></div><div data-reactid="674"><a target="_blank" rel="noopener noreferrer" href="http://ux.ant.design" data-reactid="675">Ant UX</a><span data-reactid="676"> - </span><span data-reactid="677">页面逻辑素材</span></div></li><li data-reactid="678"><h2 data-reactid="679"><i class="anticon anticon-customer-service" data-reactid="680"></i><!-- react-text: 681 --> <!-- /react-text --><span data-reactid="682">社区</span></h2><div data-reactid="683"><a href="/changelog" data-reactid="684"><span data-reactid="685">更新记录</span></a></div><div data-reactid="686"><a target="_blank" rel="noopener noreferrer" href="https://github.com/ant-design/ant-design/wiki/FAQ" data-reactid="687"><span data-reactid="688">常见问题</span></a></div><div data-reactid="689"><a target="_blank" rel="noopener noreferrer" href="https://gitter.im/ant-design/ant-design" data-reactid="690"><span data-reactid="691">在线讨论 (中文)</span></a></div><div data-reactid="692"><a target="_blank" rel="noopener noreferrer" href="https://gitter.im/ant-design/ant-design-english" data-reactid="693"><span data-reactid="694">在线讨论 (English)</span></a></div><div data-reactid="695"><a target="_blank" rel="noopener noreferrer" href="http://new-issue.ant.design/" data-reactid="696"><span data-reactid="697">报告 Bug</span></a></div><div data-reactid="698"><a target="_blank" rel="noopener noreferrer" href="https://github.com/ant-design/ant-design/issues" data-reactid="699"><span data-reactid="700">讨论列表</span></a></div><div data-reactid="701"><a target="_blank" rel="noopener noreferrer" href="http://stackoverflow.com/questions/tagged/antd" data-reactid="702"><span data-reactid="703">StackOverflow</span></a></div><div data-reactid="704"><a target="_blank" rel="noopener noreferrer" href="https://segmentfault.com/t/antd" data-reactid="705"><span data-reactid="706">SegmentFault</span></a></div></li><li data-reactid="707"><h2 data-reactid="708"><!-- react-text: 709 -->Copyright © <!-- /react-text --><!-- react-text: 710 -->2017<!-- /react-text --></h2><div data-reactid="711"><span data-reactid="712">蚂蚁金服体验技术部出品</span></div><div data-reactid="713"><!-- react-text: 714 -->Built with <!-- /react-text --><a target="_blank" rel="noopener noreferrer" href="https://github.com/benjycui/bisheng" data-reactid="715">BiSheng</a></div></li></ul></footer></div>
</div>
<script src="/common.js"></script>
<script src="/index.js"></script>
</body>
</html>