聊天室案例实现保姆级教学

11 篇文章 0 订阅
10 篇文章 0 订阅

老样子先看效果图

准备工作

1.需要用到样式重置文件reset.css,emmm没有自己写也行将padding margin等去除;

2.下载并引入axios;

3.接口文档(不用担心跨域),或者使用自己的接口;

        接口:http://www.liulongbin.top:3006/api/robot

        请求:GET

        参数:spoken 表示我们输入的内容

        返回:
                {
                  "data": {
                            "type": 5000,
                            "info": {
                              "text": "我是瓦利~"
                                      }
                              },
                  "message": "success"
                }

4.开始冻手。。。

js部分

// 首先创建一个自执行函数
(function () {
    // 获取元素
    let header = document.querySelector('.header')
    let ipt = document.querySelector('.ipt')
    let send = document.querySelector('.send')
    // 注册事件
    send.addEventListener('click', sendHandler)
    // 回车发送
    ipt.addEventListener('keyup', function (e) {
        if (e.keyCode == '13') {
            sendHandler()
        }
    })
    // 信息数组
    let msgArr = [

    ]
    // 发送事件
    function sendHandler() {
        let value = ipt.value // 输入框的值
        if (value === '') return // 输入框为空不执行以下代码
        console.log(value.length);
        // 控制输入字数,可自定义
        if (value.length < 10) {
            // 将自己的信息存储到数组
            msgArr.push({
                type: 'person', // 信息类型(用于判断谁发出的信息)
                content: value
            })
            renderMsg(msgArr)// 渲染信息
            ipt.value = '' // 清空输入框
            header.innerText = '正在输入中....' // 更改对方输入状态
            // 发起请求
            axios.get('http://www.liulongbin.top:3006/api/robot',
                {
                    params: {
                        spoken: value
                    }
                }
            ).then(res => {
                // console.log(res.data.data.info.text);
                // 将对方返回的信息添加进数组
                msgArr.push({
                    type: 'robot', // 信息类型(用于判断谁发出的信息)
                    content: res.data.data.info.text
                })
                header.innerText = '瓦利'
                renderMsg(msgArr) // 对方响应后再次调用此函数将信息渲染出来
            }).catch(err => {
                console.log(err);
            }).finally(() => {
                console.log('消息列表:', msgArr);
            })
        } else {
            alert('字数超过限制')
        }

    }
    // 渲染信息
    function renderMsg(arr) {
        let html = arr.map((msg) => {
            // 判断信息的类型
            if (msg.type === 'person') {
                return `
                <div class="msg person">
                    <div class="content">${msg.content}</div>
                    <img width="40" height="40" src="./img/person.jpeg" alt="">
                </div> `
            } else {
                return `
                <div class="msg robot">
                  <img width="40" height="40" src="./img/robot.jpeg" alt="">
                  <div class="content">${msg.content}</div>
                </div>`
            }
        }).join('')
        document.querySelector('.msg-box').innerHTML = html
    }
}())

html部分

<header class="header">瓦利</header>
  <main class="msg-box">
    <!-- 人 -->
    <!-- <div class="msg person">
      <div class="content">要不要吃点什么?</div>
      <img width="40" height="40" src="./img/person.jpeg" alt="">
    </div> -->
    <!-- 机器 -->
    <!-- <div class="msg robot">
      <img width="40" height="40" src="./img/robot.jpeg" alt="">
      <div class="content">我也要算我一份</div>
    </div> -->
  </main>
  <footer class="footer">
    <input class="ipt" type="text">
    <span class="send">发送</span>
  </footer>
  <script src="./js/axios.js"></script>
  <script src="./js/index.js"></script>

css部分

:root {
    font-size: 10px;
}

body {
    background-color: #2b2b2b;
}

.header {
    color: white;
    line-height: 4.4rem;
    text-align: center;
    font-size: 1.6rem;
    height: 4.4rem;
    background-color: #151717;
    width: 100%;
    border-bottom: 1px solid rgb(46, 46, 46);
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
}

.msg-box {
    display: flex;
    flex-direction: column;
    padding: 54px 10px 59px;
}

.msg-box .msg {
    display: flex;
    margin-bottom: 10px;
}

.msg-box .msg img {
    border-radius: 3px;
}

.msg-box .msg .content {
    min-height: 40px;
    max-width: calc(100vw - 120px);
    color: #fff;
    display: flex;
    align-items: center;
    padding: 10px;
    font-size: 14px;
    border-radius: 3px;
    line-height: 18px;

}


.msg-box .robot .content {
    background: #282828;
    margin-left: 10px;
}

.msg-box .person .content {
    background: #22b661;
    margin-right: 10px;
}

.msg-box .person {
    align-self: flex-end;
}

.footer {
    height: 4.9rem;
    position: fixed;
    left: 0;
    bottom: 0;
    right: 0;
    background-color: #151717;
    border-top: 1px solid rgb(46, 46, 46);
    display: flex;
    align-items: center;
    flex-shrink: 0;
    justify-content: space-evenly;
}

.ipt {
    border: none;
    background-color: rgb(58, 58, 58);
    height: 3rem;
    width: 80%;
    border-radius: .5rem;
    padding-left: 1rem;
}

.send {
    width: 16%;
    border-radius: .5rem;
    height: 3rem;
    line-height: 3rem;
    text-align: center;
    color: white;
    background-color: #24b15d;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

object not found

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值