为啥 getElementsByClassName 在 React 功能组件中返回未定义?

Posted

技术标签:

【中文标题】为啥 getElementsByClassName 在 React 功能组件中返回未定义?【英文标题】:Why is getElementsByClassName returning undefined in React funcitonal component?为什么 getElementsByClassName 在 React 功能组件中返回未定义? 【发布时间】:2022-01-03 09:07:47 【问题描述】:

在我使用 React.js 的应用程序中的一个功能组件中,调用 getElementsByClassName 会返回“未定义”,显然,有一个带有 className 的部分标记。

const ExpansionView = (props) => 

const validExpansion = [
    "Classic", "Naxxramas", "Goblins vs Gnomes",
];

//create a function that will filter by validExpansion and create an Expansion component
const expansionGenerator = (props) => 
    **// the line below returns undefined!**
    const expansionViewTag = document.getElementsByClassName('expansionView')[0];

    for (let i = 0; i < validExpansion.length; i += 1) 
        expansionViewTag.appendChild(
            <Expansion specificExpansion=props.expansion[validExpansion[i]] selectExpansion=props.selectExpansion/>
        )
    
    return 


return(
    // clearly, here is a section tag with the className.
    <section className='expansionView'>
       expansionGenerator(props)
    </section>
)

导出默认ExpansionView;

请看一看。谢谢

【问题讨论】:

【参考方案1】:

这将在组件安装时呈现undefined,但是如果您重新呈现组件,那么它将返回您期望的结果,因为在初始加载时,您的函数在 react 将 expansionView 附加到 DOM 之前执行。您还可以在渲染后使用 refs 或 useEffect 获取 dom,但在您的情况下不太有用。 对于您的问题,您可以简单地使用 react 组件来呈现您的过滤器组件。

 const App = () => 

   const ExpansionComponent = () => 
     // props is shared between App and ExpansionComponent because of closure
     // Do you filters
     return <FilteredComponents /> // example

     

   return (
     <div className="your-class"> 
       <ExpansionComponent />
    </div>
   )

 

【讨论】:

以上是关于为啥 getElementsByClassName 在 React 功能组件中返回未定义?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 javascript 命令不执行?

js为啥根据id就可以找到容器里的子元素,而根据类名就找不到?

getElementsByClassName() 有两个类

getElementsByClassName( )方法

IE8 兼容 getElementsByClassName

兼容性比较好的getElementsByClassName函数