javascript - 无法将 React 组件推送到数组
问题描述
我有以下课程:
const NewPage = () => {
const [blocks, setBlocks] = useState(false);
const [needsShowImageModal, setNeedsShowImageModal] = useState(false);
const textButtonHandler = () => {
const key = randomInt(0, 1000000000);
setBlocks([
...blocks,
<TextBlock
key={key}
blockKey={key}
deleteButtonHandler={deleteButtonHandler}
/>
]);
console.log(blocks);
};
return (.....);
}
由于某种原因,第一次textButtonHandler
调用它不会将项目添加到数组中。我已经在控制台中检查了数组的长度,它是 0。我在这里做错了什么?
编辑:建议后我现在有:
const NewPage = () => {
const [blocks, setBlocks] = useState([]);
const [needsShowImageModal, setNeedsShowImageModal] = useState([]);
const textButtonHandler = () => {
const key = randomInt(0, 1000000000);
setBlocks([
...blocks,
{ key, deleteButtonHandler}
]);
};
const deleteButtonHandler = (blockKey) => {
console.log(blocks); // Empty
};
return (
<div>
<ImageModal
show={needsShowImageModal}
onHide={() => setNeedsShowImageModal(false)}
insertButtonHandler={insertImageHandler}
/>
<div className="d-flex">
<NewPageSidebar
textButtonHandler={textButtonHandler}
imageButtonHandler={imageButtonHandler}
spacingButtonHandler={spacingButtonHandler}
/>
<NewPageContent blocks={blocks} />
</div>
</div>
);
};
export default NewPage;
但是,如果我使用添加一个块textButtonHandler
然后触发deleteButtonHandler
该数组仍然是空的。
解决方案
1-您应该按名称在数组中添加组件,而不是像 < ../> 那样将其包装起来,并且在 jsx 中使用它时可以这样做,因此您的对象可以是这样的:
{
key:key,
deleteButtonHandler:deleteButtonHandler,
comp:TextBlock
}
2-如果块中的所有对象都具有相同的元素,则不需要元素数组,只有comp信息的对象数组就足够了
3-建议的解决方案:
const NewPage = () => {
const [blocks, setBlocks] = useState([]);
const [needsShowImageModal, setNeedsShowImageModal] = useState(false);
const textButtonHandler = () => {
const key = randomInt(0, 1000000000);
setBlocks([
...blocks,
{
key:key,
deleteButtonHandler:deleteButtonHandler
}
]);
console.log(blocks);
};
return (<div> {blocks.map((info)=>(...))} </div>);
}
在上面的代码中创建块列表作为信息持有者后,您可以通过 .map 使用它,例如示例。
推荐阅读
- spring - 弹簧理解中的自动装配
- php - 在 YII2 中使用自动注销,需要在再次登录后将用户重定向到用户在自动注销之前的相同 URL
- .net - 如何在 Azure Web App 中更改 MaxRequestHeadersTotalSize
- javascript - 开玩笑只是通过了所有测试,即使它是错误的
- angular - 不能使用带有预定义值的 ngForm
- php - 如何阻止对特定文件夹的直接访问?
- docker - docker compose 错误:在文件 './docker-compose.yml' 中,服务名称 True 必须是带引号的字符串,即 'True'
- c# - 如何处理 JSON 反序列化?
- r - 在 Shiny 中输入两个单词
- java - org.hibernate.LazyInitializationException:使用 Javers 时无法延迟初始化角色集合