【发布时间】:2021-11-29 01:52:05
【问题描述】:
所以我刚接触 Electron 和 React。我想实现更多功能,但遇到了一个问题,当我将函数 c 传递给新的 Card 元素时,它似乎在创建时传递了函数 c 中的钩子。
这样: 当 + 按钮被点击 3 次时,它将按预期呈现 3 张卡片,让我们称它们为 0、1 和 2。 但是,当他们的日志按钮被点击控制台记录卡钩时,点击 0 的日志按钮控制台 日志:
{}
点击1的日志按钮控制台日志:
{0: {react element of 0}}
点击2的日志按钮控制台日志:
{0: {react element of 0}, 1: {react element of 1}}
但是,单击我目前在 App.js 中设置的用于解决此问题的 - 按钮会产生:
{0: {react element of 0}, 1: {react element of 1}, 2: {react element of 2}}
我是否错误地认为单击每个日志按钮应该改为控制台记录 App.js 控制台中的 - 按钮记录的内容。而不是创建卡片元素时钩子的样子?我该如何解决这个问题?
注意:我使用 Object 而不是 Array 来存储 React 元素的原因是因为我想最终添加一个删除按钮来删除单个卡片。有没有更好的方法来做我正在做的事情?
App.js
import './App.css';
import Cards from './Cards/Cards'
import { useState } from 'react';
let KEY = 0
export default function App() {
const [cards, setCards] = useState({})
const c = () => {
console.log(cards)
}
const make = () =>{
const a = <Cards log={c} anID={KEY}/>
const b = {...cards}
b[KEY] = a
KEY += 1
setCards(b)
}
return (
<div>
<div className="time-container">
{Object.values(cards)}
</div>
<button className="add-button" onClick={() => make()} >+</button>
<button className="" onClick={() => console.log(cards)} >-</button>
</div>
);
卡片.js
import React from 'react'
import './Cards.css'
export default function Cards({ log, anID }) {
return <div className="card-container">
<div>
<button className="card-buttons-red" onClick={()=> log(anID)}>Log</button>
<button className="card-buttons">Edit</button>
</div>
</div>
}
【问题讨论】:
-
对于卡片,您应该使用数组而不是对象。
-
您正在使用已创建的对象在您的应用程序中查看。因此,
c函数签名不会根据cards的更改而更改。为此,您需要在组件内map您的Cards组件。 -
@Invizi 我的想法是将卡片存储在一个对象中,以便我可以通过它们的键识别它们,以便稍后添加删除功能
-
@KavinduVIndika 我认为
c应该指向cards钩子,它应该在一个特定的指针地址。但我想不会。我将如何映射Cards组件?你的意思是我应该遍历对象并重建元素吗?因为那不会重新渲染旧卡,如果我向它们添加倒数计时器或其他东西,它可能会搞砸吗?对不起,如果你能给我一个很好的例子! -
正如@Invizi 提到的,您是创建数组还是对象并不重要。您应该创建
jsx elements,以便在运行时显示在您的应用程序中。
标签: javascript reactjs react-hooks electron