React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架。而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战!

项目代码地址:https://github.com/DigAg/digag-pc-react

  • 首先,我们开始构建一个基础项目。

我们使用create-react-app创建项目,不需要安装或配置W​​ebpack或Babel等工具。它们被预先配置和隐藏,以便我们可以专注于代码。

  • 在本地全局安装create-react-app(需要安装Node.js且版本 >= 6,也可使用 yarn 代替 npm)
  1. npm install -g create-react-app
  • 创建项目
  1. create-react-app digag
  2. cd digag
  • 检查是否成功创建digag文件夹与相关文件
  1. digag
  2. ├── README.md
  3. ├── node_modules
  4. ├── package.json
  5. ├── .gitignore
  6. ├── public
  7. └── favicon.ico
  8. └── index.html
  9. └── manifest.json
  10. └── src
  11. └── App.css
  12. └── App.js
  13. └── App.test.js
  14. └── index.css
  15. └── index.js
  16. └── logo.svg
  17. └── registerServiceWorker.js
  • 在开发模式下运行应用程序,访问localhost:3000在浏览器中查看。
  1. npm start
  2. or
  3. yarn start
  1. 这样我们就成功创建好一个可以直接运行的React项目了!
  • 接下来,开始编写代码了!

  • 首先我们打开 src 目录下的 App.js 文件,删除掉默认生成的代码。输入以下代码:

  1. /**
  2. * Created by Yuicon on 2017/6/25.
  3. */
  4. import React, { Component } from 'react';
  5. import Header from "../../components/Index/Header";
  6. import './App.css';
  7. export default class App extends Component {
  8. componentDidMount() {
  9. console.log(this.props.users)
  10. }
  11. render(){
  12. return(
  13. <div className="App">
  14. <div className="App-header">
  15. <Header/>
  16. </div>
  17. <div className="App-body">
  18. <div className="welcome-view">
  19. <div className="category-nav">
  20. <div>1adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd</div>
  21. </div>
  22. <div className="main">
  23. 21adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd
  24. </div>
  25. <div className="sidebar">
  26. 31adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd1adasdasdasdasdasd
  27. </div>
  28. </div>
  29. </div>
  30. </div>
  31. )
  32. }
  33. }

同样,编辑 App.css 文件:

  1. html {
  2. font-size: 12px;
  3. font-family: -apple-system,PingFang SC,Hiragino Sans GB,Arial,Microsoft YaHei,Helvetica Neue,sans-serif;
  4. text-rendering: optimizeLegibility;
  5. background-color: #f4f5f5;
  6. color: #333;
  7. word-break: break-all;
  8. }
  9. .App {
  10. text-align: center;
  11. }
  12. .App-header {
  13. position: relative;
  14. height: 5rem;
  15. }
  16. .main-header {
  17. background: #fff;
  18. border-bottom: 1px solid #f1f1f1;
  19. color: #909090;
  20. height: 5rem;
  21. z-index: 250;
  22. position: fixed;
  23. top: 0;
  24. left: 0;
  25. right: 0;
  26. transition: all .2s;
  27. }
  28. .main-header .visible {
  29. transform: translateZ(0);
  30. }
  31. .container {
  32. display: flex;
  33. align-items: center;
  34. height: 100%;
  35. position: relative;
  36. width: 100%;
  37. }
  38. .main-header .container {
  39. max-width: 960px;
  40. min-width: 960px;
  41. margin: auto;
  42. }
  43. .logo {
  44. margin-right: 2rem;
  45. }
  46. .logo-img {
  47. border-style: none;
  48. }
  49. .nav-menu ul{
  50. background-color: white;
  51. }
  52. .nav-menu ul li{
  53. font-size: 1.33rem;
  54. }
  55. .nav-menu ul li:hover{
  56. border-bottom: 0 solid white !important;
  57. background-color: white !important;
  58. }
  59. .nav-menu button{
  60. margin-left: 0 !important;
  61. font-weight: 500;
  62. font-size: 1.3rem;
  63. }
  64. .contribute {
  65. }
  66. .contribute:after{
  67. content: "|";
  68. position: absolute;
  69. top: 24px;
  70. left: 100%;
  71. color: hsla(0,0%,59%,.4);
  72. }
  73. .login-btn {
  74. }
  75. .login-btn:after {
  76. content: "\B7";
  77. margin: 0 .4rem;
  78. }
  79. .register-dialog {
  80. padding: 2rem;
  81. width: 26.5rem !important;
  82. max-width: 100%;
  83. font-size: 1.167rem;
  84. box-sizing: border-box;
  85. }
  86. .App-body {
  87. position: relative;
  88. margin: 0 auto;
  89. width: 100%;
  90. max-width: 960px;
  91. height: 100vh;
  92. }
  93. .welcome-view {
  94. position: relative;
  95. display: flex;
  96. justify-content: space-between;
  97. margin-top: 1.767rem;
  98. }
  99. .category-nav {
  100. background-color: #db1f00;
  101. width: 140px;
  102. position: fixed;
  103. top: 6.66rem;
  104. }
  105. .main {
  106. background-color: #08c6a7;
  107. width: 560px;
  108. margin-left: 13rem;
  109. }
  110. .sidebar {
  111. background-color: #e3e001;
  112. width: 19.2rem;
  113. box-sizing: border-box;
  114. }

