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

React系列实战篇:增加登录(四)

时间:2023-03-26 20:28:15 JavaScript

快来加入我们吧!《小河山菜鸟》为前端开发者提供技术资料和系列基础文章。为了更好的用户体验,请移步我们的官网小河山菜鸟(https://xhs-rookies.com/)学习,及时获取最新文章。“代码裁缝”,如果您对我们的文章感兴趣,或者想提点建议,请关注“小河山菜鸟”微信公众号,与我们取得联系,您也可以在微信上观看我们的文章。每一个建议或认可,都是对我们莫大的鼓励!实践案例(四):完善留言板登录这次我们学到了一些新的内容,需要对之前的版本进行修改。首先,我们需要一个登录页面,并通过HOC(HigherOrderComponent)添加认证功能。添加路由跳转以改善页面。添加路由yarn添加react-router-dom。我们先添加react-router来修改路由配置。我们需要修改index.js。之前的index.js只有App.js。我们在index.js中添加路由配置。ReactDOM.render(,document.getElementById('root'),)默认情况下,我们让页面指向登录页面。登录页面登录状态维护如果我们登录成功,我们应该有一个地方存放登录是否成功的信息,为后续的认证做准备,我们使用localstorage进行数据持久化处理。this.props.history.replace('/home')window.localStorage.islogin='1'认证跳转我们需要在登录页面进行认证,加载完成我们让登录页面判断,如果已经登录in,然后我们跳转到首页,这里我们使用react组件生命周期中的componentDidMount()方法来判断是否加载完成。componentDidMount(){letlocalStorage=window.localStorageif(localStorage.islogin==='1'){this.props.history.replace("/home")}}最终组合classLoginextendsPureComponent{componentDidMount(){letlocalStorage=window.localStorageif(localStorage.islogin==='1'){this.props.history.replace('/home')}}constructor(props){super(props)this.state={username:'',password:'',}}render(){return(

欢迎来到XXX博客区

用户名:{this.setState({用户名:e.target.value})}}/>
<divclassName="formItem">密码:{this.setState({password:e.target.value})}}/>
{this.handleLogin()}}>登录
)}handleLogin(){if(this.state.username&&this.state.password){this.props.history.replace('/home')window.localStorage.islogin='1'alert('Welcome!')}else{alert('请输入您的用户名和密码!')}}}exportdefaultLogin不需要组件上次我们抽象了InputComponent输入框组件和EvaluateComponent列表显示component并将它们放在component文件夹中,我们先将这两个组件直接放在App.js中我们只需要抽象出一个评论组件,在最后一个EvaluateComponent列表展示组件中加入我们的点赞功能,就可以点赞列表中的每一条评论。所以我们修改首页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首页修改首页鉴权我们这里也需要鉴权,也就是说如果在浏览器直接进入home,如果没有登录,我们需要让它跳转到login登录页面。我们可以使用与登录相同的方式吗?加载完成后判断再跳转呢?componentDidMount(){letlocalStorage=window.localStorageif(localStorage.islogin==='1'){this.props.history.replace("/home")}}这里其实有个问题。如果我们加载完成后跳转,是不是每个页面都要加?但是这个认证其实是一个通用的功能。如果还有个人信息页,是不是也需要这样的功能?高阶组件认证我们使用高阶组件进行认证,所以以后如果每个页面都需要认证,只需要被高阶组件包裹即可。importReactfrom'react'import{Redirect}from'react-router-dom'exportdefaultfunctioncheckRole(WrapperComponent){letlocalStorage=window.localStoragereturn(props)=>{if(localStorage.islogin==='1'){return}else{return}}}然后我们包装主页(App.js)exportdefaultcheckRole(App)logoutoption我们之后登录成功,那么我们自然要在主页面添加注销选项,注销后,如果再次进入主页面,会被鉴权判断重定向到登录页面。handleLogout(){window.localStorage.islogin='0'this.props.history.replace("/login")}最终主页面如下:importReact,{PureComponent}from'react'importCommentfrom'./comment'importcheckRolefrom'./checkRole'import'./App.css'classAppextendsPureComponent{constructor(){super()this.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.状态返回({this.handleLogout()}}>退出登录

{title}

{desc}评论

{comments.map((item,index)=>{return({this.changeLike(index)}}{...item}/>)})}this.changeText(e)}placeholder="请输入评论"/>{this.addComment()}}>发表)}handleLogout(){window.localStorage.islogin='0'this.props.history.replace('/login')}changeText(e){this.setState({text:e.target.value})}changeLike(index){letnewArray=[...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={}exportdefaultcheckRole(App)总结在这里我们整个React案例就结束了。虽然是一个简单的消息案例,但是包含了很多知识点。从最开始的HTML到脚手架的创建,添加了首页鉴权,通过PropTypes检查传入的数据是否符合要求,通过HOC(HigherOrderComponents)增加常用组件的功能。直接预览推荐使用codesanbox在线快速获取当前实战案例。CodeSandBox的下一部分在这里预览。我们已经完成了React的基础知识学习。下一节,我们将进军更高的山峰——Hooks,敬请期待!