因此,我正在重新编写带有钩子的组件,但遇到了一个有趣的挑战,我需要使用componentWillReceiveProps
钩子来模仿useEffect
的某些旧行为。
我的旧代码如下:
componentWillReceiveProps(nextProps: Props) {
const prevLateVal = get(`lateMinutes[${bookingId}].value`, this.props);
const nextLateVal = get(`lateMinutes[${bookingId}].value`, nextProps); //see here,
//we use next props
if (typeof nextLateVal !== 'undefined' && prevLateVal !== nextLateVal) {
client.connect(bookingId, nextLateVal === null ? 0 : nextLateVal);
}
}
您知道,我正在基于nextProps发起一个const
,然后在if
语句中我基于nextVal进行了几次检查,现在,我知道我们可以指定另一个参数useEffect
仅在道具更改时运行它,但是那些检查又如何呢?我该如何实现类似于nextProps
的东西?
答案 0 :(得分:1)
您可以创建自定义挂钩:
pytorch
并将其用于function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.prevLateVal = value;
});
return ref.prevLateVal;
}
useEffect()
答案 1 :(得分:0)
您不需要挂钩即可处理预渲染生命周期。 在返回JSX之前,只需将它们放入功能组件中,因为该函数本身等效于基于类的组件的render方法。
答案 2 :(得分:0)
您可以使用useRef
保存上一个道具,并在道具更改时使用useEffect
来运行,就像这样:
function MyComponent(props) {
const prevProps = useRef(props);
useEffect(() => {
const prevLateVal = get(`lateMinutes[${bookingId}].value`, prevProps.current);
const nextLateVal = get(`lateMinutes[${bookingId}].value`, props);
if (typeof nextLateVal !== 'undefined' && prevLateVal !== nextLateVal) {
client.connect(bookingId, nextLateVal === null ? 0 : nextLateVal);
}
prevProps.current = props;
}, [props, bookingId]);
return (<div>...</div>)
}
答案 3 :(得分:0)
根据当前的逻辑,您只希望对lateMinutes[${bookingId}].value
更改产生副作用:
const Component = props => {
useEffect(() => {
console.log('prop lateMinutes changed');
// ...
}, [props[`lateMinutes[${bookingId}].value`]);
return ...
};