react案例1:todoList
创始人
2024-11-03 20:08:15
0

案例效果: 

一、App组件和header输入框的交互:

需求:header输入框中输入活动项,回车之后添加在app组件的state状态中

实现:1、通过在App父组件中添加一个事件,子组件中可以通过this.props.a的方法触发;

        2、子组件中调用方法并通过参数传递需要增加的数据

 (1).App组件

 import React, { Component } from 'react' import Header from './components/Header'; import List from './components/List'; import Footer from './components/Footer'; import './App.css';  class App extends Component {   state={todos:[     {id:'001',name:'吃饭',done:true},     {id:'002',name:'睡觉',done:true},     {id:'003',name:'打代码',done:false},   ]}    a=(info)=>{      const{todos}=this.state      const newTodos=[info,...todos]      console.log('this',this)     //  修改状态      this.setState({todos:newTodos})   }  render(){     return (         
); } } export default App;

(2)header组件

import React, { Component } from 'react' import {nanoid} from 'nanoid' import './index.css' export default class Header extends Component {     addMessage=(event)=>{         const {keyCode,target}=event         if(keyCode===13){             if(!target.value.trim()){                 alert('输入不能为空')                 return             }             console.log(target.value)             const info={id:nanoid(),name:target.value,done:false}             this.props.a(info)         }     }     render() {       return (         
) } }
二、实现鼠标移入移出展示效果
import React, { Component } from 'react' import './index.css'  export default class Item extends Component {     state={mouse:false}    handleMouse=(flag)=>{      return ()=>{         console.log(flag)         this.setState({mouse:flag})         console.log('mouse',this.state.mouse)      }   }   render() {     const {name,done}=this.props     const {mouse}=this.state     return (       
{/* defaultChecked只管一上来是不是勾选,如果是checked则是后续不能修改 */} {
  • {backgroundColor:mouse?'#ddd':'white'}} onMouseEnter={this.handleMouse(true)} onMouseLeave={this.handleMouse(false)}>
  • }
    ) } }
    三、选项框修改App中的状态(APP与item爷孙交互)

    总结:状态在哪里,修改状态的方法得在哪里。

    实现步骤:

    1.App中在子组件实例创建的位置绑定事件,并通过方法修改状态中的数据。

    2.中间的子组件List中继续传递props中传递的修改状态的方法

     3.item孙组件中触发需要修改状态的事件源,在事件中调用props中传递过来的方法(定义在爷组件中),并传递修改的标识参数方便App组件中的方法修改状态使用。

    代码:

    App.jsx

     import React, { Component } from 'react' import Header from './components/Header'; import List from './components/List'; import Footer from './components/Footer'; import './App.css';  class App extends Component {   state={todos:[     {id:'001',name:'吃饭',done:true},     {id:'002',name:'睡觉',done:true},     {id:'003',name:'打代码',done:false},   ]}    a=(info)=>{      const{todos}=this.state      const newTodos=[info,...todos]      console.log('this',this)     //  修改状态      this.setState({todos:newTodos})   } //   修改todos中的done   updateTodo=(id,done)=>{     const {todos}=this.state     // 匹配处理数据     const newTodos=todos.map((todoObj)=>{         if(todoObj.id===id) return {...todoObj,done}         else return todoObj     })     // 修改状态     this.setState({todos:newTodos})   }  render(){     return (         
    ); } } export default App;

     list.jsx

      render() {     console.log('list',this.props)     const {todos,updateTodo}=this.props     return (       
      {todos.map((item)=>( ) )}
    ) }

    Item.jsx

    import React, { Component } from 'react' import './index.css'  export default class Item extends Component {        state={mouse:false}    handleMouse=(flag)=>{      return ()=>{         console.log(flag)         this.setState({mouse:flag})         console.log('mouse',this.state.mouse)      }   } //  修改App组件中todos列表数据中的done  changeHandle=(event)=>{     const {id,updateTodo}=this.props     console.log(event.target.checked)     updateTodo(id,event.target.checked)   }   render() {     const {name,done}=this.props     const {mouse}=this.state     return (       
    {/* defaultChecked只管一上来是不是勾选,如果是checked则是后续不能修改 */} {
  • {backgroundColor:mouse?'#ddd':'white'}} onMouseEnter={this.handleMouse(true)} onMouseLeave={this.handleMouse(false)}>
  • }
    ) } }

    四、对props进行类型限制 

    安装库:npm i prop-types

    引用:import PropTypes from "prop-types"

    五、实现删除功能

    1、状态所在组件中绑定删除事件,并实现删除逻辑

    2、子组件或孙组件中触发事件源并调用app组件中修改状态的方法。

     

     六、实现底部全选功能和删除已完成任务

    代码: 

     import React, { Component } from 'react' import Header from './components/Header'; import List from './components/List'; import Footer from './components/Footer';  import './App.css';  class App extends Component {   state={todos:[     {id:'001',name:'吃饭',done:true},     {id:'002',name:'睡觉',done:true},     {id:'003',name:'打代码',done:false},   ]}    a=(info)=>{      const{todos}=this.state      const newTodos=[info,...todos]      console.log('this',this)     //  修改状态      this.setState({todos:newTodos})   } //   修改todos中的done   updateTodo=(id,done)=>{     const {todos}=this.state     // 匹配处理数据     const newTodos=todos.map((todoObj)=>{         if(todoObj.id===id) return {...todoObj,done}         else return todoObj     })     // 修改状态     this.setState({todos:newTodos})   }  //  删除todo   deleteTodo=(id)=>{     const {todos}=this.state     if(window.confirm('您确定删除吗?')){         const newTodos=todos.filter(item=>item.id!==id)         this.setState({todos:newTodos})     }       } //   全选按钮   checkAllTodo=(done)=>{     const {todos}=this.state     const newTodos=todos.map(todo=>{return {...todo,done}})     this.setState({todos:newTodos})   } //   删除已完成任务   deleteDone=()=>{     const {todos}=this.state     const newTodos=todos.filter(todo=>{         return !todo.done     })     this.setState({todos:newTodos})   }  render(){     return (         
    ); } } export default App;

    footer:

    import React, { Component } from 'react' import './index.css'  export default class Footer extends Component {     // 全选按钮     changeAll=(event)=>{             this.props.checkAllTodo(event.target.checked)     }     // 删除已完成     deleteDone=()=>{         this.props.deleteDone()     }   render() {     const {todos}=this.props     const total=todos.length     const checkedCount=todos.reduce((pre,cur)=>{return pre+=cur.done?1:0},0)     return (       
    已完成{checkedCount} / 全部{total}
    ) } }

     

     七、总结案例:

    1、拆分组件、实现静态组件,注意:className,style的写法

    2、动态初始化列表,如何确定将数据放在那个组件的state中?

    -----某个组件使用:放在自身的state中

    -----某些组件使用:放在他们共同的父组件state中(官方称此操作为:状态提升)

    3.关于父子之间通信:

       1.【父组件】给【子组件】传递数据:通过props传递

       2.【子组件】给【父组件】传递数据:通过props传递,要求父提前给子传递一个函数

    4.注意defaultChecked和checked的区别,类似的还有:defaultValue和value

    5.状态在哪里,操作状态的方法就在哪里

    相关内容

    热门资讯

    ia攻略/牛牛房卡代理九酷大厅... 今 日消息,九酷大厅/随意玩房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
    我来教你/金花房卡专卖店新超圣... 新超圣房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根据...
    正规平台有哪些,牛牛房卡怎么获... 微信游戏中心:青鸟大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
    一分钟实测分享”热玩吧房卡怎么... 一分钟实测分享”热玩吧房卡怎么弄“牛牛房卡哪里有卖游戏中心打开微信,添加客服【113857776】,...
    一分钟了解“如何购买金花房卡普... 悠悠大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡...
    IA解析/斗牛房卡充值天道联盟... IA解析/斗牛房卡充值天道联盟/随意玩/房卡怎么买Sa9Ix苹果iPhone 17手机即将进入量产阶...
    我来教你/牛牛充值房卡新竹大厅... 今 日消息,新竹大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
    玩家攻略”王者大厅房卡“牛牛房... 玩家攻略”王者大厅房卡“牛牛房卡哪里有卖 微信牛牛房卡客服微信号微信游戏中心打开微信,添加客服【11...
    推荐一款!牛牛房卡代理天蝎大厅... 微信游戏中心:天蝎大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
    重大通报,金花充值房卡星驰娱乐... 星驰娱乐是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
    科技实测!金花房卡出售新二号/... 您好!微信新二号大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(新二号)大厅介绍:咨询...
    终于找到“微信斗牛房卡如何购买... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
    重大通报,金花房卡是正规的新道... 今 日消息,新道游/新皇豪房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新...
    一秒了解”百万牛房卡获取“哪里... 房卡获取是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:113857776许多玩家在游戏中会购买房卡...
    我来教你/斗牛房间怎么创建的南... 南瓜大厅/新道游房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 ...
    重大通报,牛牛房卡制作链接新众... 微信游戏中心:新众亿/皇豪互娱房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
    ia实测“微信链接斗牛房卡多少... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
    正版授权!金花房卡专卖店鲨鱼众... 您好!微信鲨鱼众娱大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(鲨鱼众娱)大厅介绍:...
    实测分享”辣椒互娱房卡详细充值... 实测分享”辣椒互娱房卡详细充值“牛牛房卡批发平台游戏中心打开微信,添加客服【113857776】,进...
    IA解析/牛牛房卡怎么获得天酷... 天酷大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...