react 案例的实现

先看一下如下效果

效果

这是一个 简单的 效果 左边是用户名进行登录 右边是一个答题还有遮罩

 相信大家还有刚刚创建好的 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>

你学废了吗?  下期开始进行 路由的讲解

React Refs 是 React 提供的一种访问 DOM 元素或组件实例的方法。通过 Refs,我们可以在组件中直接访问到被 Refs 引用的 DOM 元素或组件实例,从而进行一些特殊的操作。 下面,我来举一个 React Refs 的案例: 假设我们有一个 Input 组件,需要在组件加载完毕后自动获取焦点,我们可以通过 Refs 来实现这个功能。具体的实现步骤如下: 1. 在 Input 组件中定义 Refs: ```jsx class Input extends React.Component { constructor(props) { super(props); this.inputRef = React.createRef(); // 创建 Refs } render() { return <input type="text" ref={this.inputRef} />; } } ``` 2. 在 componentDidMount 生命周期中,使用 Refs 获取到 input 元素,并调用 focus() 方法: ```jsx class Input extends React.Component { constructor(props) { super(props); this.inputRef = React.createRef(); // 创建 Refs } componentDidMount() { this.inputRef.current.focus(); // 获取 input 元素并获取焦点 } render() { return <input type="text" ref={this.inputRef} />; } } ``` 这样,当 Input 组件加载完毕后,它的 input 元素就会自动获取焦点了。 注意,Refs 只能在类组件中使用,不能在函数式组件中使用。另外,Refs 的值可以是回调函数,而不仅仅是 React.createRef() 方法返回的对象。如果使用回调函数的方式,可以在回调函数中访问到组件实例或 DOM 元素,例如: ```jsx class Input extends React.Component { constructor(props) { super(props); this.inputRef = null; // 创建 Refs this.setInputRef = element => { this.inputRef = element; }; } componentDidMount() { this.inputRef.focus(); // 获取 input 元素并获取焦点 } render() { return <input type="text" ref={this.setInputRef} />; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怠惰小白程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值