12、React系列之--微博 Demo 01

版权声明:本文为博主原创文章,未经博主允许不得转载。

PS:转载请注明出处
作者:TigerChain
地址:http://www.jianshu.com/p/f4e6ecfd52fd
本文出自TigerChain简书

React 教程系列

教程简介

  • 1、阅读对象

本篇教程适合有React基础的朋友阅读(基础知道 state,props, 组件化思想,webpack+yarn 等),老鸟直接略过,如果有误,欢迎指出,谢谢。

React 系列之--微博 Demo 02 终结篇:http://www.jianshu.com/p/9fddf666b718

正文

经过前面几个章节的学习,我们基本上把 React 的一些基本知识掌握了,那么我们把以前掌握的知识综合起来做一个小案例。来对前面知识做一个归纳和复习,本节知识需要前面知识学习,如果没有学习,建议先去学习前面的章节比如 webpak yarn babel等。

1、无图无真相,效果图

weibo-demo.gif

如图所示,今天要写的 Demo 就长上面的样子

2、可以学到什么

通过本 Demo 我们可以学习到组件的组合,内联 css 样式使用,flexbox布局,组件化思想以及组件之间的交互等内容。

3、Demo分析

首先我们把微博组件化,如何划分组件呢,我们以下图为划分组件的标准,当然这不是唯一标准,只是我觉得比较好的组件分的方式。

weibo-component.png

4、开始撸码

1、微博的雏形

接下来我们就手把手从0开始开发微博 demo,我们使用 webpack+yarn 来构建项目,在 mac 环境下(由于本人电脑是 mac ),win 下基本差不多.

1、进入命令行在指定目录中新建 weibodemo

mkdir weibodemo

2、使用 yarn 初始化项目

yarn-init.png

3、添加依赖

yarn add babel-core babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-0  react react-dom webpack webpack-dev-server --dev

经过前面几节的学习,我们都知道安装这些依赖是什么意思,这里不再多说,如果明折,可以看 webpack 这节http://www.jianshu.com/p/732c4d501668

通过以上操作,如果没有什么问题,就会把所需要的依赖添加进去了。

weibo-adddepend.png

4、在项目根目录新建 .babelrc 并输入以下内容

{
  "presets": ["react", "es2015","stage-0"]
}

5、在项目根目录中新建 webpack.config.js 并配置

module.exports = {
  entry:  __dirname + "/app/main.js",
  output: {
    path: __dirname + "/public",
    filename: "bundle.js"
  },
  module: {
    loaders: [
      //babel配置
    {
      test:/\.js$/,
      exclude: /node_modules/,
      loader: 'babel-loader'
    }
    ]
  },

  devServer:{
    contentBase: "./public",//本地服务器所加载的页面所在的目录
    // colors: true,//终端中输出结果为彩色
    historyApiFallback: true,//不跳转
    inline: true//实时刷新
  }
}

6、在根目录中新建 public 和 app 目录,并且分别新建index.html 和 �main.js

#  index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>WeiBo demo</title>
</head>
<body>
<div id="container"></div>
<script src='bundle.js'></script>
</body>
</html>

#  main.js

import React from 'react' ;
import ReactDOM from 'react-dom' ;

//模拟微博列表数据
var datas = {
  "data":[
    {
        "myUrl":"../img/tiger.jpg",
        "headUrl":"../img/tiger.jpg",
        "nickName":"小东",
        "content":"今天天气不错呀,我可以好好的出去玩玩了!!!",
        "NoCollect":"13",
        "NoForward":"20",
        "NoComment":"14",
        "NoPointGreat":"42",
        "sendTime":"11月10日"
    },
    {
        "myUrl":"../img/tiger.jpg",
        "headUrl":"../img/tiger.jpg",
        "nickName":"小高",
        "content":"今天去了了家新开的超市,里面东西真多呀",
        "NoCollect":"12",
        "NoForward":"2",
        "NoComment":"12",
        "NoPointGreat":"23",
        "sendTime":"10月8日",
        "contentImgUrls":[
            {"img":"../img/qiche.jpg"},
            {"img":"./img/qiche.jpg"},
            {"img":"../img/qiche.jpg"},
            {"img":"./img/qiche.jpg"}
        ]
    },
    {
        "myUrl":"../img/me.png",
        "headUrl":"../img/ruobin.png",
        "nickName":"Michelle不想让人看见",
        "content":"看了一部电视,感觉非学不错,给大家推荐一下",
        "NoCollect":"132",
        "NoForward":"202",
        "NoComment":"142",
        "NoPointGreat":"423",
            "sendTime":"11月6日"
    }
  ]
  }

//定义微博列表组件
 class WeiboList extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    //遍历微博列表
    var ItemView = datas.data.map(function(item,index) {
    return (<div key={index}>
      {item.nickName} <br/>
        
      {item.content}
      <hr />
    </div>) ;
    //渲染列表
    return (<div>{ItemView}</div>);
  }
}


ReactDOM.render(
 <WeiboList />,
  document.getElementById('container')
) ;

接下来我们在 package.json 中配置脚本

"scripts":{
    "start":"webpack-dev-server --progress --port 8899"
}

从上面的代码我们可以知道,我们创建一个微博列表组件,然后渲染在界面上,并且我们模拟了一些微博列表的数据,那么我们看看效果:

在命令行中输入 yarn start,此过程如果没有什么问题,我们在浏览器输入 loaclhost:8899 会看到以下效果:

weibo-first.png

从图中我们可以看到微博的雏形出来了。

2、样式和组件化微博

通过上面我们知道,我们把微博列表和数据都写在同一个界面中了,React 玩的就是组件化,所以我们接下来把微博列表定义成一个组件并且把数据抽出来。以下步骤都是在上面 demo 的基础上去改的。

1、在 app 目录中新建一个 WeiBoList.js

# WeiBoList.js

import React, { Component, PropTypes } from 'react';

//定义一个微博列表组件
export default class WeiBoList extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    //遍历微博列表
    var ItemView = datas.data.map(function(item,index) {
    return (<div key={index}>
      {/* 昵称 */}
      {item.nickName}
    <br />
      {/* 内容 */}
      {item.content}
        <hr />
    </div>)
  }) ;
    //渲染列表
    return (<div>{ItemView}</div>);
  }
}

WeiBoList.propTypes = {
};

2、将数据抽取在 json 文件件中

在 weibodemo 根目录中新建 data/data.json 文件

{"data":[
    {
        "myUrl":"../img/tiger.jpg",
        "headUrl":"../img/tiger.jpg",
        "nickName":"小东",
        "content":"今天天气不错呀,我可以好好的出去玩玩了!!!",
        "NoCollect":"13",
        "NoForward":"20",
        "NoComment":"14",
        "NoPointGreat":"42",
        "sendTime":"11月10日"
    },
    {
        "myUrl":"../img/tiger.jpg",
        "headUrl":"../img/tiger.jpg",
        "nickName":"小高",
        "content":"今天去了了家新开的超市,里面东西真多呀",
        "NoCollect":"12",
        "NoForward":"2",
        "NoComment":"12",
        "NoPointGreat":"23",
        "sendTime":"10月8日",
        "contentImgUrls":[
            {"img":"../img/qiche.jpg"},
            {"img":"./img/qiche.jpg"},
            {"img":"../img/qiche.jpg"},
            {"img":"./img/qiche.jpg"}
        ]
    }
    
    ]
}


PS:这里我为了说明,json 微博列表数据给出了两个,实际以 demo 中为准,或者自行添加。

3、修改 main.js

# main.js

import React from 'react' ;
import ReactDOM from 'react-dom' ;
//引入微博列表组件
import WeiBoList from './WeiBoList.js' ;
//导入数据
import datas from '../data/data.json' ;

//渲染微博列表 并且把数据 通过props传递到 WeiBoList中
ReactDOM.render(
 <WeiBoList data={datas.data}/>,
  document.getElementById('container')
) ;

我们可以看到 main.js 我们修改的还是比较大的,把模拟数据和微博组件都从 main.js 中移除了,并且导入数据和微博列表组件( WeiBoList ),并且以 props 形式把数据传递给 WeiBoList 组件

4、再次修改 WeiBoList.js

我们使用 props 属性拿到微博列表数据然后遍历,所以这里有一点小修改,代码就不贴出来了,直接上个图吧。

weibolist-props.png

其中黄色的部分就是我们修改过的。

5、 运行看效果,如果没有什么问题则会显示如下:

weibo-second.png

我们成功以的把数据抽取出来,并且迈开了组件人的第一步。

6、引入 css 样式

以上我们都是在进行无样式开发,现在我们就引用 flexbox 和 css 给界面添加一些色彩。

  • 1、在项目根目录添加 css/ListStyle.css
.listRootViewStyle {
  background-color: #eee; /**背景色*/
  padding: 10px;  /**设置内边距**/
}
  • 2、修改WeiBoList.js
modify-weibolist.png

其中黄色的部分是我们新添加的。

  • 3、我们添加 style-loader css-loader

如果完成上面的部分,那还没有完,我们必须添加 style-loader css-loader 否则 2 中的修改会报错。

yarn add style-loader css-loader --dev

PS:其中 css-loader 是用来读取 css 文件的
style-loader 将css插入到页面中

我们运行一下项目,不出什么问题会报如下错

not-config-css-loader.png

这是什么原因呢,看过webpack这一章的朋友应该知道我们安装一个 loader 就要在 webpack.config.js 中去配置。

接下来我们在 webpack.config.js 中去配置 css-loader 和 style-loader 。

add-css-loader.png

从图中可知我们添加了黄色部分

#  style-loader css-loader

{
    test: /\.css$/,
    loader: 'style-loader!css-loader?modules'
}

7、运行一下看效果

weibo-bgstyle.png

我们看到 css 样式成功表现在微博上了。

3、完善微博列表

上面我们给微博添加了样式,但是这看起来还不是很舒心,我们把微博列表抽成一个组件,如下:

weibo-footview.png

由图可以知道,这个组件基本上是上下分隔的,以分隔线为主。可以做成两个 view ,当然也可以自定义成两个组件。我们这里就分成图片列表组件 CommentListImgs.js 评论组件 CommentForm.js 和微博列表组件 WeiBoListItem.js,我们一步一步来,先做 WeiBoListItem.js,后面再一步步的添加 CommentForm.js 和 CommentListImgs.js

以下功能都是在上面的基础上完成的。

1、在app中新建 WeiBoListItem.js 组件

import React, { Component, PropTypes } from 'react';

import styles from '../css/ListItemStyle.css' ;

/**
 * 微博评论列表组件
 */
export default class WeiBoListItem extends Component {
  constructor(props) {
    super(props);
    this.state = {
      //是否点击评论按钮标志
      isComment:false,
      //默认的条目数据
      itemData:this.props.itemData,
      //默认的点赞数
      zanNum:this.props.itemData.NoCollect
    }
  }

  render() {
    //取得传递过来的数据
    let data = this.props.itemData ;


    return (
      <div>
          {this._renderHeadView(data)}

          <hr className={styles.hrStyle}/>

          {this._renderFooterView(data)}
          
        </div>
     );
  }

  /**
   * 渲染顶部View
   */
  _renderHeadView(data){
    return(
      <div className={styles.item}>
     
     
        <div className={styles.topRightView}>
          <div className={styles.nickNameAndSendTime}>
            <span>{data.nickName}</span>
            <span>{data.sendTime}</span>
          </div>
          
          <p>{data.content}</p>
        </div>
      </div>
    )
  }

  /**
   * 渲染底部View
   */
   _renderFooterView(data){
       return(
         <div className={styles.commentViewStyle}>
           <ul className={styles.ulStyle}>
             <li className={styles.liStyle} >点赞:{this.state.zanNum}</li><div className={styles.shuxian}></div>
             <li className={styles.liStyle} >评论:{data.NoComment}</li><div className={styles.shuxian}></div>
             <li className={styles.liStyle} >转发:{data.NoPointGreat}</li>
           </ul>
         </div>
       );
   }
 }

2、在 css 目录中新建 ListItemStyle.css


.item{
  display: flex;
  background-color: #fff;
  padding: 20px;
}
/*顶部view样式*/
.topRightView{
  display: flex;
  flex-direction: column;
  flex:1
}
/*昵称和发送时间样式*/
.nickNameAndSendTime{
  display: flex;
  justify-content: space-between; /**主轴的对齐方式*/
}


/*横线样式*/
.hrStyle{
  margin-top: -1px;
}
.ulStyle{
  display:flex;
  height: 40px;
  align-items: center;
  margin-left: -40px;
}
/*点赞 转发*/
.liStyle{
  display: flex;
  color: orange;
  flex: 1.0;
  font-size: 16px;
  justify-content: center;
}
.commentViewStyle{
  background-color: #fff;
  margin-top: -17px;
}

.shuxian{
  height: 20px;
  width: 1px;
  background-color: grey;
}

3、修改WeiBoList.js

modify-weibolist2.png

如图所示:我们修改的部分为黄色部分,最终WeiBoList.js为


import React, { Component, PropTypes } from 'react';

import styles from '../css/ListStyle.css' ;

//导入微博列表组件
import WeiBoListItem from './WeiBoListItem.js'

//定义一个微博列表组件
export default class WeiBoList extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    //遍历渲染每个条目
    var ItemView = this.props.data.map(function(item,index) {
      return <WeiBoListItem itemData= {item} key = {index}/>
    }) ;

    return(
      <div className={styles.listRootViewStyle}>
       {ItemView}
      </div>
    ) ;
}
}

WeiBoList.propTypes = {
};

4、运行看效果,就会看到我上面的效果图

component-weibo-1.gif

到此为止,我们就把微博的基本雏形搞出来了,下一节我们把评论组件和头像等做出来,并且添加事件交互 。

Demo地址

https://github.com/tigerchain/react-lesson/tree/master/lesson02/10-weibodemo

在React 系列之--微博 Demo 02 终结篇中我们会继续本篇来完成最终的效果。以下终结篇的地址。

React 系列之--微博 Demo 02 终结篇:http://www.jianshu.com/p/9fddf666b718

如果觉得对你有用,就点个喜欢吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容