Skip to main content

React中Ref的使用

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

class TodoList extends Component{
constructor(props){
super(props)
this.state={
inputValue:"",
list:[]
}
}
render(){
return (
<Fragment>
<input
type="text"
value={this.state.inputValue}
onChange={this.handleInputChange.bind(this)}
ref = {(input)=>{this.input=input}}
//这句话的意思是:我们构建了一个引用,这个引用名字叫this.input,它指向input对应的dom节点
//在react16的语法中ref(引用)等于一个函数,这个函数接收一个input,this.input指向input对应的节点
/> <button onClick={this.handleButtonClick.bind(this)}>提交</button>
<ul>
{
this.state.list.map((item,index)=>{
return <li
key={index}
onClick={this.handleItemDelete.bind(this,index)}
>
{item}
</li>
})
}
</ul>
</Fragment>
)
}
handleInputChange(e){
const value = this.input.value;
this.setState({
inputValue:value
// list:[list...,e.target.value]
})
}

handleButtonClick(){
this.setState({
list:[...this.state.list,this.state.inputValue],
//...this.state.list es6展开运算符。a=[1,2,3], ...a 它会吧a展开为 1,2,3
inputValue:""
})
}

handleItemDelete(index){
const list = [...this.state.list];//先拷贝一份
//this.state.list.splice(index,1) 这种写法是错误的
//react有一个概念叫inmutable:state不允许我们做任何的改变,如果非要改,我们可以拷贝一个副本
list.splice(index,1)
this.setState({
list:list
})
}
}

export default TodoList;

ref用于快速获取页面上的元素,写动画的时候常用,但是与setState一起使用时可能会出现一些坑,原因是setState是一部函数,有可能setState还没来的及执行,后面的都执行完了,所以与setState一起使用,放入setState第二个回调函数中