我不能满足所有条件:
- 我需要在
useCallback
中使用某些功能,因为我将其设置为子组件的道具(用于防止重新渲染) - 我需要使用
debounce
,因为我的功能是“终点”并且可以被称为〜100次/秒 - 去抖后,我需要获取当前值(实际值)。
我对最后一点有疑问,去抖动(1000ms)后我的值已过时。
如何使用useCallback
+ debounce
获取当前值? (警报中的值必须与页面相同)
//ES6 const,let
//ES6 Destructuring
const { Component,useCallback,useState,useEffect } = React;
const SUBChildComponent = (props) => (<button onClick={props.getVal}>Getvalue with debounce</button>);
const ChildComponent = () => {
// some unstable states
const [someVal1,setsomeVal1] = useState(0);
const [someVal2,setsomeVal2] = useState(0);
const [someVal3,setsomeVal3] = useState(0);
// some callback witch works with states AND called from subClild components
const getVal = useCallback(_.debounce(() => {
alert(`${someVal1}\n${someVal2}\n${someVal3}`);
},1000),[someVal1,someVal2,someVal3]);
// some synthetic changes
useEffect(() => {
const id = setInterval(() => setsomeVal1(someVal1 + 1),50);
return () => clearInterval(id);
},[someVal1]);
// some synthetic changes
useEffect(() => {
const id = setInterval(() => setsomeVal2(someVal2 + 1),100);
return () => clearInterval(id);
},[someVal2]);
// some synthetic changes
useEffect(() => {
const id = setInterval(() => setsomeVal3(someVal3 + 1),250);
return () => clearInterval(id);
},[someVal3]);
return <React.Fragment><SUBChildComponent getVal={getVal}/><br/>{someVal1}<br/>{someVal2}<br/>{someVal3}
</React.Fragment>;
};
class App extends Component {
render() {
return (<div><ChildComponent/></div>);
}
}
ReactDOM.render(<App/>,document.querySelector(".container"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
<div class="container"></div>