React-----组件和jsx小案例

  •  tab切换
  • 删除评论
  • 添加评论
  • 点赞和踩

import React, { Component } from 'react'
import "../../assets/index.css";
import tx from "../../assets/images/avatar.png";
var moment = require("moment");
export default class Index extends Component {
     state = {
        text:null,
        // hot: 热度排序  time: 时间排序
        tabs: [
          {
            id: 1,
            name: "热度",
            type: "hot",
          },
          {
            id: 2,
            name: "时间",
            type: "time",
          },
        ],
        active: "hot",
        list: [
          {
            id: 1,
            author: "刘德华",
            comment: "给我一杯忘情水",
            time: new Date("2021-10-10 09:09:00"),
            // 1: 点赞 0:无态度 -1:踩
            attitude: 1,
          },
          {
            id: 2,
            author: "周杰伦",
            comment: "哎哟,不错哦",
            time: new Date("2021-10-11 09:09:00"),
            // 1: 点赞 0:无态度 -1:踩
            attitude: 0,
          },
          {
            id: 3,
            author: "五月天",
            comment: "不打扰,是我的温柔",
            time: new Date("2021-10-11 10:09:00"),
            // 1: 点赞 0:无态度 -1:踩
            attitude: -1,
          },
        ],
      }
    //   切换tab
      changeTab = (type) => {
        this.setState({
            active:type
        })
      }
    //   删除评论
      deleteById=(id)=>{
        this.setState({
            list:this.state.list.filter(item=>item.id!==id)
        })
      }
    //   评论内容变化
      handleChangeText=(e)=>{
        this.setState({
            text:e.target.value
        })
      }
    //   发布评论
      handlerSubmit=()=>{
        const obj=  {
            id: 4,
            author: "五月天",
            comment:this.state.text,
            time: new Date(),
            // 1: 点赞 0:无态度 -1:踩
            attitude: 0,
          }
       this.setState({
        list:[...this.state.list,obj],
         text:''
       })
      }
    //   点赞和踩
      handlerAttitude=(id,att)=>{
        this.setState({
            list:this.state.list.map(item=>{
                if(item.id===id){
                    return {
                        ...item,attitude:att
                    }
                }else{
                    return item
                }
            })
        })
      }
  render() {
    return (
        <div className="App">
        <div className="comment-container">
          {/* 评论数 */}
          <div className="comment-head">
            <span>5 评论</span>
          </div>
          {/* 排序 */}
          <div className="tabs-order">
            <ul className="sort-container">
              {/* <li className="on">按热度排序</li>
              <li>按时间排序</li> */}
              {this.state.tabs.map((item) => {
                return (
                  <li  onClick={() => this.changeTab(item.type)} key={item.id} className={item.type === this.state.active ? "on" : ""}>
                    按{item.name}排序
                  </li>
                );
              })}
            </ul>
          </div>
    
          {/* 添加评论 */}
          <div className="comment-send">
            <div className="user-face">
              <img className="user-head" src="./images/avatar.png" alt="" />
            </div>
            <div className="textarea-container">
              <textarea
                cols="80"
                rows="5"
                value={this.state.text}
                onChange={this.handleChangeText}
                placeholder="发条友善的评论"
                className="ipt-txt"
              />
              <button className="comment-submit" onClick={this.handlerSubmit}>发表评论</button>
            </div>
            <div className="comment-emoji">
              <i className="face"></i>
              <span className="text">表情</span>
            </div>
          </div>
    
          {/* 评论列表 */}
          <div className="comment-list">
            {this.state.list.map((item) => {
              return (
                <div className="list-item" key={this.state.list.id}>
                  <div className="user-face">
                    <img className="user-head" src={tx} alt="" />
                  </div>
                  <div className="comment">
                    <div className="user">{item.author}</div>
                    <p className="text">{item.comment}</p>
                    <div className="info">
                      <span className="time">
                        {moment(item.time).format("YYYY-MM-DD HH:mm:ss")}
                      </span>
                      <span onClick={()=>{this.handlerAttitude(item.id,item.attitude===1?0:1)}} className={item.attitude === 1 ? "like liked" : "like"}>
                        <i  className="icon" />
                      </span>
                      <span
                        onClick={()=>{this.handlerAttitude(item.id,item.attitude===-1?0:-1)}}
                        className={item.attitude === -1 ? "hate hated" : "hate"}
                      >
                        <i className="icon" />
                      </span>
                      <span className="reply btn-hover" onClick={()=>this.deleteById(item.id)}>删除</span>
                    </div>
                  </div>
                </div>
              );
            })}
          </div>
        </div>
      </div>
    )
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值