refs转发
ref 转发不但可以转发指向具体的dom组件,也可以指向class组件的实例
import React from 'react'
import ReactDOM from 'react-dom';
//ref 转发不但可以转发指向具体的dom组件,也可以指向class组件的实例
class Button extends React.Component{
constructor(props){
super(props);
this.handClick = this.handClick.bind(this);
this.ccref = React.createRef();
}
handClick(){
alert('我是事件')
}
render(){
return (
<button ref={this.ccref}></button>
)
}
}
const Input = React.forwardRef((props,ref)=>{
return (
<div>
<Button ref={ref} />
<button>点击我</button>
</div>
)
})
class App extends React.Component{
constructor(props){
super(props);
this.cref = React.createRef();
}
componentDidUpdate(prevProps){
}
componentDidMount(){
//this.cref指向的是class button组件的实例
console.log(this.cref.current.ccref)
console.log(this.cref.current.handClick())
}
render(){
return (
<Input ref={this.cref} />
)
}
}
ReactDOM.render(<App />,document.getElementById('root'));
import { extend } from 'lodash';
import React, { useEffect, useRef, useState } from 'react'
import ReactDOM from 'react-dom';
function usePrevious(count){
const iref = useRef();
useEffect(() => {
iref.current = count;
});
return iref.current
}
//如何获取上一轮的props或state
//这就说明ref的值改变并不会通知到我们不会使组件重新渲染
function App(){
const [count,setCount] = useState(0);
const prevCount = usePrevious(count);
const countRef = useRef();
//解决这个问题你可以手动创建个ref 保存他修改他并读取他
//除非你正在做懒加载否则不要在渲染阶段去设置refs 你应该在事件处理函数或者是useeffect中去设置refs
//如果想要在异步的回调中获取最新的state 你可以手动创建个ref 用来保存他 修改他 并读取他
function handleClick(){
setTimeout(() => {
alert(countRef.current)
}, 3000);
}
useEffect(() => {
countRef.current = count
});
return (
<div>
{count}-上一个值:{prevCount}
<button onClick={()=>setCount(count+1)}>
点击我
</button>
<button onClick={handleClick}>show alert</button>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'));

浙公网安备 33010602011771号