首页 > 其他分享 >react____tab点击切换状态的实现

react____tab点击切换状态的实现

时间:2023-09-16 17:35:25浏览次数:38  
标签:react ____ state tab time active type id

// 实现思路:点击谁就把谁的type属性交给state中的active

完整代码
import './index.css'
import avatar from './images/avatar.png'
import React from 'react'

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

class App extends React.Component {
  state = {
    // hot: 热度排序  time: 时间排序
    tabs: [
      {
        id: 1,
        name: '热度',
        type: 'hot'
      },
      {
        id: 2,
        name: '时间',
        type: 'time'
      }
    ],
    active: 'hot',   //控制tab激活的关键状态
    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切换回调
  switchTab = (type) => {
    console.log('切换', type)
    // 实现思路:点击谁就把谁的type属性交给state中的active
    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 => (
                  // 是否有on表示当前状态是否是激活的  
                  <li
                    onClick={() => this.switchTab(tab.type)}
                    key={tab.id}
                    className={tab.type === this.state.active ? 'on' : ''}
                  >按{tab.name}排序</li>
                ))
              }
            </ul>
          </div>

          {/* 添加评论 */}
          <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"
              />
              <button className="comment-submit">发表评论</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 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">删除</span>
                    </div>
                  </div>
                </div>
              ))
            }
          </div>
        </div>
      </div>)
  }
}


export default App

核心代码

state = {
    // hot: 热度排序  time: 时间排序
    tabs: [
      {
        id: 1,
        name: '热度',
        type: 'hot'
      },
      {
        id: 2,
        name: '时间',
        type: 'time'
      }
    ],
    active: 'hot',   //控制tab激活的关键状态

  // 声明一个回调函数  tab切换回调
  switchTab = (type) => {
    console.log('切换', type)
    // 实现思路:点击谁就把谁的type属性交给state中的active
    this.setState({
      active: type
    })
  }

 {/* 排序 */}
          <div className="tabs-order">
            <ul className="sort-container">
              {
                this.state.tabs.map(tab => (
                  // 是否有on表示当前状态是否是激活的  
                  <li
                    onClick={() => this.switchTab(tab.type)}
                    key={tab.id}
                    className={tab.type === this.state.active ? 'on' : ''}
                  >按{tab.name}排序</li>
                ))
              }
            </ul>
          </div>

实现思路: 记录当前点击项 上面的代码在 active:"hot"中记录点击项
2) 通过动态类名的控制 classNmae={tab.type===this.state.active?"on":""} 比对当前项目的tab值和记录下来的tab值是否相等
3) 如果相等就有资格获取on 这样就会有一个激活的状态 同一个时间下只有一个会被激活

首先设置active:hot 这是一个初始化的状态
之后使用点击事件传入type 就是点击时需要改变的数据
在react中的点击事件通过 this.setState({}) // 进行状态的改变 同时需要css的样式可以看出来效果

标签:react,____,state,tab,time,active,type,id
From: https://www.cnblogs.com/tingbao-zhimeng/p/17707001.html

相关文章

  • c# 初级
    值类型与引用类型值类型与引用类型的区别在于,值类型存储在栈中,而引用类型存储在堆中。值类型:int、double、char、decimal、bool、enum、struct等。引用类型:string、数组、自定义类、集合、object、接口等。值传递与引用传递在方法调用中,值类型是将实际值传递给方法,引用类型......
  • 带附件和图片的邮件发送脚本
    1importsmtplib2fromemail.mime.textimportMIMEText3fromemail.mime.multipartimportMIMEMultipart4fromemail.mime.imageimportMIMEImage5fromemail.headerimportHeader67#第三方SMTP服务器8mail_host="mail.163.com"#服务器9mai......
  • 5-MySQL列定义
    1.列定义说明:在MySQL中,列定义(ColumnDefinition)是用于定义数据库表中每一列的结构的语句。它指定了列的名称、数据类型、长度、约束以及其他属性。2.主键和自增主键:PRIMARYKEY是数据库表中的一个字段,被用作主键。主键用于唯一标识表中的每一行/记录。在创建表时,通常会为主键......
  • 分页查询
    PageInfo(github)  导入依赖<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.2</version></dependency>  controller@ApiOpera......
  • 需求分析阶段
        ......
  • Go学习笔记
    这几天在学Go,记录一下一些困惑和理解channel特性查阅的资料:Go语言channel探究_go多个协程读一个channel_JE_Xie的博客-CSDN博客Go中的channel解析—Go中的并发性-知乎(zhihu.com)Go中的channel_gochannel_始梦的少年的博客-CSDN博客一、channel与blocking和deadlo......
  • rider 设置多个启动项目
    要设置多个启动项目,您可以按照以下步骤操作:1.打开Rider并导航到"Run"菜单。2.选择"EditConfigurations"以打开配置窗口。3.在左侧的配置窗口中,单击"+"图标以添加新的启动配置。4.选择您要添加的项目类型(例如,ASP.NETCore、ConsoleApplication等)。5.配置您的启动......
  • CUDA memories
    GlobalThere'salargeamountofglobalmemory.It'sslowertoaccessthanothermemorylikesharedandregisters.AllrunningthreadscanreadandwriteglobalmemoryandsocantheCPU.ThefunctionscudaMalloc,cudaFree,cudaMemcpy,cud......
  • 前端学习笔记202309学习笔记第八十玖天-完善各个模块的reducer
     ......
  • 前端学习笔记202309学习笔记第八十玖天-方法名对象的封装2
     ......