当前位置: 首页 > Web前端 > JavaScript

React系列实战篇:消息函数(三)

时间:2023-03-27 16:49:17 JavaScript

快来加入我们吧!《小河山菜鸟》为前端开发者提供技术资料和系列基础文章。为了更好的用户体验,请移步我们的官网小河山菜鸟(https://xhs-rookies.com/)学习,及时获取最新文章。“代码裁缝”,如果您对我们的文章感兴趣,或者想提点建议,请关注“小河山菜鸟”微信公众号,与我们取得联系,您也可以在微信上观看我们的文章。每一个建议或认可,都是对我们莫大的鼓励!实践案例(三):消息功能的改版这次我们学到了一些新的内容,需要对之前的版本进行改版。添加了点赞功能如果我们需要点赞评论怎么办?如果像上次那样传入一个属性来控制是否显示点赞,这样就可以了。上次我们抽象了InputComponent输入框组件和EvaluateComponent列表显示组件这两个组件,这次需要添加一个评论组件来完成点赞功能。去除不必要的组件上次我们将InputComponent输入框组件和EvaluateComponent列表显示组件抽象出来放在组件文件夹中。我们首先将这两个组件直接放在App.js中。(为了直观起见,我们把这两个抽象的直接放在App.js中)我们只需要抽象一个评论组件,在最后一个EvaluateComponent列表展示组件中加入我们的like函数,在每个列表中我们就可以点赞所有的评论。所以我们修改首页App.js如下:.state={title:'HelloReact',desc:'你知道有这样一个团队吗?他们怀揣梦想,努力奋斗。作为一群大学新秀,他们放弃了平时的娱乐时间,选择了一起学习,一起成长。他们把平时的学习笔记和心得总结成文章。目的很简单,希望能帮助像他们这样的菜鸟?你想知道更多吗?快搜微信公众号:小河山菜鸟,加入他们吧!',评论:[{headPortrait:'https://xhs-rookies.com/img/rookie-icon.png',time:newDate(2021,4,14,21,2,30),nickName:'SmallRookie',detail:'这是一个即将出系列文章的团队,一起期待他们的作品吧!',liked:true,likeNum:23,},],text:'',}}render(){const{title,desc,comments,text}=this.状态返回(

{title}

{desc}
评论</p>{comments.map((item,index)=>{return({this.changeLike(index)}}{...item}/>)})}
this.changeText(e)}placeholder="请输入评论"/>
{this.addComment()}}>发表
)}changeText(e){this.setState({text:e.target.value})}changeLike(index){让newArray=[...this.state.comments]letnewItem={...newArray[index]}if(newItem.liked){newItem.liked=falsenewItem.likeNum-=1}else{newItem.liked=truenewItem.likeNum+=1}newArray[index]=newItemthis.setState({comments:newArray,})}addComment(){if(!this.state.text){alert('请输入消息内容')return}letdetail=this.state.textthis.setState({text:''})letnewComment={headPortrait:'https://xhs-rookies.com/img/rookie-icon.png',time:newDate(),nickName:'小菜鸟',detail,liked:false,likeNum:0,}this.setState({comments:[newComment,...this.state.comments],})}}App.propTypes={}exportdefaultApp结合评论组件的点赞功能首先我们要考虑这个组件需要什么功能。除了上次抽象的:需要有头像,时间,名字,内容,我们还需要一个点赞按钮。单击此按钮变为红色,数字加一,再次单击颜色变为灰色,数字减一。changeLike()}>{!!likeNum&&likeNum}一个span用来存放点赞图标,一个span用来显示点赞数。数据检测这一次,我们的数据变得越来越多。当越来越多的数据传给组件后,我们如何判断,或者保证传进来的内容是正确的呢?(它是空的吗?)我们使用propType进行内容检测。如果有错误,可以快速帮助我们定位错误并进行修改。Comment.propTypes={昵称:PropTypes.string.isRequired,时间:PropTypes.object.isRequired,头像:PropTypes.string.isRequired,细节:PropTypes.string.isRequired,喜欢:PropTypes.bool.isRequired,likeNum:PropTypes.number.isRequired,changeLike:PropTypes.func.isRequired,}最后组合然后我们在前面的EvaluateComponent列表展示组件中添加like函数,添加数据检测功能,我们的评论组件就完成了。importReact,{PureComponent}from'react'importPropTypesfrom'prop-types'import'./comment.css'classCommentextendsPureComponent{render(){const{nickName,time,headPortrait,detail,liked,likeNum,changeLike}=this.propsreturn(
{nickName

{this.getTime(time)}

{detail}changeLike()}>{!!likeNum&&likeNum})}getTime(time){constyear=time.getFullYear()常数月=时间。getMonth()+1constday=time.getDate()consthour=String(time.getHours()).padStart(2,'0')constminute=String(time.getMinutes()).padStart(2,'0')constsecond=String(time.getSeconds()).padStart(2,'0')返回`${year}.${month}.${day}${hour}:${minute}:${second}`}}Comment.propTypes={nickName:PropTypes.string.isRequired,time:PropTypes.object.isRequired,headPortrait:PropTypes.string.isRequired,detail:PropTypes.string.isRequired,liked:PropTypes.bool.isRequired,likeNum:PropTypes.number.isRequired,changeLike:PropTypes.func.isRequired,}exportdefaultComment源码地址项目github地址直接预览推荐使用codesanbox的形式快速获取当前实战案例在线CodeSandBox预览在下section在下一节中,我们将描述在React中使用State的相关信息,深入理解setState方法和一些相关内容。敬请关注!