首页 > 其他分享 >CRUD案例

CRUD案例

时间:2023-03-19 19:33:14浏览次数:30  
标签:comment item CRUD state 案例 attitude time id

import './index.css'
import avatar from './images/avatar.png'
import React from 'react'
import { v4 as uuid } from 'uuid'


// 时间格式化
function formatDate (time) {
  return `${time.getFullYear()}-${time.getMonth()}-${time.getDate()}`
}

class App extends React.Component {
  state = {
    // hot: 热度排序  time: 时间排序
    active: 'hot', // 控制tab激活的关键状态
    tabs: [
      {
        id: 1,
        name: '热度',
        type: 'hot'
      },
      {
        id: 2,
        name: '时间',
        type: 'time'
      }
    ],
    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
      }
    ],
    comment: '', // 评论中的内容
  }
  // tab切换回调
  switchTab = (type) => {
    this.setState({
      active: type
    })
  }
  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">
              {
                this.state.tabs.map(tab => (
                  <li
                    onClick={() => {
                      this.switchTab(tab.type)
                    }}
                    key={tab.id}
                    className={tab.type === this.state.active ? 'on' : ''}
                  >按{tab.name}排序</li>
                ))
              }
            </ul>
          </div>
          {/* 当前项的type值和记录下来的type值进行比对 */}

          {/* 添加评论 */}
          <div className="comment-send">
            <div className="user-face">
              <img className="user-head" src={avatar} alt="" />
            </div>
            <div className="textarea-container">
              {/* 输入框 受控组件的方式拿到输入框中的数据 */}
              <textarea
                cols="80"
                rows="5"
                placeholder="发条友善的评论"
                className="ipt-txt"
                value={this.state.comment}
                onChange={this.textareaChange}
              />
              <button className="comment-submit" onClick={this.pubComment}>发表评论</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) => (
                <div className="list-item" key={item.id}>
                  <div className="user-face">
                    <img className="user-head" src={avatar} alt="" />
                  </div>
                  <div className="comment">
                    <div className="user">{item.author}</div>
                    <p className="text">{item.comment}</p>
                    <div className="info">
                      <span className="time">{formatDate(item.time)}</span>
                      <span
                        onClick={() => this.toggleLike(item)}
                        className={item.attitude === 1 ? 'like liked' : 'like'}>
                        <i className="icon" />
                      </span>
                      <span className={item.attitude === -1 ? 'hate hated' : 'hate'}>
                        <i className="icon" />
                      </span>
                      <span className="reply btn-hover" onClick={() => { this.deleteComment(item.id) }}>删除</span>
                    </div>
                  </div>
                </div>
              ))
            }
          </div>
        </div>
      </div>)
  }

  // 受控组件的回调
  textareaChange = (e) => {
    this.setState({
      comment: e.target.value
    })
  }

  // 发表评论
  pubComment = (e) => {
    // 提交评论
    if (!this.state.comment.length) {
      return
    }
    this.setState({
      list: [
        ...this.state.list,
        {
          id: uuid(), // 唯一性
          author: '斯皮尔伯格',
          comment: this.state.comment,
          time: new Date(),
          // 1: 点赞 0:无态度 -1:踩
          attitude: 0
        },
      ]
    })

  }

  // 删除评论(根据id删除评论)
  deleteComment = (id) => {
    console.log(`id: ${id}`)
    this.setState({
      list: this.state.list.filter(item => item.id != id),
    })
  }

  // 切换喜欢
  toggleLike = (curItem) => {
    // Logic: 若1就改为0,否则改为1 - attitude
    console.log(`curItem: ${JSON.stringify(curItem)}`)
    const { attitude, id } = curItem
    this.setState({
      list: this.state.list.map(item => {
        // 判断条件 如果item.id === id 则把item的attitude修改
        // 否则跳过
        if (item.id === id) {
          return {
            ...item,
            // 当属性发生重复会进行覆盖
            attitude: attitude === 1 ? 0 : 1,
          }
        } else {
          return item
        }
      })
    })
  }
}


export default App

···

标签:comment,item,CRUD,state,案例,attitude,time,id
From: https://www.cnblogs.com/openmind-ink/p/17233998.html

相关文章

  • Vue 搜索案例:gitHub 用户搜索案例
    一:界面示例效果......
  • 优先队列(PriorityQueue)常用方法及简单案例
    1前言PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆)。具体调整如下:插入......
  • 基于tensorflow的RBF神经网络案例
    1前言在使用RBF神经网络实现函数逼近中,笔者介绍了使用Matlab训练RBF神经网络。本博客将介绍使用tensorflow训练RBF神经网络。代码资源见:RBF案例(更新版)这几天,笔者在......
  • Python三次样条插值与MATLAB三次样条插值简单案例
    1三次样条插值早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿木条画下曲线,成为样条曲线。设函数S(x)∈C2[a,b],且在每......
  • seq2seq模型案例分析
    1seq2seq模型简介seq2seq模型是一种基于【Encoder-Decoder】(编码器-解码器)框架的神经网络模型,广泛应用于自然语言翻译、人机对话等领域。目前,【seq2seq+attention】(注......
  • 【hibernate框架】一对多(多对一)双向CRUD-关于delete2
    如果没有关联关系,平常我们使用save、get、update、delete方法即可对实体对象进行增删改查,但是一旦实体对象有关联关系的时候,就不能直接使用save、get......
  • 3.2 案例引入
    【案例1】进制转换十进制整数N向其他进制数d(二、八、十六)的转换是计算机实现计算基本问题转换法则:除以d倒取余该转换法则对应一个简单算法原理:n=(ndivd)*d+nmod......
  • tensorrt官方案例 python运行
    1、案例数据下载1)-f配置案例的下载内容,会自动下载到案例文件夹中downloader.py-dD:/Programs/TensorRT-8.4.1.5/-f./yolov3_onnx/download.yml2、downloader.py中......
  • ACP云原生容器工程师 - 应用案例
    集群规划构建容器部署中的ECS选型在创建Kubernetes实例时,物理部署实体的选型对上层应用的性能起着非常大的影响。通过大型客户在云容器部署实践的统计,很大一部分应用在......
  • 不安全案例
    packageedu.wtbu;//不安全的买票publicclassDemo08{publicstaticvoidmain(String[]args){buyTicketbuyTicket=newbuyTicket();newThre......