javascript - 用于在 React.js 中检查互联网连接的可重用钩子(Hook)

标签 javascript reactjs

对于我的示例应用程序,我试图检查是否存在互联网连接,为此我使用了可重用的 Hook ,如下所示:

function useNetwork() {
    const [isOnline, setNetwork] = useState(window.navigator.onLine);
    const updateNetwork = () => {
        setNetwork(window.navigator.onLine);
    };
    useEffect(() => {
        window.addEventListener("offline", updateNetwork);
        window.addEventListener("online", updateNetwork);
        return () => {
            window.removeEventListener("offline", updateNetwork);
            window.removeEventListener("online", updateNetwork);
        };
    });
    return isOnline;
}

问题是它在 Chrome 中工作,但是当我在 Safari 中检查时尝试关闭 wifi 时仍然 isOnline 返回 true,我也在 safari 的控制台中尝试过,作为 window.navigator。 isOnline 返回 true。

阅读不同的问题,here Danilo建议发送httpRequest并检查。

那么我应该向 google.com 这样的任何网站发送一个 get 请求,以便我可以了解状态并将我的 onLine 值设置为 true。因为我认为我需要轮询这个,因为上面的钩子(Hook)会在 dom 更改时进行处理。

我怎样才能实现这个目标,或者有什么更好的方法?我如何在上面的可重用 Hook 中实现这一点。

最佳答案

你可以做这样的事情,并有一个API端点/或调用任何可靠的API

const useNetworkStatus = () => {
    const [isOnline, setStatus] = useState();
    useEffect(() => {
        (async () => {
            try {
                window.networkPoll = setInterval(async () => {
                    const networkStatus = await fetch(/*your api*/);
                    if (networkStatus.code != 200) {
                        setStatus(false);
                    }
                    if (networkStatus.code == 200) {
                        setStatus(true);
                    }

                }, 5000);
            }
            catch (error) {
                setStatus(false);
            }
        })();
    }, []);
};

关于javascript - 用于在 React.js 中检查互联网连接的可重用钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243172/

相关文章:

javascript - 警告 : Functions are not valid as a React child. 如果您从渲染中返回一个组件而不是 <Component/>,则可能会发生这种情况

javascript - 函数仅在 React Native 中运行两次后才返回参数

javascript - d3 错误 : <path> attribute d: Expected number date

javascript - 从回调中访问 `this`

javascript - 以编程方式打开和关闭 Chart.js 工具提示

javascript - 为什么在 react-native 中使用 this.props.navigator.replace 再次渲染同一个场景?

javascript - 为什么不能使用 splice() 将子字符串插入数组?

javascript - Babel 不允许没有 .js 文件扩展名的导入

reactjs - useQuery(来自 React Query)与 React Hook Form 抛出无效的 Hook 调用

javascript - 用户滚动到特定div的底部时,标题应显示