【单页面博客从前端到后端】基于 DVA+ANTD 搭建博客前后台界面
在上篇文章我们已经搭建好了基础的开发环境,接下来会介绍如何引入 DVA 和 ANTD ,以及在引入过程中需要注意的问题。这里只会详细的书写部分组件,其他的组件都是大同小异。你可以在 github仓库 中找到这些组件。 博客的原型图这里我简单的画了一个博客的轮廓图。这样在写组件的过程中有助于有个整体性的思路,不迷路…
添加目录结构blog ├─ dist # 输出目录 ├─ task # 这里来放webpack处理和配置文件 ├─ src | ├─ assets # 静态文件文件夹 | ├─ components # 组件 | | ├─ Home # Home 页面的文件夹 | | ├─ Archive | | ├─ About | | ├─ Admin # 后台界面文件夹 | | ├─ Header.js # 公共的 Header 组件 | | ├─ Footer.js # 公共的 Footer 组件 | | ├─ UserCard.js # 公共的 UserCard 组件 | | ├─ Login.js # 公共的 Login 组件 | ├─ containers # Redux 的容器组件 | | ├─ Home.js # Home 组件的容器 | | ├─ Archive.js | | ├─ About.js | | ├─ Admin # 后台各界面的容器文件夹 | ├─ router.js # React 路由 | └ index.js # 入口文件 | package.json 引入 DVA 和 ANTDDVA 的简单引入
要知道 更改入口文件 import dva from 'dva' const app = dva() app.router(require('./router')) app.start('#root') 新建路由文件 import React from 'react' import { Router,Route,IndexRoute,IndexRedirect } from 'dva/router' import AppLayout from './container/App' import Home from './container/Home' import Archive from './container/Archive' import About from './container/About' import Article from './container/Article' import AdminArticles from './container/Admin/Articles' import AdminKeywrods from './container/Admin/Keywords' import AdminEditor from './container/Admin/Editor' import AdminLayout from './container/Admin/Admin' export default ({history,app}) => { return ( <Router history={history}> <Route path="/" component={AppLayout}> <IndexRoute component={Home} /> <Route path="archive" component={Archive} /> <Route path="about" component={About} /> <Route path="article/:id" component={Article} /> <Route path="admin" component={AdminLayout}> <IndexRedirect to="articles" /> <Route path="articles" component={AdminArticles} /> <Route path="keywords" component={AdminKeywrods} /> <Route path="editor" component={AdminEditor} /> </Route> </Route> </Router> ) } 从这里可以看出,
引入 ANTD按需加载 在引入 在 自定义主题 由脚手架 atool-build 和 官网介绍,我们已经自己配置并新建好了主题文件 添加 less-loader 处理样式文件 上节我们只是添加了对 在 { test: function(path){ return /.less$/.test(path) && !/.module.less$/.test(path) },loader: ExtractTextPlugin.extract({ fallback: 'style-loader',use: [ { loader: 'css-loader',},{ loader: 'postcss-loader',options: { plugins: postcssPlugins } },{ loader: 'less-loader',options: {"modifyVars": theme} } ] }) }, 注意 你也可能会通过添加 添加容器组件和展示组件容器组件在 import React,{ PropTypes } from 'react' import { connect } from 'dva' import { Layout,Menu,Breadcrumb,Row,Col,Icon } from 'antd' import HeaderComponent from 'components/Header' import FooterComponent from 'components/Footer' import LoginModel from 'components/Login' const { Header,Content,Footer } = Layout const App = ({children,routes}) => { return ( <Layout> <Header> <HeaderComponent routes={routes}> <LoginModel doLogin={() => {}} /> </HeaderComponent> </Header> <Content style={{ margin: '24px 100px 0',background: '#fff',minHeight: 280,overflow: 'hidden' }}> {children} </Content> <Footer> <FooterComponent /> </Footer> </Layout> ) } export default connect()(App) 因为
其他的展示组件,即 展示组件我们看到 import React from 'react' import { Layout,Col } from 'antd' import { Router,Link } from 'dva/router' const HeaderComponent = (props) => { const { children,routes } = props const routePath = (routes[routes.length - 1] || {}).path || '/' return ( <div> <Row> <Col span={16}> <Menu mode="horizontal" defaultSelectedKeys={[routePath]} style={{ lineHeight: '64px',backgroundColor: 'transparent' }} > <Menu.Item key="/"><Link to="/">Home</Link></Menu.Item> <Menu.Item key="archive"><Link to="archive">Archive</Link></Menu.Item> <Menu.Item key="about"><Link to="about">About me</Link></Menu.Item> </Menu> </Col> <Col span={8}> <div style={{ lineHeight: '64px',float: 'right',padding: '0 20px' }}> {children} </div> </Col> </Row> </div> ) } export default HeaderComponent 这就是个普通的 React 的展示组件没什么好说的,这些组件可以直接在
其他的展示型组件也都是大同小异,你可以在 github仓库 中找到它们的实现。 引入 url-loader 来处理文件路径在 { test: /.(png|jpe?g|gif|svg)(?.*)?$/,loader: 'url-loader',options: { limit: 10000,name: 'img/[name].[hash:7].[ext]' } },{ test: /.(woff2?|eot|ttf|otf)(?.*)?$/,name: 'fonts/[name].[hash:7].[ext]' } }, 关于 小结这篇文章主要是引入了两个重要的库
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |