【React】 10课 react实现QQ聊天框效果

react实现QQ聊天框效果如下:

首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件

npm init -y
npm i babel-standalone -D
npm i react react-dom -D

安装配置文件教程链接:https://blog.youkuaiyun.com/qq_41614928/article/details/93771657
安装完成后我们开始编写下面代码

实现代码如下:

<!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>qq聊天框</title>
  <style>
    * {margin: 0; padding: 0;}
    #app {
      width: 500px;
      border: 1px solid #000;
      text-align: center;
    }
    h2 {
      background-color: #dee1e6;
      cursor: pointer;
    }
    ul li {
      background-color: #f1f2f3;
      margin-bottom: 1px;
      padding: 10px 0;
      text-align: left;
    }
  </style>
</head>

<body>
  <!-- 所有的页面代码都是放在这里面 -->
  <div id="app"></div>
  <!-- 用于解析jsx的代码 babel引用应在前面 -->
  <script src="./node_modules/babel-standalone/babel.js"></script>
  <!-- 引用react模块,用于构建用户界面的 JavaScript 库 UI库 -->
  <script src="./node_modules/react/umd/react.development.js"></script>
  <!-- 操作VM DOM 加载顺序必须先引入react再引入react-dom-->
  <script src='./node_modules/react-dom/umd/react-dom.development.js'></script>
  <!-- 引入存放数据的js文件data.js 数据都在dataList对象内 -->
  <script src="./data.js"></script>
  <!-- 引入script类型为babel样式 这样可以解析里面的jsx代码 -->
  <script type='text/babel'>

    class App extends React.Component{
      state = {
        //设置好友列表展开显示
        arr:[true,false,false]
      }
      //点击按钮 展开/闭合 好友列表
      handleClick=(index)=>{
        const arr = this.state.arr;
        arr[index] = !arr[index];
        //将数据重新渲染到页面上
        this.setState({
          arr:arr
        })
      }
      getData=()=>{
        //拿到引入的data.js中的数据
        return dataList
      }

      render(){
        const data = this.getData();
        return(
          <div>{
            //获取data内的第一层对象名
            Object.keys(data).map((item,index)=>{
              return(
                <div key={index}>
                  <h2 onClick={ this.handleClick.bind(this,index) }> {data[item].name} </h2>
                  {
                    //当arr对应的列表为true时就遍历下面的列表显示 否则不显示
                    this.state.arr[index] && <ul>
                      {
                        data[item].list.map((item,index)=>{
                          return(
                            <li key={index}> {item.name}-({item.gender})  个性签名:{item.introduce} </li>
                          )
                        })
                      }
                    </ul>
                  }
                </div>
              )
            })
          }</div>
        )
      }
    }

    ReactDOM.render(
      <App />,
      document.getElementById('app')
    )
  </script>
</body>
</html>

存放好友数据的data.js代码如下:

const dataList = {
  "colleagues": {
    "name": "同学",
    "list": [
      {
        id: Math.random(),
        "name": "小衲",
        "gender": "女",
        "introduce": "未成年的宝宝"
      },
      {
        id: Math.random(),
        "name": "心艾",
        "gender": "男",
        "introduce": "同为未成年的宝宝"
      },
      {
        id: Math.random(),
        "name": "乌拉拉",
        "gender": "女",
        "introduce": "大家心目中的代码女神"
      }
    ]
  },
  "netFriend": {
    "name": "明星",
    "list": [
      {
        id: Math.random(),
        "name": "周星弛",
        "gender": "男",
        "introduce": "经典电影"
      },
      {
        id: Math.random(),
        "name": "李连杰",
        "gender": "男",
        "introduce": "功夫皇帝"
      }
    ]
  },
  "students": {
    "name": "闺蜜",
    "list": [
      {
        id: Math.random(),
        "name": "小红",
        "gender": "女",
        "introduce": "能吃"
      },
      {
        id: Math.random(),
        "name": "太阳",
        "gender": "女",
        "introduce": "能睡"
      },
      {
        id: Math.random(),
        "name": "蕊蕊",
        "gender": "女",
        "introduce": "能逗"
      }
    ]
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值