可能已经有同学注意到了,我们在 App.js 里导入了一个目前还不存在的组件。现在,我们来创建它:

  • 首先,创建 src/components/Index 目录,在该目录下创建 Header.js 。
  1. digag
  2. ├── README.md
  3. ├── node_modules
  4. ├── package.json
  5. ├── .gitignore
  6. ├── public
  7. └── favicon.ico
  8. └── index.html
  9. └── manifest.json
  10. └── src
  11. └── components
  12. └── Index
  13. └── Header.js
  14. └── App.css
  15. └── App.js
  16. └── App.test.js
  17. └── index.css
  18. └── index.js
  19. └── logo.svg
  20. └── registerServiceWorker.js

编辑 Header.js 文件

  1. /**
  2. * Created by Yuicon on 2017/6/25.
  3. */
  4. import React, {Component} from 'react';
  5. import {Button, Input, Menu} from "element-react";
  6. export default class Header extends Component {
  7. constructor(props) {
  8. super(props);
  9. this.state = {
  10. searchInput: '',
  11. };
  12. }
  13. handleSelect = (index) => {
  14. console.log(index);
  15. };
  16. handleIconClick = () => {
  17. console.log('handleIconClick', this.state.searchInput);
  18. };
  19. render() {
  20. return (
  21. <header className="main-header visible">
  22. <div className="container">
  23. <a href="/" className="logo">
  24. <img src="//gold-cdn.xitu.io/v3/static/img/logo.a7995ad.svg" alt="掘金" className="logo-img"/>
  25. </a>
  26. <div className="nav-menu">
  27. <Menu defaultActive="1" mode="horizontal" onSelect={this.handleSelect}>
  28. <Menu.Item index="1">首页</Menu.Item>
  29. <Menu.Item index="2">专栏</Menu.Item>
  30. <Menu.Item index="3">收藏集</Menu.Item>
  31. <Menu.Item index="4">发现</Menu.Item>
  32. <Menu.Item index="5">标签</Menu.Item>
  33. <Menu.Item index="6">
  34. <Input
  35. size="small"
  36. icon="search"
  37. placeholder="搜索掘金"
  38. onIconClick={this.handleIconClick}
  39. onChange={(value) => this.setState({searchInput: value})}
  40. />
  41. </Menu.Item>
  42. <Menu.Item index="7">
  43. <Button type="text" icon="edit" className="contribute">投稿</Button>
  44. </Menu.Item>
  45. <Menu.Item index="8">
  46. <Button type="text" className="login-btn"
  47. onClick={ () => console.log('登录') }>登录</Button>
  48. <Button type="text" onClick={ () => console.log('注册') }>注册</Button>
  49. </Menu.Item>
  50. </Menu>
  51. </div>
  52. </div>
  53. </header>
  54. )
  55. }
  56. }
  • 我们在 Header.js 文件里导入了 element-react UI库的组件, 所以需要在 package.json 文件里添加依赖。
  1. //省略部分代码
  2. "dependencies": {
  3. "element-react": "^1.0.11",
  4. "element-theme-default": "^1.3.7",
  5. "react": "^15.6.1",
  6. "react-dom": "^15.6.1"
  7. },

