React todolist例子(传参传方法)

分三个组件
父组件(index.jsx)和两个子组件(addlist.jsx,todolist.jsx)
父组件传子组件的方法有两个
第一种:props方式
传值
如:<child fffss={this.state.data} />   data是父类constructor(){this.state={data:"父类数值"} }
传方法
如:<child fangfaName={this.父类方法名.bind(this,这里可以选择添加多个参数)}/>
子类开始调用
传值:
this.props.fffsss就能获取值
传方法:
this.props.fangfaName(参数) 就能调用对应父类的方法
第二种:ref方法
ref方式有局限性,相同的名字只能赋值一次
传值(同一个组件内):
<input ref="myInput" type="text"/>   调用:this.refs.myInput.target  。就能获取当前对象
方法:
<child ref="diaoyong" />    调用是: this.refs.diaoyong.子类的方法。这是在父类里的写法

index.jsx

var React=require("react");
var ReactDOM=require("react-dom");
//显示子组件
var Todolist=require("./page/todolist.jsx");
//新增子组件
var Addlist=require("./page/addlist.jsx");

class Main extends React.Component{
	constructor(props){
		super(props);
		this.state={
			arr:[],
			finishNum:0
		}
	    this.delArr=this.delArr.bind(this)
	} //constructor

	//新任务添加到数组内的方法
	addTask(newItem){
		let arrlist=this.state.arr;
		arrlist.push(newItem);
		console.log(arrlist);
		this.setState({
			arr:arrlist
		})
	}
	
	//删除(替代)任务方法
	delArr(){
		let data=this.state.arr;
		let xxxxa=[];
		for (var i = 0; i < data.length; i++) {
			if(data[i].bol==false){
				xxxxa.push(data[i])
			}
		}
		console.log(xxxxa);
		this.setState({
			arr:xxxxa
		})
	}
	//获取当前选中对象的方法
	changeArr(obj){
		let list=this.state.arr;
		list.forEach((item,index)=>{
			if (item.id==obj.id) {
				item.bol=obj.bol;
			}
		})
		this.setState({
			arr:list
		})
	}
	//修改当前双击对象属性方法
	changeObj(obj){
		let list=this.state.arr;
		list.forEach((item,index)=>{
			if (item.id==obj.id) {
				item.showbol=!obj.showbol;
				item.mess=obj.mess;
			}
		})
		console.log(list);
		this.setState({
			arr:list
		})
	}

	render(){
		return (
			<div>
			<h1>任务便签</h1>
			<button onClick={this.delArr}>删除</button>	
			<Todolist showlist={this.changeArr.bind(this)} todo={this.state.arr} updateDisplay={this.changeObj.bind(this)}	/>
			<span>已完成了:{this.state.finishNum}</span>
			<span>总计:{this.state.arr.length}</span>
			<Addlist  addMethod={this.addTask.bind(this)}/><br/>
			</div>
			)
	}
}

ReactDOM.render(<Main/>,document.getElementById("box"))

addlist.jsx

var React=require("react");
//用于赋值给id
var index=0;
class Addlist extends React.Component{
	constructor(props){
		super(props);
		this.addObj=this.addObj.bind(this);
	}
	addObj(){
		let mess1=this.refs.myInput.value;
		let id1=index++;
		let bol1=false;
		let obj={
			id:id1,
			mess:mess1,
			bol:bol1,
			showbol:false
		}
		//调用父类传过来的方法
		this.props.addMethod(obj);
	}
	render(){
		return (
			<div>
			<input type="text" ref="myInput"/><br/>
			<button onClick={this.addObj}>新增</button>
			</div>
			)
	}
}

module.exports=Addlist

todolist.jsx

var React=require("react");
var ReactDOM=require("react-dom");

class Todolist extends React.Component{
	constructor(props){
		super(props);
		this.handleClick=this.handleClick.bind(this);
		this.updateArr=this.updateArr.bind(this);
		this.updateMess=this.updateMess.bind(this);
	}
	//获得当前勾选checkbox值
	handleClick(e){
		let bol1=e.target.checked;
		let id1=e.target.value;
		let obj={
			id:id1,
			name:"",
			bol:bol1,
		}
		//调用父类传来的方法,对应父类的changeArr方法
		this.props.showlist(obj);
	}
	//修改方法
	updateArr(item){
		/*console.log(this.refs.updateInput.value);*/
		/*item.mess=this.refs.updateInput.value;*/
		this.props.updateDisplay(item);
	}
	updateMess(e,item){
        console.log(e.target.value.length);
        if (e.target.value.length>0) {
        	item.mess=e.target.value;
        }    
		this.props.updateDisplay(item);
	}

	render(){
		const show={
			display:'inline'
		}
		const hide={
			display:'none'
		}
	    var vm=this;	
		var ddss=this.props.todo.map(function(item,i){
				return(
				//key值必须唯一并且值不能被再次改变
				<li key={item.id}><input type="checkbox" value={item.id} name="choose1" 
				onChange={(e)=>vm.handleClick(e)} style={item.showbol==false?show:hide}
				/><input type="text" style={item.showbol==true?show:hide} ref="updateInput" onBlur={(e)=>{vm.updateMess(e,item)}}/>
				<span onDoubleClick={()=>vm.updateArr(item)} style={item.showbol==false?show:hide}>{item.mess}</span></li>
				)
				})

		return (	
			<ul>
			{ddss}
			</ul>
			)		
	}
}

module.exports=Todolist;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值