javascript - useRef 当前仅在第二次更新时获取其值

标签 javascript reactjs typescript visnetwork

我有以下组件:

const ParentComponent: React.FC = () => {
    const networkRef: any = useRef();

    // Somewhere in the code, I call this
    networkRef.current.filter(["id0, id1, id2"]);

    return (
    ...
        <VisNetwork 
            ref={networkRef}
        />
    ...
    )
}
export default ParentComponent;

interface Props {
    ref: any;
}
const VisNetwork: React.FC<Props> = forwardRef((props: Props, ref) => {
    useImperativeHandle(ref, () => ({
        filter(items: any) {
            setFilterNodes(items);
            nView.refresh();
        }
    }));

    const [filterNodes, setFilterNodes] = useState<any[]>([]);
    const filterNodesRef = useRef(filterNodes);
    useEffect(() => {
        filterNodesRef.current = filterNodes;
    }, [filterNodes]);

    ...
    // Some code to create the network (concentrate on the nodesView filter method)
    const [nView, setNView] = useState<DataView>();
    const nodesView = new DataView(nodes, {
        filter: (n: any) => {
            if (filterNodesRef.current.includes(n.id)) {
                return true;
            }
            return false;
        }
    })
    setNView(nodesView);
    const network = new vis.Network(container, {nodes: nodesView, edges: edgesView}, options);
});
export default VisNetwork;

当我调用 network.current.filter([...]) ,它将设置filterNodes状态。此外,它应该设置 filterNodesRef里面useEffect .

但是,filterNodesRef.current仍然是空数组。

但是当我调用 network.current.filter([...])第二次,只有 filterNodesRef.current得到值和 DataView能够过滤。

为什么会这样?我以为 useRef.current将始终包含最新值。

最佳答案

我终于通过调用 refresh() 解决了这个问题useEffect 中的方法而不是 filter()方法:

useEffect(() => {
    filterNodesRef.current = filterNodes;
    nView.refresh();
}, [filterNodes]);

关于javascript - useRef 当前仅在第二次更新时获取其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62214408/

相关文章:

javascript - 在 JavaScript 中保留数组键

javascript - 显示多个 div 的输入内容

node.js - 在azure上部署React应用程序

javascript - 如何使用 Service Worker 处理 index.html 文件的缓存?

javascript - 在 VSCode 中如何正确配置 jsconfig.json 以便使用 index.js 导入的绝对路径工作?

angular - 如何根据 Angular 6 中的用户输入显示不同的错误消息

typescript 根据先前参数的值推断可能的对象键?

javascript - 递归循环遍历节点树并检查节点是否存在,如果不存在,则使用回调或promise创建它

javascript - redux-form + React-widgets DateTimePicker

gulp-uglify 后 Typescript sourcemaps 错误