我在Codesandbox上有这段代码,目标是能够通过5 Divs,在加载时使用使用效果。第二个选项是,如果用户喜欢的话,可以在单击时添加div。该代码部分工作,但它有一个反模式问题,即将组件置于状态,而不是使用map更改状态以传递更改。请看一看,我想听听您对此的看法,我所理解的是导入这样的Div元素可能会影响性能,我希望尽可能避免不良实践。
import React, { useEffect, useState } from "react";
import Div from "./Div";
import "./styles.css";
import { v4 as uuidv4 } from "uuid";
export default function App() {
useEffect(() => {
// on start add 5 divs in to the local state Array on the frist load
});
const [div, setDiv] = useState([]);
const addDiv = () => {
// add an extra div on click if needed with id using the right pattern
setDiv([...div, <Div id={uuidv4()} />]);
};
return (
<div className="App">
{div}
<button onClick={addDiv} type="button">
Click Me!
</button>
</div>
);
}
//Dev dependencise
"uuidv4": "6.2.12"
发布于 2021-08-27 19:51:09
将JSX元素放入状态是个坏主意,因为它们不会是反应性的--您将无法(可靠地)传递状态、状态设置器和其他有用的东西,如道具。
与其说这是性能问题,不如说是代码可维护性问题--如果向Div
组件和App
添加其他功能,您可能会发现,由于状态关闭的JSX元素陈旧的值,当前的方法无法工作。
如果需要删除值的能力,可以在数组中使用div的索引,并根据需要将其传递下去。举一个快速而肮脏的例子:
function App() {
const [texts, setTexts] = React.useState([]);
const [text, setText] = React.useState('');
React.useEffect(() => {
setTexts(['a', 'b', 'c', 'd', 'e']);
}, []);
const addDiv = () => {
setTexts([...texts, text]);
setText('');
};
return (
<div className="App">
{
texts.map((text, i) => (
<div>
<span>{text}</span>
<button onClick={() => setTexts(texts.filter((_, j) => j !== i))}>delete</button>
</div>
))
}
<button onClick={addDiv} type="button">
Click Me!
</button>
<input value={text} onChange={e => setText(e.target.value)} />
</div>
);
}
ReactDOM.render(<App />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>
发布于 2021-08-27 19:44:36
只需在数组中添加id并使用map
呈现
{div.map(id => (
<Div key={id} id={id} />
))}
const addDiv = () => {
setDiv([...div, uuidv4()]);
};
https://stackoverflow.com/questions/68961184
复制相似问题