Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在react中使用正确的模式添加id,而不直接使用道具传递id,但通过映射吗?

在react中使用正确的模式添加id,而不直接使用道具传递id,但通过映射吗?
EN

Stack Overflow用户
提问于 2021-08-27 19:38:12
回答 2查看 107关注 0票数 0

我在Codesandbox上有这段代码,目标是能够通过5 Divs,在加载时使用使用效果。第二个选项是,如果用户喜欢的话,可以在单击时添加div。该代码部分工作,但它有一个反模式问题,即将组件置于状态,而不是使用map更改状态以传递更改。请看一看,我想听听您对此的看法,我所理解的是导入这样的Div元素可能会影响性能,我希望尽可能避免不良实践。

代码语言:javascript
运行
AI代码解释
复制
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>
  );
}

代码语言:javascript
运行
AI代码解释
复制
//Dev dependencise

"uuidv4": "6.2.12"

码箱

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-27 19:51:09

将JSX元素放入状态是个坏主意,因为它们不会是反应性的--您将无法(可靠地)传递状态、状态设置器和其他有用的东西,如道具。

与其说这是性能问题,不如说是代码可维护性问题--如果向Div组件和App添加其他功能,您可能会发现,由于状态关闭的JSX元素陈旧的值,当前的方法无法工作。

如果需要删除值的能力,可以在数组中使用div的索引,并根据需要将其传递下去。举一个快速而肮脏的例子:

代码语言:javascript
运行
AI代码解释
复制
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'));
代码语言:javascript
运行
AI代码解释
复制
<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>

票数 2
EN

Stack Overflow用户

发布于 2021-08-27 19:44:36

只需在数组中添加id并使用map呈现

代码语言:javascript
运行
AI代码解释
复制
{div.map(id => (
  <Div key={id} id={id} />
))}

const addDiv = () => {
  setDiv([...div, uuidv4()]);
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68961184

复制
相关文章
C++类的成员函数 | 成员函数
在C++中,类的成员函数是函数的一种,它有返回值和函数类型,它与一般函数的区别只是:
小林C语言
2021/01/18
2K0
C++类的成员函数 | 成员函数
dotnet C# 如果在构造函数抛出异常 析构函数是否会执行
请问以上代码的 ~Foo 是否可以在垃圾回收执行,或者说在构造函数里面抛出异常,是否这个对象可以被垃圾回收
林德熙
2021/12/24
5040
C++类声明和成员函数定义 | 引用多个成员对象
在C++中,一般做法是将类的声明放在指定的头文件中,程序员如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工 作量,提高编程的效率。
小林C语言
2021/01/25
2K0
C++类声明和成员函数定义 | 引用多个成员对象
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
类的成员方法 , 就是 在 类 中定义的 函数 , 在该 函数 中 , 可以调用 类的成员变量 , 以及 本类中其它的成员方法 ;
韩曙亮
2023/10/11
5060
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
Python 检测成员函数、成员变量是否存在的方法
AttributeError: A instance has no attribute 'fun2'
用户9127725
2022/08/08
2.9K0
Java继承类中static成员函数的重写
在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。 也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性。让我们测试一下: 1 class testClass1{ 2 static void SMothod(){ 3 System.out.println("static in testClass1"); 4 } 5 } 6 class testCla
老白
2018/03/19
1.7K0
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
针对类中特定成员函数的检测其实在工作中也可能用到。C++中可以用SFINAE技巧达到这个目的。
果冻虾仁
2021/12/20
4.7K0
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
java反射详解与反射是否会破坏类的封装性见解
       首先,封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)
洋仔聊编程
2019/01/15
2.3K0
taro中定义以及使用全局变量
错误的姿势 // app.tsx文件中 class App extends Component { componentDidMount() { this.user = { name: '张三', id: 1 }; } } // index.tsx 文件中 const app = Taro.getApp(); export default class Index extends Component { componentWillMount() { console.log(ap
用户1437675
2019/06/11
5.7K0
const修饰类中成员变量及函数
const在类中,可以修饰成员变量和成员函数,主要目的也是保护成员内部的一些属性不被轻易的修改。以保证数据的完整性。下面分别介绍const修饰成员变量和成员函数。
我与梦想有个约会
2023/10/20
3100
C++类成员的访问权限以及类的封装
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。
芯动大师
2023/10/14
4230
C++类成员的访问权限以及类的封装
C++中的空类默认包含哪些类成员函数
空类 class Empty { } 空类包含的函数(6个) class Empty { public: Empty(); // 缺省构造函数// Empty( const Empty& ); // 拷贝构造函数// ~Empty(); // 析构函数// Empty& operator=( const Empty& ); // 赋值运算符// Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const };
全栈程序员站长
2021/04/07
1.7K0
类A的成员函数做类B的友元函数
这种方法相对麻烦,主要是在两个类之间的前后声明有着复杂的逻辑关系。但只要我们理清思路,是可以实现的。跟着我从最初的想法到实现一步一步的理顺逻辑,就非常容易理解如何操作了。
我与梦想有个约会
2023/10/20
1930
类A的成员函数做类B的友元函数
java反射详解【转】与 反射是否会破坏类的封装性见解
       首先,封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)
洋仔聊编程
2022/05/10
7120
java反射详解【转】与 反射是否会破坏类的封装性见解
Python中类的成员
细分类的组成成员 之前咱们讲过类大致分两块区域 class A: name = '陈松' # 第一部分:静态字段(静态变量)部分(这一部分调用了类自己本身,表示了类自己的自身属性) def __init__(self): pass def func(self): pass # 第二部分:方法部分(这一部分表示了类可以实施的方法,可以 自己或其他进行操作) 每个区域详细划分 class A:#在方法名前面带__的属于私有 compan
星陨1357
2023/03/14
1K0
Python中类的成员
C++中类和对象以及成员函数
一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,在C++中实体对应的就是对象,实体抽象数据类型就是类,属性是成员变量,行为是成员函数。
用户7886150
2021/02/04
1.4K0
C++中类成员函数作为多线程的入口
搜了一圈答案,基本上都是启动线程的时候传入this指针,在线程函数内部再强转的解决方案。可能显得有些别扭。
ApacheCN_飞龙
2019/02/15
2.9K0
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
可以使用 对象名.‘成员名’ 访问 Groovy 类的成员 , 这样写的好处是 , 不用将代码写死 , 在运行时可以自由灵活的决定要访问哪个成员 ;
韩曙亮
2023/03/30
2.5K0
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
【Kotlin】Kotlin 面向对象 ( 类 | 成员变量 | 成员方法 | 封装 | 继承 | 多态 )
② 定义字段 : 在类后的括号内 , 使用 var 字段名称:字段类型 可以定义一个字段 ;
韩曙亮
2023/03/27
6610
C++类的静态数据成员和静态成员函数
一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况,如果用全局变量来描述它们相同的属性,就会破坏类的独立性。
叶茂林
2023/07/30
2980

相似问题

如何在json数据中动态添加属性和值

12

如何在字典值中添加前缀和后缀

17

Map<String,String[]>;属性(如键和值对)的JSON

14

在json属性名中添加下划线前缀

11

前缀JSON值- JSON/JQuery

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档