Files
ant-design/docs/react/practical-projects-cn.html
T
2016-12-13 14:40:06 +08:00

177 lines
56 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
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 - One Design Language</title>
<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>');
}
</script>
</head>
<body>
<div id="react-content">
<div class="page-wrapper" data-reactroot="" data-reactid="1" data-react-checksum="-771835135"><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-6 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 style="display:block;" class="ant-col-xs-0 ant-col-sm-17 ant-col-md-18 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"></span></div></li></ul></div><span class="ant-select-arrow" style="user-select:none;-webkit-user-select:none;" unselectable="unselectable" data-reactid="19"><b data-reactid="20"></b></span></div></div></div><button type="button" class="ant-btn ant-btn-ghost ant-btn-sm lang" data-reactid="21"><span data-reactid="22">EN</span></button><ul class="ant-menu ant-menu-horizontal ant-menu-light ant-menu-root" role="menu" aria-activedescendant="" id="nav" tabindex="0" data-reactid="23"><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="24"><a href="/index-cn" data-reactid="25"><span data-reactid="26">首页</span></a></li><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="27"><a href="/docs/spec/introduce-cn" data-reactid="28"><span data-reactid="29">规范</span></a></li><li class="ant-menu-item-selected ant-menu-item" role="menuitem" aria-selected="true" data-reactid="30"><a href="/docs/react/introduce-cn" data-reactid="31"><span data-reactid="32">组件</span></a></li><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="33"><a href="/docs/pattern/navigation-cn" data-reactid="34"><span data-reactid="35">模式</span></a></li><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="36"><a href="/docs/practice/cases-cn" data-reactid="37"><span data-reactid="38">实践</span></a></li><li class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="39"><a href="/docs/resource/download-cn" data-reactid="40"><span data-reactid="41">资源</span></a></li></ul></div></div></header><div class="main-wrapper" data-reactid="42"><div class="ant-row" data-reactid="43"><div class="ant-col-xs-24 ant-col-sm-24 ant-col-md-6 ant-col-lg-4" data-reactid="44"><ul class="ant-menu ant-menu-inline aside-container ant-menu-light ant-menu-root" role="menu" aria-activedescendant="" tabindex="0" data-reactid="45"><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="46"><a href="/docs/react/introduce-cn" data-reactid="47">Ant Design of React</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="48"><a href="/docs/react/getting-started-cn" data-reactid="49">快速上手</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="50"><a href="/docs/react/install-cn" data-reactid="51">安装</a></li><li style="padding-left:24px;" class="ant-menu-item-selected ant-menu-item" role="menuitem" aria-selected="true" data-reactid="52"><a href="/docs/react/practical-projects-cn" data-reactid="53">项目实战</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="54"><a href="/docs/react/customize-theme-cn" data-reactid="55">定制主题</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="56"><a href="//github.com/ant-design/intl-example" target="_blank" rel="noopener noreferrer" data-reactid="57">i18n 方案</a></li><li style="padding-left:24px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="58"><a href="/changelog-cn" data-reactid="59">更新日志</a></li><li class="ant-menu-submenu-inline ant-menu-submenu-open ant-menu-submenu" data-reactid="60"><div style="padding-left:24px;" class="ant-menu-submenu-title" aria-open="true" aria-owns="1481611172295_11" aria-haspopup="true" data-reactid="61"><h4 data-reactid="62">Components</h4></div><ul class="ant-menu ant-menu-inline ant-menu-sub" role="menu" aria-activedescendant="" id="1481611172295_11" data-reactid="63"><li class=" ant-menu-item-group" data-reactid="64"><div class="ant-menu-item-group-title" data-reactid="65">General</div><ul class="ant-menu-item-group-list" data-reactid="66"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="67"><a href="/components/button-cn/" data-reactid="68"><span data-reactid="69">Button</span><span class="chinese" data-reactid="70">按钮</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="71"><a href="/components/icon-cn/" data-reactid="72"><span data-reactid="73">Icon</span><span class="chinese" data-reactid="74">图标</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="75"><div class="ant-menu-item-group-title" data-reactid="76">Layout</div><ul class="ant-menu-item-group-list" data-reactid="77"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="78"><a href="/components/grid-cn/" data-reactid="79"><span data-reactid="80">Grid</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">Navigation</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/affix-cn/" data-reactid="86"><span data-reactid="87">Affix</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/anchor-cn/" data-reactid="90"><span data-reactid="91">Anchor</span><span class="chinese" data-reactid="92">锚点</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="93"><a href="/components/back-top-cn/" data-reactid="94"><span data-reactid="95">BackTop</span><span class="chinese" data-reactid="96">回到顶部</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="97"><a href="/components/breadcrumb-cn/" data-reactid="98"><span data-reactid="99">Breadcrumb</span><span class="chinese" data-reactid="100">面包屑</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="101"><a href="/components/dropdown-cn/" data-reactid="102"><span data-reactid="103">Dropdown</span><span class="chinese" data-reactid="104">下拉菜单</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="105"><a href="/components/menu-cn/" data-reactid="106"><span data-reactid="107">Menu</span><span class="chinese" data-reactid="108">导航菜单</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="109"><a href="/components/pagination-cn/" data-reactid="110"><span data-reactid="111">Pagination</span><span class="chinese" data-reactid="112">分页</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="113"><a href="/components/steps-cn/" data-reactid="114"><span data-reactid="115">Steps</span><span class="chinese" data-reactid="116">步骤条</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="117"><a href="/components/tabs-cn/" data-reactid="118"><span data-reactid="119">Tabs</span><span class="chinese" data-reactid="120">标签页</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="121"><div class="ant-menu-item-group-title" data-reactid="122">Data Entry</div><ul class="ant-menu-item-group-list" data-reactid="123"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="124"><a href="/components/auto-complete-cn/" data-reactid="125"><span data-reactid="126">AutoComplete</span><span class="chinese" data-reactid="127">自动完成</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="128"><a href="/components/checkbox-cn/" data-reactid="129"><span data-reactid="130">Checkbox</span><span class="chinese" data-reactid="131">多选框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="132"><a href="/components/cascader-cn/" data-reactid="133"><span data-reactid="134">Cascader</span><span class="chinese" data-reactid="135">级联选择</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="136"><a href="/components/date-picker-cn/" data-reactid="137"><span data-reactid="138">DatePicker</span><span class="chinese" data-reactid="139">日期选择框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="140"><a href="/components/form-cn/" data-reactid="141"><span data-reactid="142">Form</span><span class="chinese" data-reactid="143">表单</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="144"><a href="/components/input-cn/" data-reactid="145"><span data-reactid="146">Input</span><span class="chinese" data-reactid="147">输入框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="148"><a href="/components/input-number-cn/" data-reactid="149"><span data-reactid="150">InputNumber</span><span class="chinese" data-reactid="151">数字输入框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="152"><a href="/components/mention-cn/" data-reactid="153"><span data-reactid="154">Mention</span><span class="chinese" data-reactid="155">提及</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="156"><a href="/components/radio-cn/" data-reactid="157"><span data-reactid="158">Radio</span><span class="chinese" data-reactid="159">单选框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="160"><a href="/components/rate-cn/" data-reactid="161"><span data-reactid="162">Rate</span><span class="chinese" data-reactid="163">评分</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="164"><a href="/components/select-cn/" data-reactid="165"><span data-reactid="166">Select</span><span class="chinese" data-reactid="167">选择器</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="168"><a href="/components/slider-cn/" data-reactid="169"><span data-reactid="170">Slider</span><span class="chinese" data-reactid="171">滑动输入条</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="172"><a href="/components/switch-cn/" data-reactid="173"><span data-reactid="174">Switch</span><span class="chinese" data-reactid="175">开关</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="176"><a href="/components/time-picker-cn/" data-reactid="177"><span data-reactid="178">TimePicker</span><span class="chinese" data-reactid="179">时间选择框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="180"><a href="/components/transfer-cn/" data-reactid="181"><span data-reactid="182">Transfer</span><span class="chinese" data-reactid="183">穿梭框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="184"><a href="/components/tree-select-cn/" data-reactid="185"><span data-reactid="186">TreeSelect</span><span class="chinese" data-reactid="187">树选择</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="188"><a href="/components/upload-cn/" data-reactid="189"><span data-reactid="190">Upload</span><span class="chinese" data-reactid="191">上传</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="192"><div class="ant-menu-item-group-title" data-reactid="193">Data Display</div><ul class="ant-menu-item-group-list" data-reactid="194"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="195"><a href="/components/badge-cn/" data-reactid="196"><span data-reactid="197">Badge</span><span class="chinese" data-reactid="198">徽标数</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="199"><a href="/components/card-cn/" data-reactid="200"><span data-reactid="201">Card</span><span class="chinese" data-reactid="202">卡片</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="203"><a href="/components/carousel-cn/" data-reactid="204"><span data-reactid="205">Carousel</span><span class="chinese" data-reactid="206">走马灯</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="207"><a href="/components/collapse-cn/" data-reactid="208"><span data-reactid="209">Collapse</span><span class="chinese" data-reactid="210">折叠面板</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="211"><a href="/components/calendar-cn/" data-reactid="212"><span data-reactid="213">Calendar</span><span class="chinese" data-reactid="214">日历</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="215"><a href="/components/popover-cn/" data-reactid="216"><span data-reactid="217">Popover</span><span class="chinese" data-reactid="218">气泡卡片</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="219"><a href="/components/table-cn/" data-reactid="220"><span data-reactid="221">Table</span><span class="chinese" data-reactid="222">表格</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="223"><a href="/components/tag-cn/" data-reactid="224"><span data-reactid="225">Tag</span><span class="chinese" data-reactid="226">标签</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="227"><a href="/components/timeline-cn/" data-reactid="228"><span data-reactid="229">Timeline</span><span class="chinese" data-reactid="230">时间轴</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="231"><a href="/components/tooltip-cn/" data-reactid="232"><span data-reactid="233">Tooltip</span><span class="chinese" data-reactid="234">文字提示</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="235"><a href="/components/tree-cn/" data-reactid="236"><span data-reactid="237">Tree</span><span class="chinese" data-reactid="238">树形控件</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="239"><div class="ant-menu-item-group-title" data-reactid="240">Feedback</div><ul class="ant-menu-item-group-list" data-reactid="241"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="242"><a href="/components/alert-cn/" data-reactid="243"><span data-reactid="244">Alert</span><span class="chinese" data-reactid="245">警告提示</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="246"><a href="/components/message-cn/" data-reactid="247"><span data-reactid="248">Message</span><span class="chinese" data-reactid="249">全局提示</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="250"><a href="/components/modal-cn/" data-reactid="251"><span data-reactid="252">Modal</span><span class="chinese" data-reactid="253">对话框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="254"><a href="/components/notification-cn/" data-reactid="255"><span data-reactid="256">Notification</span><span class="chinese" data-reactid="257">通知提醒框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="258"><a href="/components/popconfirm-cn/" data-reactid="259"><span data-reactid="260">Popconfirm</span><span class="chinese" data-reactid="261">气泡确认框</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="262"><a href="/components/progress-cn/" data-reactid="263"><span data-reactid="264">Progress</span><span class="chinese" data-reactid="265">进度条</span></a></li><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="266"><a href="/components/spin-cn/" data-reactid="267"><span data-reactid="268">Spin</span><span class="chinese" data-reactid="269">加载中</span></a></li></ul></li><li class=" ant-menu-item-group" data-reactid="270"><div class="ant-menu-item-group-title" data-reactid="271">Other</div><ul class="ant-menu-item-group-list" data-reactid="272"><li style="padding-left:48px;" class="ant-menu-item" role="menuitem" aria-selected="false" data-reactid="273"><a href="/components/locale-provider-cn/" data-reactid="274"><span data-reactid="275">LocaleProvider</span><span class="chinese" data-reactid="276">国际化</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="277"><article class="markdown" data-reactid="278"><h1 data-reactid="279"><!-- react-text: 280 -->项目实战<!-- /react-text --><a class="edit-button" href="https://github.com/ant-design/ant-design/blob/master/docs/react/practical-projects.zh-CN.md" data-reactid="281"><i class="anticon anticon-edit" data-reactid="282"></i></a></h1><section class="markdown" data-reactid="283"><p data-reactid="284"><a href="https://github.com/dvajs/dva" data-reactid="285"><!-- react-text: 286 -->dva<!-- /react-text --></a><!-- react-text: 287 --> 是一个基于 react 和 redux 的轻量应用框架,概念来自 elm,支持 side effects、热替换、动态加载、react-native、SSR 等,已在生产环境广泛应用。<!-- /react-text --></p><p data-reactid="288"><!-- react-text: 289 -->本文会引导你使用 dva 和 antd 从 0 开始创建一个简单应用。<!-- /react-text --></p><p data-reactid="290"><!-- react-text: 291 -->会包含以下内容:<!-- /react-text --></p></section><section class="toc" data-reactid="292"><ul data-reactid="293"><li data-reactid="294"><a class="bisheng-toc-h2" href="#安装-dva" data-reactid="295"><!-- react-text: 296 -->安装 dva<!-- /react-text --></a></li><li data-reactid="297"><a class="bisheng-toc-h2" href="#创建新应用" data-reactid="298"><!-- react-text: 299 -->创建新应用<!-- /react-text --></a></li><li data-reactid="300"><a class="bisheng-toc-h2" href="#使用-antd" data-reactid="301"><!-- react-text: 302 -->使用 antd<!-- /react-text --></a></li><li data-reactid="303"><a class="bisheng-toc-h2" href="#定义路由" data-reactid="304"><!-- react-text: 305 -->定义路由<!-- /react-text --></a></li><li data-reactid="306"><a class="bisheng-toc-h2" href="#编写-UI-Component" data-reactid="307"><!-- react-text: 308 -->编写 UI Component<!-- /react-text --></a></li><li data-reactid="309"><a class="bisheng-toc-h2" href="#定义-Model" data-reactid="310"><!-- react-text: 311 -->定义 Model<!-- /react-text --></a></li><li data-reactid="312"><a class="bisheng-toc-h2" href="#connect-起来" data-reactid="313"><!-- react-text: 314 -->connect 起来<!-- /react-text --></a></li><li data-reactid="315"><a class="bisheng-toc-h2" href="#构建应用" data-reactid="316"><!-- react-text: 317 -->构建应用<!-- /react-text --></a></li><li data-reactid="318"><a class="bisheng-toc-h2" href="#下一步" data-reactid="319"><!-- react-text: 320 -->下一步<!-- /react-text --></a></li></ul></section><section class="markdown" data-reactid="321"><h2 id="安装-dva" data-reactid="322"><span data-reactid="323"><!-- react-text: 324 -->安装 dva<!-- /react-text --></span><a href="#安装-dva" class="anchor" data-reactid="325">#</a></h2><p data-reactid="326"><!-- react-text: 327 -->通过 npm 安装 dva 。<!-- /react-text --></p><pre class="language-bash" data-reactid="328"><code data-reactid="329">$ <span class="token function">npm</span> <span class="token function">install</span> dva-cli -g</code></pre><h2 id="创建新应用" data-reactid="330"><span data-reactid="331"><!-- react-text: 332 -->创建新应用<!-- /react-text --></span><a href="#创建新应用" class="anchor" data-reactid="333">#</a></h2><p data-reactid="334"><!-- react-text: 335 -->安装完 dva-cli 之后,就可以在 terminal 里访问到 <!-- /react-text --><code data-reactid="336"><!-- react-text: 337 -->dva<!-- /react-text --></code><!-- react-text: 338 --> 命令。现在,你可以通过 <!-- /react-text --><code data-reactid="339"><!-- react-text: 340 -->dva new<!-- /react-text --></code><!-- react-text: 341 --> 创建新应用。<!-- /react-text --></p><pre class="language-bash" data-reactid="342"><code data-reactid="343">$ dva new dva-quickstart</code></pre><p data-reactid="344"><!-- react-text: 345 -->这会创建 <!-- /react-text --><code data-reactid="346"><!-- react-text: 347 -->dva-quickstart<!-- /react-text --></code><!-- react-text: 348 --> 目录,包含项目初始化目录和文件,并提供开发服务器、构建脚本、数据 mock 服务、代理服务器等功能。<!-- /react-text --></p><p data-reactid="349"><!-- react-text: 350 -->然后我们 <!-- /react-text --><code data-reactid="351"><!-- react-text: 352 -->cd<!-- /react-text --></code><!-- react-text: 353 --> 进入 <!-- /react-text --><code data-reactid="354"><!-- react-text: 355 -->dva-quickstart<!-- /react-text --></code><!-- react-text: 356 --> 目录,并启动开发服务器:<!-- /react-text --></p><pre class="language-bash" data-reactid="357"><code data-reactid="358">$ <span class="token function">cd</span> dva-quickstart
$ <span class="token function">npm</span> start</code></pre><p data-reactid="359"><!-- react-text: 360 -->几秒钟后,你会看到以下输出:<!-- /react-text --></p><pre class="language-bash" data-reactid="361"><code data-reactid="362"> proxy: load rule from proxy.config.js
proxy: listened on 8989
📦 411/411 build modules
webpack: bundle build is now finished.</code></pre><p data-reactid="363"><!-- react-text: 364 -->在浏览器里打开 <!-- /react-text --><a href="http://localhost:8989" data-reactid="365"><!-- react-text: 366 -->http://localhost:8989<!-- /react-text --></a><!-- react-text: 367 --> ,你会看到 dva 的欢迎界面。<!-- /react-text --></p><h2 id="使用-antd" data-reactid="368"><span data-reactid="369"><!-- react-text: 370 -->使用 antd<!-- /react-text --></span><a href="#使用-antd" class="anchor" data-reactid="371">#</a></h2><p data-reactid="372"><!-- react-text: 373 -->通过 npm 安装 <!-- /react-text --><code data-reactid="374"><!-- react-text: 375 -->antd<!-- /react-text --></code><!-- react-text: 376 --><!-- /react-text --><code data-reactid="377"><!-- react-text: 378 -->babel-plugin-import<!-- /react-text --></code><!-- react-text: 379 --><!-- /react-text --><code data-reactid="380"><!-- react-text: 381 -->babel-plugin-import<!-- /react-text --></code><!-- react-text: 382 --> 是用来按需加载 antd 的脚本和样式的,详见 <!-- /react-text --><a href="https://github.com/ant-design/babel-plugin-import" data-reactid="383"><!-- react-text: 384 -->repo<!-- /react-text --></a><!-- react-text: 385 --><!-- /react-text --></p><pre class="language-bash" data-reactid="386"><code data-reactid="387">$ <span class="token function">npm</span> <span class="token function">install</span> antd babel-plugin-import --save</code></pre><p data-reactid="388"><!-- react-text: 389 -->编辑 <!-- /react-text --><code data-reactid="390"><!-- react-text: 391 -->webpack.config.js<!-- /react-text --></code><!-- react-text: 392 -->,使 <!-- /react-text --><code data-reactid="393"><!-- react-text: 394 -->babel-plugin-import<!-- /react-text --></code><!-- react-text: 395 --> 插件生效。<!-- /react-text --></p><pre class="language-diff" data-reactid="396"><code data-reactid="397"><span class="token inserted">+ webpackConfig.babel.plugins.push(['import', {</span>
<span class="token inserted">+ libraryName: 'antd',</span>
<span class="token inserted">+ style: 'css',</span>
<span class="token inserted">+ }]);</span></code></pre><blockquote data-reactid="398"><p data-reactid="399"><!-- react-text: 400 -->注:这里不需要手动重启开发服务器,保存 <!-- /react-text --><code data-reactid="401"><!-- react-text: 402 -->webpack.config.js<!-- /react-text --></code><!-- react-text: 403 --> 后会自动重启。<!-- /react-text --></p></blockquote><h2 id="定义路由" data-reactid="404"><span data-reactid="405"><!-- react-text: 406 -->定义路由<!-- /react-text --></span><a href="#定义路由" class="anchor" data-reactid="407">#</a></h2><p data-reactid="408"><!-- react-text: 409 -->我们要写个应用来先显示产品列表。首先第一步是创建路由,路由可以想象成是组成应用的不同页面。<!-- /react-text --></p><p data-reactid="410"><!-- react-text: 411 -->新建 route component <!-- /react-text --><code data-reactid="412"><!-- react-text: 413 -->routes/Products.js<!-- /react-text --></code><!-- react-text: 414 -->,内容如下:<!-- /react-text --></p><pre class="language-javascript" data-reactid="415"><code data-reactid="416"><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="417"><!-- react-text: 418 -->添加路由信息到路由表,编辑 <!-- /react-text --><code data-reactid="419"><!-- react-text: 420 -->router.js<!-- /react-text --></code><!-- react-text: 421 --> :<!-- /react-text --></p><pre class="language-diff" data-reactid="422"><code data-reactid="423"><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="424"><!-- react-text: 425 -->然后在浏览器里打开 <!-- /react-text --><a href="http://localhost:8989/#/products" data-reactid="426"><!-- react-text: 427 -->http://localhost:8989/#/products<!-- /react-text --></a><!-- react-text: 428 --> ,你应该能看到前面定义的 <!-- /react-text --><code data-reactid="429"><!-- react-text: 430 -->&lt;h2&gt;<!-- /react-text --></code><!-- react-text: 431 --> 标签。<!-- /react-text --></p><h2 id="编写-UI-Component" data-reactid="432"><span data-reactid="433"><!-- react-text: 434 -->编写 UI Component<!-- /react-text --></span><a href="#编写-UI-Component" class="anchor" data-reactid="435">#</a></h2><p data-reactid="436"><!-- react-text: 437 -->随着应用的发展,你会需要在多个页面分享 UI 元素 (或在一个页面使用多次),在 dva 里你可以把这部分抽成 component 。<!-- /react-text --></p><p data-reactid="438"><!-- react-text: 439 -->我们来编写一个 <!-- /react-text --><code data-reactid="440"><!-- react-text: 441 -->ProductList<!-- /react-text --></code><!-- react-text: 442 --> component,这样就能在不同的地方显示产品列表了。<!-- /react-text --></p><p data-reactid="443"><!-- react-text: 444 -->新建 <!-- /react-text --><code data-reactid="445"><!-- react-text: 446 -->components/ProductList.js<!-- /react-text --></code><!-- react-text: 447 --> 文件:<!-- /react-text --></p><pre class="language-javascript" data-reactid="448"><code data-reactid="449"><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="450"><span data-reactid="451"><!-- react-text: 452 -->定义 Model<!-- /react-text --></span><a href="#定义-Model" class="anchor" data-reactid="453">#</a></h2><p data-reactid="454"><!-- react-text: 455 -->完成 UI 后,现在开始处理数据和逻辑。<!-- /react-text --></p><p data-reactid="456"><!-- react-text: 457 -->dva 通过 model 的概念把一个领域的模型管理起来,包含同步更新 state 的 reducers,处理异步逻辑的 effects,订阅数据源的 subscriptions 。<!-- /react-text --></p><p data-reactid="458"><!-- react-text: 459 -->新建 model <!-- /react-text --><code data-reactid="460"><!-- react-text: 461 -->models/products.js<!-- /react-text --></code><!-- react-text: 462 --> <!-- /react-text --></p><pre class="language-javascript" data-reactid="463"><code data-reactid="464"><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="465"><!-- react-text: 466 -->这个 model 里:<!-- /react-text --></p><ul data-reactid="467"><li data-reactid="468"><p data-reactid="469"><code data-reactid="470"><!-- react-text: 471 -->namespace<!-- /react-text --></code><!-- react-text: 472 --> 表示在全局 state 上的 key<!-- /react-text --></p></li><li data-reactid="473"><p data-reactid="474"><code data-reactid="475"><!-- react-text: 476 -->state<!-- /react-text --></code><!-- react-text: 477 --> 是初始值,在这里是空数组<!-- /react-text --></p></li><li data-reactid="478"><p data-reactid="479"><code data-reactid="480"><!-- react-text: 481 -->reducers<!-- /react-text --></code><!-- react-text: 482 --> 等同于 redux 里的 reducer,接收 action,同步更新 state<!-- /react-text --></p></li></ul><p data-reactid="483"><!-- react-text: 484 -->然后别忘记在 <!-- /react-text --><code data-reactid="485"><!-- react-text: 486 -->index.js<!-- /react-text --></code><!-- react-text: 487 --> 里载入他:<!-- /react-text --></p><pre class="language-diff" data-reactid="488"><code data-reactid="489">// 3. Model
<span class="token inserted">+ app.model(require('./models/products'));</span></code></pre><h2 id="connect-起来" data-reactid="490"><span data-reactid="491"><!-- react-text: 492 -->connect 起来<!-- /react-text --></span><a href="#connect-起来" class="anchor" data-reactid="493">#</a></h2><p data-reactid="494"><!-- react-text: 495 -->到这里,我们已经单独完成了 model 和 component,那么他们如何串联起来呢?<!-- /react-text --></p><p data-reactid="496"><!-- react-text: 497 -->dva 提供了 connect 方法。如果你熟悉 redux,这个 connect 就是 react-redux 的 connect 。<!-- /react-text --></p><p data-reactid="498"><!-- react-text: 499 -->编辑 <!-- /react-text --><code data-reactid="500"><!-- react-text: 501 -->routes/Products.js<!-- /react-text --></code><!-- react-text: 502 -->,替换为以下内容:<!-- /react-text --></p><pre class="language-javascript" data-reactid="503"><code data-reactid="504"><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="505"><!-- react-text: 506 -->最后,我们还需要一些初始数据让这个应用 run 起来。编辑 <!-- /react-text --><code data-reactid="507"><!-- react-text: 508 -->index.js<!-- /react-text --></code><!-- react-text: 509 --><!-- /react-text --></p><pre class="language-diff" data-reactid="510"><code data-reactid="511"><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="512"><!-- react-text: 513 -->刷新浏览器,应该能看到以下效果:<!-- /react-text --></p><p style="text-align:center;" data-reactid="514"><img src="https://zos.alipayobjects.com/rmsportal/GQJeDDeUCSTRMMg.gif" data-reactid="515"/></p><h2 id="构建应用" data-reactid="516"><span data-reactid="517"><!-- react-text: 518 -->构建应用<!-- /react-text --></span><a href="#构建应用" class="anchor" data-reactid="519">#</a></h2><p data-reactid="520"><!-- react-text: 521 -->完成开发并且在开发环境验证之后,就需要部署给我们的用户了。先执行下面的命令:<!-- /react-text --></p><pre class="language-bash" data-reactid="522"><code data-reactid="523">$ <span class="token function">npm</span> run build</code></pre><p data-reactid="524"><!-- react-text: 525 -->几秒后,输出应该如下:<!-- /react-text --></p><pre class="language-bash" data-reactid="526"><code data-reactid="527">Child
Time: 14008ms
Asset Size Chunks Chunk Names
index.html 255 bytes <span class="token punctuation">[</span>emitted<span class="token punctuation">]</span>
common.js 1.18 kB 0 <span class="token punctuation">[</span>emitted<span class="token punctuation">]</span> common
index.js 504 kB 1, 0 <span class="token punctuation">[</span>emitted<span class="token punctuation">]</span> index
index.css 127 kB 1, 0 <span class="token punctuation">[</span>emitted<span class="token punctuation">]</span> index</code></pre><p data-reactid="528"><code data-reactid="529"><!-- react-text: 530 -->build<!-- /react-text --></code><!-- react-text: 531 --> 命令会打包所有的资源,包含 JavaScript, CSS, web fonts, images, html 等。然后你可以在 <!-- /react-text --><code data-reactid="532"><!-- react-text: 533 -->dist/<!-- /react-text --></code><!-- react-text: 534 --> 目录下找到这些文件。<!-- /react-text --></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><ul data-reactid="541"><li data-reactid="542"><p data-reactid="543"><!-- react-text: 544 -->如何处理异步请求<!-- /react-text --></p></li><li data-reactid="545"><p data-reactid="546"><!-- react-text: 547 -->如何优雅地加载初始数据<!-- /react-text --></p></li><li data-reactid="548"><p data-reactid="549"><!-- react-text: 550 -->如何统一处理出错,以及特定操作的出错<!-- /react-text --></p></li><li data-reactid="551"><p data-reactid="552"><!-- react-text: 553 -->如何动态加载路由和 Model,以加速页面载入速度<!-- /react-text --></p></li><li data-reactid="554"><p data-reactid="555"><!-- react-text: 556 -->如何实现 hmr<!-- /react-text --></p></li><li data-reactid="557"><p data-reactid="558"><!-- react-text: 559 -->如何 mock 数据<!-- /react-text --></p></li><li data-reactid="560"><p data-reactid="561"><!-- react-text: 562 -->等等<!-- /react-text --></p></li></ul><p data-reactid="563"><!-- react-text: 564 -->你可以:<!-- /react-text --></p><ul data-reactid="565"><li data-reactid="566"><p data-reactid="567"><!-- react-text: 568 -->访问 <!-- /react-text --><a href="https://github.com/dvajs/dva" data-reactid="569"><!-- react-text: 570 -->dva 官网<!-- /react-text --></a><!-- react-text: 571 --><!-- /react-text --></p></li><li data-reactid="572"><p data-reactid="573"><!-- react-text: 574 -->查看所有 <!-- /react-text --><a href="https://github.com/dvajs/dva#api" data-reactid="575"><!-- react-text: 576 -->API<!-- /react-text --></a><!-- react-text: 577 --><!-- /react-text --></p></li><li data-reactid="578"><p data-reactid="579"><a href="https://github.com/dvajs/dva-docs/blob/master/v1/zh-cn/tutorial/01-%E6%A6%82%E8%A6%81.md" data-reactid="580"><!-- react-text: 581 -->教程<!-- /react-text --></a><!-- react-text: 582 -->,一步步完成一个中型应用。<!-- /react-text --></p></li><li data-reactid="583"><p data-reactid="584"><!-- react-text: 585 -->看看 <!-- /react-text --><a href="https://github.com/dvajs/dva-hackernews" data-reactid="586"><!-- react-text: 587 -->dva 版 hackernews<!-- /react-text --></a><!-- react-text: 588 --><!-- /react-text --><a href="https://github.com/sorrycc/blog/issues/9" data-reactid="589"><!-- react-text: 590 -->如何实现<!-- /react-text --></a><!-- react-text: 591 --> 的。<!-- /react-text --></p></li></ul></section></article></div></div><div class="ant-row" data-reactid="592"><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="593"><section class="prev-next-nav" data-reactid="594"><a class="prev-page" href="/docs/react/install-cn" data-reactid="595">安装</a><a class="next-page" href="/docs/react/customize-theme-cn" data-reactid="596">定制主题</a></section></div></div></div><footer id="footer" data-reactid="597"><ul data-reactid="598"><li data-reactid="599"><h2 data-reactid="600">GitHub</h2><div data-reactid="601"><a target="_blank " href="https://github.com/ant-design/ant-design" data-reactid="602"><span data-reactid="603">仓库</span></a></div><div data-reactid="604"><a target="_blank" rel="noopener noreferrer" href="https://github.com/dvajs/dva" data-reactid="605">dva</a><!-- react-text: 606 --> - <!-- /react-text --><span data-reactid="607">应用框架</span></div><div data-reactid="608"><a target="_blank" rel="noopener noreferrer" href="https://github.com/dvajs/dva-cli" data-reactid="609">dva-cli</a><!-- react-text: 610 --> -<!-- /react-text --><span data-reactid="611">脚手架</span></div><div data-reactid="612"><a target="_blank" rel="noopener noreferrer" href="http://ant-tool.github.io" data-reactid="613">ant-tool</a><!-- react-text: 614 --> - <!-- /react-text --><span data-reactid="615">开发工具</span></div></li><li data-reactid="616"><h2 data-reactid="617"><span data-reactid="618">相关站点</span></h2><div data-reactid="619"><a href="http://mobile.ant.design" data-reactid="620">Ant Design Mobile</a><span data-reactid="621"> - </span><span data-reactid="622">移动版</span></div><div data-reactid="623"><a href="https://g2.alipay.com/" data-reactid="624">G2</a><span data-reactid="625"> - </span><span data-reactid="626">数据可视化</span></div><div data-reactid="627"><a href="https://antv.alipay.com/" data-reactid="628">AntV</a><span data-reactid="629"> - </span><span data-reactid="630">数据可视化规范</span></div><div data-reactid="631"><a href="http://motion.ant.design" data-reactid="632">Ant Motion</a><span data-reactid="633"> - </span><span data-reactid="634">设计动效</span></div><div data-reactid="635"><a href="http://library.ant.design/" data-reactid="636">AntD Library</a><span data-reactid="637"> - </span><span data-reactid="638">Axure 部件库</span></div><div data-reactid="639"><a href="http://ux.ant.design" data-reactid="640">Ant UX</a><span data-reactid="641"> - </span><span data-reactid="642">页面逻辑素材</span></div></li><li data-reactid="643"><h2 data-reactid="644"><span data-reactid="645">社区</span></h2><div data-reactid="646"><a rel="noopener noreferrer" href="/changelog" data-reactid="647"><span data-reactid="648">更新记录</span></a></div><div data-reactid="649"><a target="_blank" rel="noopener noreferrer" href="https://github.com/ant-design/ant-design/issues" data-reactid="650"><span data-reactid="651">反馈和建议</span></a></div><div data-reactid="652"><a target="_blank" rel="noopener noreferrer" href="https://gitter.im/ant-design/ant-design" data-reactid="653"><span data-reactid="654">讨论</span></a></div><div data-reactid="655"><a target="_blank" rel="noopener noreferrer" href="https://github.com/ant-design/ant-design/issues/new" data-reactid="656"><span data-reactid="657">报告 Bug</span></a></div></li><li data-reactid="658"><div data-reactid="659"><!-- react-text: 660 -->©2016 <!-- /react-text --><span data-reactid="661">蚂蚁金服体验技术部出品</span></div><div data-reactid="662"><!-- react-text: 663 -->Powered by <!-- /react-text --><a href="https://github.com/benjycui/bisheng" data-reactid="664">BiSheng</a></div><div style="margin-top:10px;" data-reactid="665"><span data-reactid="666">文档版本:</span><div class="ant-select-sm ant-select ant-select-enabled" data-reactid="667"><div class="ant-select-selection
ant-select-selection--single" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false" tabindex="0" data-reactid="668"><div class="ant-select-selection__rendered" data-reactid="669"><div class="ant-select-selection-selected-value" title="1.11.4" style="display:block;opacity:1;" data-reactid="670">1.11.4</div></div><span class="ant-select-arrow" style="user-select:none;-webkit-user-select:none;" unselectable="unselectable" data-reactid="671"><b data-reactid="672"></b></span></div></div></div></li></ul></footer></div>
</div>
<script>
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';
}
var queryString = location.search;
if (queryString) {
var pathname = location.pathname;
var isZhCNConfig = queryString.indexOf('zh-CN') > -1;
if (isZhCNConfig !== isZhCN(pathname)) {
location.pathname = getLocalizedPathname(pathname, isZhCNConfig)
}
}
</script>
<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>
<script src="/common.js"></script>
<script src="/index.js"></script>
</body>
</html>