在编写组件中的方法时,经常会遇到语义化很模糊的代码,这对于团队开发是一个很大的问题。因为review代码或者合作时都会影响开发效率。或者到这核心成员离开,项目倒闭的严重影响。所以我们必须重视react代码当中的语义化。ref是个不错的工具
以前的案例中,我们写了下面的代码,使用了e.target
,这并不直观,也不好看。这种情况我们可以使用ref
来进行解决。
<input
value={this.state.inputValue}
onChange={this.inptChange.bind(this)}
//关键代码--start
ref={(input)=>{this.input=input}}
//关键代码--end
/>
TIP:this.input
这个input
可以改成你想要的其他名字
# setState
是一个异步函数
setState
的回调
if (this.state.inputValue.length>0){
this.setState({
list:[...this.state.list,this.state.inputValue],
inputValue:''
},
//关键代码--start
()=>{
console.log(this.uls.querySelectorAll('li').length)
}
//关键代码--end
)
完整代码
import React,{Component,Fragment} from "react";
import XiaojiejieItem from "./XiaojiejieItem";
class Xiaojiejie extends Component{
constructor(props){
super(props);
this.state= {
inputValue: 'yomigi',
list: ['基础按摩','精油推背']
}
}
render() {
return(
<Fragment>
<input
value={this.state.inputValue}
onChange={this.inptChange.bind(this)}
ref={(input)=>{this.input=input}}
/>
<button onClick={this.addList.bind(this)}>增加服务</button>
<ul ref={(ul)=>{this.uls=ul}}>
{
this.state.list.map((item,index)=>{
return (
<XiaojiejieItem
key={index+item}
content={item}
index={index}
deleteItem={this.deleteItem.bind(this)}
/>
)
})
}
</ul>
</Fragment>
)
}
inptChange(){
this.setState({
inputValue:this.input.value
})
}
//增加列表
addList(){
if (this.state.inputValue.length>0){
this.setState({
list:[...this.state.list,this.state.inputValue],
inputValue:''
},()=>{
console.log(this.uls.querySelectorAll('li').length)
})
}
}
deleteItem(index){
let list =this.state.list;
list.splice(index,1);
this.setState({
list:list
})
}
}
export default Xiaojiejie;