首页 > 其他分享 >react todolist 3

react todolist 3

时间:2023-01-03 15:02:50浏览次数:44  
标签:isComleted title todolist react item state id todos


react todolist 3_输入框

功能:1.输入框输入事项,点击add,list增加一条,输入框清空并且聚焦;

2.点击当前checkbox,勾选文字为已完成,取消勾选文字为未完成;

父组件TodoList.js

分成了三个子组件

TodoHeader,TodoInput,List

 

import React, { Component } from 'react';
import{TodoInput,TodoHeader,List} from './index.js'

class TodoList extends Component {
constructor(){
super()
this.state={
title2:"今日事今日毕",
todos:[{
id:1,
title:"吃饭",
isComleted:true
},
{
id:2,
title:"学习",
isComleted:true
},
{
id:3,
title:"睡觉",
isComleted:false
},
]
}
}
render() {
return (
<div className="App">
<TodoHeader title='待办事项'>
{this.state.title2}
</TodoHeader>
<TodoInput btnText='add' addTodo={this.addTodo}/>
<List todo={this.state.todos} onisComletedChange={this.onisComletedChange}></List>
</div>
);
}

addTodo=(todoTitle)=>{
console.log('子元素传值',todoTitle)
//注意不能用push这样写,因为push返回的是数组的长度
// this.setState({
// todos:this.state.todos.concat({
// id:Math.random(),
// title:todoTitle,
// isComleted:false
// })
// })
//用push这样写
// const newTodos = [...this.state.todos]
// newTodos.push({
// id:Math.random(),
// title:todoTitle,
// isComleted:false
// })
// this.setState({
// todos:newTodos
// })

//第三种新值添加进数组的方法
const newlist = {
id:Math.random(),
title:todoTitle,
isComleted:false
}
this.setState({
todos:[...this.state.todos,newlist]
})
}


//点击checkbox取反
onisComletedChange=(id)=>{
console.log(id)
const data = this.state.todos.map(item=>{
if(item.id===id){
item.isComleted=!item.isComleted
}
return item
})
this.setState({
todos:data
})
}

}

export default TodoList

TodoHeader.js

import React, { Component } from 'react';

export default class TodoHeader extends Component {
render() {
console.log(this.props) //{title: "待办事项", children: "今日事今日毕"}
return (
<div>
<h1>{this.props.title}</h1>
<p>{this.props.children}</p>
</div>
);
}
}

TodoInput.js

import React, { Component,createRef } from 'react';

export default class TodoInput extends Component {
constructor(){
super()
this.state={
inputValue:''
}
this.handleAdd = this.handleAdd.bind(this)
this.handleKeyUp = this.handleKeyUp.bind(this)
//定义createRef
this.inputDom = createRef()
}
render() {
return (
<div>
<input type="text"
value={this.state.inputValue}
onChange={this.handleInput.bind(this)}
onKeyUp={this.handleKeyUp}
ref={this.inputDom}
/>
<button onClick={this.handleAdd}>{this.props.btnText}</button>
</div>
);
}

//点击添加从state中获取最新值 输入框聚焦this.inputDom.current.focus()
handleAdd(){
if(this.state.inputValue ===''){
return
}else{
//接收父组件addTodo事件,并将input参数传递给父元素
this.props.addTodo(this.state.inputValue)
console.log('inputDom',this.inputDom)
this.setState({
inputValue:""
},()=>{
this.inputDom.current.focus()
})
}
}

//获取input的值,并交给state
handleInput(e){
// console.log(e.currentTarget.value)
this.setState({
inputValue:e.currentTarget.value
})
}

//回车输入
handleKeyUp(e){
// console.log(e.keyCode)
if(e.keyCode ===13){
this.handleAdd()

this.setState({
inputValue:""
})
}

}
}

List.js

import React, { Component } from 'react';
//引入类型检查插件
import PropTypes from 'prop-types'

export default class List extends Component {
//父元素类型验证 验证todo是否是array,以及内部各项的数据类型验证
static propTypes = {
todo:PropTypes.arrayOf(PropTypes.shape({
id:PropTypes.number.isRequired,
title:PropTypes.string.isRequired,
isComleted:PropTypes.bool.isRequired,
})).isRequired
}
render() {
console.log(this.props.todo) //父组件传来的todo
let todo = this.props.todo
return (
<div>
{
todo.map(item=>{
return <div key={item.id}>{item.title}
<input
style={{marginLeft:'30px'}}
type="checkbox"
checked={item.isComleted} //默认true的选中
onChange={this.handleBoxChange.bind(this,item.id)} //当前点击的id传给onChange事件
/>
<span>{item.isComleted?'已完成':'未完成'}</span>
</div>
})
}
</div>
);
}
handleBoxChange(id){
// console.log(id)
this.props.onisComletedChange(id) //接收父元素的事件并传值

}
}

 

标签:isComleted,title,todolist,react,item,state,id,todos
From: https://blog.51cto.com/u_12422954/5985780

相关文章

  • react 做一个点赞按钮组件
      创建组件Like.js一开始设置为黑色false,isLiked如果为true渲染红心,false渲染黑心setState时用了两种方法importReact,{Component}from'react'exportdefaultclass......
  • react 渲染富文本中的标签内容
    假设拉取下来的是富文本携带html标签的内容应该如何渲染到页面:例:<div>我是富文本内容</div>在标签上使用dangerouslySetInnerHTML={{__html:this.state.article}}importRea......
  • react 中使用less
    首先npm install less-loader less --save -dev安装之后终端npm run eject   来暴露webpack的配置文件,如果报错:Removeuntrackedfiles,stashorcommitanych......
  • react 日常工作小笔记
    默认配置defaultProps默认配置通过 ​​||​​​ 操作符可以实现,React.js也提供了一种方式 ​​defaultProps​​,可以方便的做到默认配置。classLikeButtonextendsC......
  • react 父子传值
    创建父组件 Demofather.js第一种传值:在子元素标签上 title='待办事项'x={1}字符串可以用""引号传递数字类型用{}大括号传递子组件标签内部可以传递任何数据,react将自动......
  • 【React框架基础知识】React框架的简介与基本使用方法
    一、简介React:由Facebook开发的用于构建用户界面的JavaScript库(开源)。1.1为什么要学前端框架?原生Javascript有很多痛点:原生JavaScript操作DOM繁琐、效率低(DOM-API操作UI......
  • 二级多级子路由时,react面包屑获取及处理
     因react-router中路由配置时,子路由为父级路由+子路由拼接而成,故当实现面包屑时需要根据当前路由获取完整的父子路由链入参:如/layout/list/showList出参:如['/l......
  • 面试官:说说React-SSR的原理
    前言所谓同构,简而言之就是,第一次访问后台服务时,后台直接把前端要显示的界面全部返回,而不是像SPA项目只渲染一个<divid="root"></div>剩下的都是靠JavaScript脚本去......
  • 字节前端必会react面试题
    React中keys的作用是什么?Keys是React用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识。在React中渲染集合时,向每个重复的元素添加关键字对于帮助Reac......
  • 面试官:你是怎样进行react组件代码复用的
    mixinMixin设计模式Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。常......