我试图把头缠在新的react钩子api上。具体来说,我正在尝试构建一次经典的用例:
componentDidUpdate(prevProps) {
if (prevProps.foo !== this.props.foo) {
// animate dom elements here...
this.animateSomething(this.ref, this.props.onAnimationComplete);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我尝试使用功能组件和构建相同的组件useEffect,但不知道如何实现。这是我尝试的:
useEffect(() => {
animateSomething(ref, props.onAnimationComplete);
}, [props.foo]);
Run Code Online (Sandbox Code Playgroud)
这样,仅在props.foo更改时才调用效果。那确实有效–但是!由于将其eslint-plugin-react-hooks标记为错误,因此它似乎是反模式。效果内使用的所有依赖项都应在依赖项数组中声明。因此,这意味着我必须执行以下操作:
useEffect(() => {
animateSomething(ref, props.onAnimationComplete);
}, [props.foo, ref, props.onAnimationComplete]);
Run Code Online (Sandbox Code Playgroud)
但这不会导致掉毛错误,但完全无法实现仅在props.foo更改时调用效果的目的。我不希望在其他道具或裁判改变时调用它。
现在,我读到一些有关使用useCallback这种包装的信息。我试过了,但没有得到进一步的解决。
有人可以帮忙吗?
我已经创建了一个自定义的基于类的 vue 组件,我正在尝试从父组件访问它的方法和/或计算属性。Vue Docs 中有一个示例解释了我正在尝试做的事情(https://vuejs.org/v2/guide/components-edge-cases.html#Accessing-Child-Component-Instances-amp-Child-元素)。所以基本上就是这个
class ParentComponent extends Vue {
someMethod() {
(this.$refs.myChildRef as ChildComponent).focus()
}
}
class ChildComponent extends Vue {
focus() {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这会导致 TS 错误:“TS2339:属性 'focus' 在类型 'Vue' 上不存在”
很明显,打字稿没有看到我的 ChildComponent 有其他方法。
尽管如此,该代码在运行时仍然有效,所以它似乎只是一个打字稿问题。
有谁知道如何解决这个问题?