首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gatsby -未定义IntersectionObserver

Gatsby -未定义IntersectionObserver
EN

Stack Overflow用户
提问于 2019-12-20 19:13:15
回答 2查看 6.5K关注 0票数 6

我正在尝试构建我的gatsby项目,但由于IntersectionObserver不被识别,我无法构建。我在InView组件中使用intersectionObserver:

代码语言:javascript
复制
import React, { useRef, useState, useEffect } from 'react'


const InView = ({ children }) => {
    const [boundingClientY, setBoundingClientY] = useState(null)
    const [direction, setDirection] = useState(null)
    const [element, setElement] = useState(null)
    const [inView, setInView] = useState(false)



    const observer = useRef(new IntersectionObserver((entries) => {
        const first = entries[0]
        const { boundingClientRect } = first
        first.isIntersecting && setInView(true)
        !first.isIntersecting && setInView(false)
        boundingClientRect.y > boundingClientY && setDirection('down')
        boundingClientRect.y < boundingClientY && setDirection('up')
        boundingClientY && setBoundingClientY(first.boundingClientRect.y)

    }))


    useEffect(() => {
        const currentElement = element
        const currentObserver = observer.current
        currentElement && currentObserver.observe(currentElement)
        // console.log(currentObserver)
        return () => {
            currentElement && currentObserver.unobserve(currentElement)
        };
    }, [element])

    const styles = {
        opacity: inView ? 1 : 0,
        transform: `
            translateY(${!inView ?
                direction === 'up' ? '-20px' : '20px'
                : 0})
            rotateY(${!inView ? '35deg' : 0})
            scale(${inView ? 1 : 0.9})
            `,
        transition: 'all 0.4s ease-out 0.2s'
    }

    return (
        <div ref={setElement} style={styles}>

            {children}

        </div>
    )
}

export default InView

我有一个用于根元素的包装器来启用全局状态,并尝试在gatsby-browser.js中导入polyfill:

代码语言:javascript
复制
import React from 'react'
import GlobalContextProvider from './src/components/context/globalContextProvider'

export const wrapRootElement = ({ element }) => {
    return (
        <GlobalContextProvider>
            {element}
        </GlobalContextProvider>
    )
}

export const onClientEntry = async () => {
    if (typeof IntersectionObserver === `undefined`) {
        await import(`intersection-observer`);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-20 21:53:04

这是构建时的错误,对吗($ gatsby构建)?如果是这样的话,这与浏览器支持无关。

事实是,IntersectionObserver是一个浏览器API,您不应该在服务器端呈现期间使用浏览器API。取而代之的是,您尝试在组件挂载之后使用它们。为了解决这个问题,在useEffect()中初始化你的观察者,而不是像你现在做的那样使用useRef()

代码语言:javascript
复制
...
const observer = useRef();

useEffect(() => {
  observer.current = new IntersectionObserver({ ... });
}, []); // do this only once, on mount
...
票数 20
EN

Stack Overflow用户

发布于 2021-07-24 00:11:21

声明一个let变量= null。这也适用于NextJS

代码语言:javascript
复制
...
let observer = null

useEffect(()=> {
observer = new IntersectionObserver(callback,optional);
},[])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59424347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档