先看一下如下效果
效果
这是一个 简单的 效果 左边是用户名进行登录 右边是一个答题还有遮罩
相信大家还有刚刚创建好的 react 脚手架了,没有的话可以运行以下命令
creact-react-app 项目名称
把项目名称四个字 改成 自己想要的一个名字 最好是英文的在 App.js中去书写我们的代码
1 完成 整体页面的布局
可以清晰看到 这就是一个·左右结构的 一个效果 可以考虑弹性 布局 让我们 给整个 dom先来一个父盒子 在 里面 来两个 子盒子 可以先用 颜色 加以区分
render 后 return下代码如下
<div className='box'><div className='left'></div><div className='right'></div></div>
在 react中 我们 可以 直接对 css文件进行引入 可以去创建一个css 比如可以叫它 mine.css
在这里定义一些样式
.box {display: flex;height: 100vh;
}.left {flex: 1;background-color: red;
}.right {flex: 2;background-color: blue;
}
引入这个 css 大概看到如下 效果
import './mine.css'
出现说明引入成功 ,可以将 左边的 背景去除 将右边的 改为黑色 先完成左边的内容
左边效果
state 中 添加 username:'' 用于 接收 用户输入的用户名 添加 text 来 用于控制 文字的显示
再来一个 flag来控制 右边的样式
state = {username: '',text:'',flag:false}
在 state下面 可以添加change函数
change=(e)=>{console.log(e.target.value)this.setState({username:e.target.value})}
再添加一个 登录的函数 login
login=()=>{if(this.state.username==''){alert('请输入用户名')}else{if( this.state.username.length<6 || this.state.username>18 ){this.setState({text:'用户名长度为6-18位'})}else{this.setState({ text:'',flag:true})}}}
对其进行绑定
<div className='box'><div className='left'><input onChange={(e)=> this.change(e)} placeholder='请输入用户名' /><span style={{color:'red'}}>{this.state.text}</span><br></br><button onClick={this.login}>登录</button></div><div className={this.state.flag?'right1':'right'}></div></div>
main.css中 可以改一下
.right {flex: 2;background-color: rgb(1, 1, 2);
}
.right1 {flex: 2;}
在 state中 定义 list 以此渲染 题目
list:[{title:'br标签是干什么的?',select:['实现换行的','显示图片的','制作按钮的','实现分段的'],'answer':0},{title:'img标签是干什么的?',select:['实现换行的','显示图片的','制作按钮的','实现分段的'],'answer':1},{title:'button标签是干什么的?',select:['实现换行的','显示图片的','制作按钮的','实现分段的'],'answer':2}, {title:'p标签是干什么的?',select:['实现换行的','显示图片的','制作按钮的','实现分段的'],'answer':3},]
title是题目 select选项 answei为 正确的答案 可以再定义 如下
num:0,wrong:0,right:0,btn:'登录',aswer:-1
让我们重新更新一下 login这个函数
login=()=>{if(this.state.btn=='登录'){if(this.state.username==''){alert('请输入用户名')}else{if( this.state.username.length<6 || this.state.username.length>18 ){this.setState({text:'用户名长度为6-18位'})}else{console.log(this.state.flag);this.setState({ text:'',flag:true})this.setState({btn:'退出'})}}}else{this.setState({flag:false})this.setState({btn:'登录'})} }
更改一下 按钮的显示 左边的逻辑和样式到此完成
<button onClick={this.login}>{this.state.btn}</button>
接下来开始 进行右侧效果
<div className={this.state.flag?'right1':'right'}><h3>{this.state.list[this.state.num].title}</h3>{this.state.list[this.state.num].select.map((item,index)=>{return <div key={index} className='select'><input type='radio' name='select' onChange={()=>{this.setState({answer:index}) }} checked={index==this.state.answer} />{item}</div>})}<button onClick={this.next}>{this.state.num<this.state.list.length-1?'下一题':'重新开始'}</button><br></br>{this.state.num+1}/4 答对{this.state.right} 答错 {this.state.wrong}</div>
开始进行 next函数的定义 以此进行题目的切换
next=()=>{if(this.state.num<this.state.list.length-1){if(this.state.answer==-1){alert('请选择答案')}else{ if(this.state.answer==this.state.list[this.state.num].answer){this.setState({right:this.state.right+1})}else{this.setState({wrong:this.state.wrong+1})}this.setState({num:this.state.num+1})}this.setState({answer:-1})}else{this.setState({num:0,wrong:0,right:0})}}
到此可以实现效果的实现
代码的简化
有些代码其实是可以简化的 可以进行结构赋值
let {text,flag,list,num,answer,wrong,right,btn,btn1}=this.state
最终代码可可以写成这样
<div className='box'><div className='left'><input onChange={(e)=> this.change(e)} placeholder='请输入用户名' /><span style={{color:'red'}}>{text}</span><br></br><button onClick={this.login}>{btn}</button></div><div className={flag?'right1':'right'}><h3>{list[num].title}</h3>{list[num].select.map((item,index)=>{return <div key={index} className='select'><input type='radio' name='select' onChange={()=>{this.setState({answer:index}) }} checked={index==answer} />{item}</div>})}<button onClick={this.next}>{num<list.length-1?'下一题':'重新开始'}</button><br></br>{num+1}/4 答对{right} 答错 {wrong}</div></div>
你学废了吗? 下期开始进行 路由的讲解