react useRef使用与常见问题
1. Dom操作: useRef()
let app = document.querySelector('#app');
let root = ReactDOM.createRoot(app);
let { useState, useEffect, useRef } = React;
let Welcome = (props) => {
const myRef = useRef()
const handleClick = () =>{
myRef.current.focus()
}
return (
<div>
<button onClick={handleClick}>点击</button>
<input ref={myRef} type='text' />
</div>
);
}
let element = (
<Welcome />
);
root.render(element);
2. 函数组件的转发: React.forwardRef()
let app = document.querySelector('#app');
let root = ReactDOM.createRoot(app);
let { useState, useEffect, useRef, forwardRef } = React;
let Head = forwardRef((props, ref)=> {
return (
<div>
hello Head
{}
<input ref={ref} type='text' />
</div>
)
})
let Welcome = (props) => {
const myRef = useRef()
const handleClick = () =>{
myRef.current.focus()
}
return (
<div>
<button onClick={handleClick}>点击</button>
{}
<Head ref={myRef}></Head>
</div>
);
}
let element = (
<Welcome />
);
root.render(element);
3. 对普通值进行记忆, 类似于一个class的实例属性
let app = document.querySelector('#app');
let root = ReactDOM.createRoot(app);
let { useState, useEffect, useRef } = React;
let Welcome = (props) => {
const [num, setNum] = useState(0);
const count = useRef(0)
const handleClick = () =>{
count.current++;
console.log(count.current);
setNum(num + 1)
}
return (
<div>
<button onClick={handleClick}>点击</button>
</div>
);
}
let element = (
<Welcome />
);
root.render(element);
4. 结合useEffect,只在更新时触发
let app = document.querySelector('#app');
let root = ReactDOM.createRoot(app);
let { useState, useEffect, useRef } = React;
let Welcome = (props) => {
const [num, setNum] = useState(0);
const isUpdate = useRef(false)
useEffect(()=>{
if (isUpdate.current) {
console.log(num);
}
})
const handleClick = () =>{
setNum(num + 1)
isUpdate.current = true
}
return (
<div>
<button onClick={handleClick}>点击</button>
</div>
);
}
let element = (
<Welcome />
);
root.render(element);
FAQ
https://zh-hans.legacy.reactjs.org/docs/hooks-faq.html#why-am-i-seeing-stale-props-or-state-inside-my-function