运行命令:

  1. npm install
  2. or
  3. yarn install

根据 element-react 文档,在 index.js 文件中导入样式

  1. import 'element-theme-default';
  2. //省略部分代码
  • 现在再重新运行项目,我们可以看到这样的页面:

是的没错,这就是编写一个属于自己的掘金教程。
下篇教程会加入 Redux 进行登录注册操作

项目代码地址:https://github.com/DigAg/digag-pc-react
vue2版项目代码地址:https://github.com/DigAg/digag-pc-vue2
相应后端项目代码地址:https://github.com/DigAg/digag-server

React 实践项目 (一)的更多相关文章

  1. React 实践项目 (二)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  2. React 实践项目 (三)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...

  3. React 实践项目 (五)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  4. Immutable.js 以及在 react+redux 项目中的实践

    来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...

  5. 在React旧项目中安装并使用TypeScript的实践

    前言 本篇文章默认您大概了解什么是TypeScript,主要讲解如何在React旧项目中安装并使用TypeScript. 写这个的目的主要是网上关于TypeScript这块的讲解虽然很多,但都是一些语 ...

  6. 技术实践丨React Native 项目 Web 端同构

    摘要:尽管 React Native 已经进入开源的第 6 个年头,距离发布 1.0 版本依旧是遥遥无期."Learn once, write anywhere",完全不影响 Re ...

  7. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  8. React Native 项目实战-Tamic

    layout: post title: React Native 项目实战 date: 2016-10-18 15:02:29 +0800 comments: true categories: Rea ...

  9. React Native 项目运行在 Web 浏览器上面

    React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...

随机推荐

  1. javaWeb学习总结(11)- 监听器(Listener)学习

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其 实就是一个实现特定接口的普 ...

  2. Swift 入门之简单语法(六)

    KVC 字典转模型构造函数 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [Str ...

  3. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...

  4. Oracle listener服务启动后又停止的解决方案

    这是Oracle监听服务.忘了说我的版本是Oracle10g. 我装完Oracle数据库之后,然后用第三方工具plsql去连接,提示no listener,首先我反复检查tnsnames.ora配置文 ...

  5. 游戏UI框架设计(五): 配置管理与应用

    游戏UI框架设计(五) --配置管理与应用 在开发企业级游戏/VR/AR产品时候,我们总是希望可以总结出一些通用的技术体系,框架结构等,为简化我们的开发起到"四两拨千金"的作用.所 ...

  6. mybatis中$和#java代码演示

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 内容来源:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下 ...

  7. JavaSE教程-02Java基本语法-练习

    请说出下面的运算结果及解释为什么 System.out.println(1+1+"1");//? System.out.println("1"+1+1);//? ...

  8. weather API 天气api接口 收集整理

    腾讯 http://sou.qq.com/online/get_weather.php?callback=Weather&city=南京 中国天气-weather.com.cn http:// ...

  9. (转)addEventListener()与removeEventListener()详解

    转自:http://www.111cn.net/wy/js-ajax/48004.htm addEventListener()与removeEventListener()用于处理指定和删除事件处理程序 ...

  10. homebrew & brew cask使用技巧及Mac软件安装

    homebrew 安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/m ...