029_回调ref中调用次数的问题
官网中说:
关于回调 refs 的说明
如果 ref
回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null
,然后第二次会传入参数 DOM 元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。
上面说的是更新的时候调用
而一开始初始化的时候没有更新也就不会被调用2次
状态切换才是组件的更新,你正常进行的交互不算更新
//创建组件
class Demo extends React.Component {
state = {
isHot: false,
}
showInfo = () => {
const {input1} = this
alert(input1.value)
}
// changeWeather = () =>{}
// 这种状态形式
changeWeather = () => {
// 获取原来的状态
const {isHot} = this.isHot
this.setState({isHot: !isHot})
}
render() {
const {isHot} = this.state
return (
<div>
<h2>今天天气很{isHot ? "热" : "凉"}</h2>
<input ref={(currentNode) => {
this.input1 = currentNode
console.log("@ ", currentNode);
}} type="text"/><br/>
<button onClick={this.showInfo}>点我提示输入的数据</button>
<button onClick={this.changeWeather}>改变</button>
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<Demo/>, document.getElementById('test'))
除了初始化的那次,每点击一次,都调用2次,第一次null,第二次才有值
弹幕: 原来是react官方的bug
回复: 兄弟,官方的bug人家不叫bug,叫特性
通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题
官方的这句话,晦涩难懂
看下面代码演示
代码
//创建组件
class Demo extends React.Component {
state = {
isHot: false,
}
showInfo = () => {
const {input1} = this
alert(input1.value)
}
// changeWeather = () =>{}
// 这种状态形式
changeWeather = () => {
// 获取原来的状态
const {isHot} = this.state
this.setState({isHot: !isHot})
}
saveInput = (c) => {
this.input1 = c;
console.log('@',c);
};
render() {
const {isHot} = this.state
return (
<div>
<h2>今天天气很{isHot ? "热" : "凉"}</h2>
{/*<input ref={(currentNode) => {
this.input1 = currentNode
console.log("@ ", currentNode);
}} type="text"/><br/>*/}
<input ref={this.saveInput} type="text"/><br/>
<button onClick={this.showInfo}>点我提示输入的数据</button>
<button onClick={this.changeWeather}>改变</button>
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<Demo/>, document.getElementById('test'))
官方说了,这个没什么影响