javascript - 动态标签名称
问题描述
我正在尝试将动态标签命名系统从 React 转换为更像钩子的方法,我正在做的是首先导入和导出一些组件,以便我可以一次将它们全部拉到数组上,如下所示:
import Component1 from './Component1/Component1'
import Component2 from './Component2/Component2'
export {
Component1,
Component2
}
然后我像这样加载它们:
import { useState, useEffect } from "react";
import * as Components from './../AllComponents/Components'
function importHook() {
const [states, setStates] = useState({
components: [],
currentComponent: 0
})
useEffect(() => {
Object.entries(Components).forEach(component => {
setStates(prevState => ({ components: [...prevState.components, component[1]]}))
})
}, []) // Look's into Components and adds every component to the 'components' array so that I can use that array in the next step.
return states;
}
export default importHook
之后我继续这样做:
import React from 'react'
import './MainComponent.scss'
import importHook from '../../importHook'
function MainComponent() {
const { components, currentComponent } = importHook() // Pull and set the values using the hook
const TagName = components[currentComponent] // Created the tag name by targeting the first function, seeing as currentComponent should be 0 at the time
console.log('Tag: ' + TagName) // undefined
return (
<div className="h-100">
<TagName /> // crashes everything
</div>
)
}
export default MainComponent
所以我发现<TagName />
导致一切崩溃的原因是因为某些东西运行了两次。
如果您删除<TagName />
以便可以从 to 获取输出console.log
并currentComponent
在其中const TagName
更改0
,您会注意到第一次console.log
运行是返回undefined
,而第二次运行返回存储在数组中的实际函数。
所以真的我的问题是,为什么/什么执行两次?我有一个想法,我假设它是因为forEach
添加到数组中或类似的东西,但我不完全确定。
可以做些什么,以便我们可以在返回这里之前准备好所有值?我还没有尝试过,但我想我可以引入一个if statement
检查变量是否为空,如果是,显示某种加载屏幕或烦躁,但这对我来说似乎不是最好的解决方案,我知道有很多方法可以做某事,但并非所有方法都很好,因为我对这一切都很陌生,最好阅读/询问。
关于阅读部分,找不到太多关于解决这个问题或我提到的实现的信息,我尝试过 useEffect、useCallback 等,但不确定我是否做错了......
解决方案
推荐阅读
- excel - Excel:如果函数
- java - 没有事务的 JPA 更新查询 - 事务是强制性的吗?
- angular - 角度2在表中添加下一个兄弟
- python-2.7 - 使用 PyMC3 进行贝叶斯推理。编译错误。
- java - Java:从给定的全名字符串中删除逗号和姓氏
- ios - iOS 11 和 SSL SNI 支持
- mysql - 允许特定 mysql 用户的任何密码
- java - 为什么 b.wait() 不让主线程等待
- ruby-on-rails - 哈希斜线 (#/text) 用 /text 清除离开域的 url
- android - 添加 Google 地图支持时的 Gradle 问题