首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >更新动态创建的组件

更新动态创建的组件
EN

Stack Overflow用户
提问于 2018-04-16 09:10:02
回答 2查看 3.4K关注 0票数 1

情况

我有一个父组件,它呈现一些子组件。子组件应显示从父组件传递的信息。

上下文

玩多人游戏的战舰游戏:

父组件包含多达10x30个按钮(子组件)的10x10字段。如果按下按钮,就会发出带有按钮位置的信号到api。api决定按下的按钮是否需要改变它的颜色。

问题

通过更新父组件的状态,如果子组件是动态创建的,子组件道具将不会被更新。

解决尝试

不要动态地呈现Childs:

在我的情况下不可能

使用剩馀

我认为子组件是转储/表示组件,因为它只显示信息。在我的例子中也有100到300个子组件。残馀和反应

参考文献

有100到300个子组件.不要过度使用参考文献

问题

我该怎么办?有没有一种不是反模式的解决方案?

当前代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.state={
      foo: 'BAR'
    }
    this.child=undefined;
  }
  
  componentWillMount(){
    this.child=<Child foo={this.state.foo}/>
  }  
  
  componentDidMount(){
    var that=this
    setTimeout(function(){ 
      that.setState({  //it is just here for demonstration
        foo: 'FOO'
      }) 
    }, 1000);
  }
  
  render() {
    return (
      <div>
       Is: {this.child}
       Not Dynamic created: <Child foo={this.state.foo}/>
       Actual: <p>{this.state.foo}</p>
      </div>
    );
  }
}

class Child extends React.Component {
  render() {
    return (
      <p>{this.props.foo}</p>
    );
  }
}

ReactDOM.render(<Parent />, document.getElementById('app'));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

使用来自@RaghavGarg和@Clinton Blackburn的方法编写的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.state={
      foo: 'BAR'
    }
    this.child=undefined;
  }
  
  componentDidMount(){
    var that=this
    setTimeout(function(){ 
      that.setState({  //it is just here for demonstration
        foo: 'FOO'
      }) 
    }, 1000);
  }
  
  renderChild(){
    return <Child foo={this.state.foo} />
  }
  
  render() {
    const child=this.renderChild()
    return (
      <div>
       Is: {child}
       Not Dynamic created: <Child foo={this.state.foo}/>
       Actual: <p>{this.state.foo}</p>
      </div>
    );
  }
}

class Child extends React.Component {
  render() {
    return (
      <p>{this.props.foo}</p>
    );
  }
}

ReactDOM.render(<Parent />, document.getElementById('app'));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='app'/>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-16 13:00:02

就像克林顿说的,componentWillMount只会被打一次电话。因此,您实际上是在启动this.child变量,但只更新状态,您还需要更新变量的值。

因为您只是制作动态组件并将它们保存在类实例中(如this.child)。我建议您在componentWillUpdate中执行同样的任务。因此,每当您的状态发生变化时,它将反映在您的因变量中。但是,请确保在这个生命周期方法中不要使用setState

当接收到新的道具或状态时,将在呈现之前调用componentWillUpdate()。将此作为在更新发生之前执行准备的机会。

另外,考虑使用构造函数来启动状态,而不是在setState中使用componentWillMount

componentWillMount()是在挂载发生之前调用的。在render()之前调用它,因此在此方法中同步调用setState()不会触发额外的呈现。通常,我们建议使用constructor()来初始化状态。

参考:

组件更新 组件

添加上下文后进行更新

因此,现在,我假设您将有一个DS(可能是一个对象或嵌套数组)处于维护每个框(子组件)状态的状态。您可以对其进行循环,并为其中的每个成员提供一个惟一的key(可能类似于{row}-{col}),现在只需更新状态,以反映特定子节点的变化。

注意:使用每个子项的唯一键将启用内部响应,优化重呈现,并且不会重新呈现子元素(使用唯一的键),这是不会更改的。参见下面的代码以供参考。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.state = {
  boxes: {
    1: { 
      1:{ status: true, /* more data */ },
      2:{ status: true, /* more data */ },
    },
    2: { 
      1:{ status: true, /* more data */ },
      2:{ status: true, /* more data */ },
    },
    3: { 
      1:{ status: true, /* more data */ },
      2:{ status: true, /* more data */ },
    },
    4: { 
      1:{ status: true, /* more data */ },
      2:{ status: true, /* more data */ },
    }
  }
};

// this will create a 4x2 box, now you will render using above object

// ...somewhere in your render method
{
  Object.keys(this.state.boxes).map(row => (
    <div key={`row-${row}`} className="row">
      {
        Object.keys(this.state.boxes[row]).map(column => (
          <Child 
            key={`box-${row}x${column}`} 
            data={this.state.boxes[row][column]} 
          />
        ))
      }
    </div>
  ))
}

现在,每当您将status of say 2x1框更改为false时,render将只使用键box-2x1重新呈现子对象。

OP评论后的更新

应该使用shouldComponentUpdate来决定是否要在状态更改时更新组件。它是一种反应组件的生命周期方法。默认情况下,它返回true,但可以根据条件返回false基础,以不更新组件。这肯定有助于保持良好的性能。

参考: 响应:父组件重新呈现所有的子组件,即使是那些在状态更改时没有更改的子组件。

票数 2
EN

Stack Overflow用户

发布于 2018-04-16 12:46:53

当父组件插入到DOM中时,只调用一次componentWillMount。它可能不是您想要创建安装后需要更改的子组件的地方。请参阅https://reactjs.org/docs/react-component.html#the-component-lifecycle中的组件生命周期。

最简单的解决方案是在render()方法中创建子组件。更新父组件时,将重新创建子组件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49862802

复制
相关文章
C++ 中的随机标头系列1
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
鲸落c
2022/11/28
1.4K0
C++ 中的随机标头系列1
设置和获取HTTP标头
%Net.HttpRequest的以下每个属性都包含具有相应名称的HTTP标头的值。如果不设置这些属性,则会自动计算它们:
用户7741497
2022/06/09
2.5K0
通过 HTTP 标头的 XSS
在某些情况下,在应用程序的一个 HTTP 标头中传递的信息未正确清理,并在请求页面的某处或另一端输出,从而导致 XSS 情况。
Khan安全团队
2022/03/09
2.1K0
通过主机标头的 XSS
在 IE 中处理重定向时有一个有趣的错误,它可以将任意字符插入到 Host 标头中。假设您有以下 http 响应:
Khan安全团队
2022/01/11
1.6K0
常见的HTTP标头介绍
在网络爬虫的实践过程中会遇到诸多挑战,被屏蔽是最令人头疼的一个。幸好,有许多技术可以帮助您免受IP屏蔽带来的影响,这其中,HTTP标头(HTTP Headers)的使用和优化是最有效的方法之一,但它往往也是最被大家低估的方法之一。
用户7850017
2022/05/07
1.1K0
常见的HTTP标头介绍
跨国摄像头通过国标协议注册EasyGBS后摄像头SIP协议被更改怎么办?
我们遇到过很多用户有跨国视频播放的情况,一般我们会推荐用户采用非国标协议来进行对接,但如果项目有需求,也会碰到跨国需要使用国标协议传输的情况。
TSINGSEE青犀视频
2021/12/15
6880
Log4Shell HTTP 标头注入
此模块需要 Metasploit:https://metasploit.com/download
Khan安全团队
2022/01/14
1.1K0
「HTTP标头」都给你整理好了
HTTP 1.1 的标头主要分为四种,通用标头、实体标头、请求标头、响应标头,现在我们来对这几种标头进行介绍
Java3y
2020/02/19
5.8K0
「HTTP标头」都给你整理好了
wordpress更改固定链接后404
wordpress的固定链接对于博客的seo优化是非常重要的。因为有些默认设置并不怎么友好,所以我们可以自定义设置自己的想要的固定链接,比如自定义连接结构为:/%post_id%.html。但是往往我们更改之后会出现404页面,这是网站的伪静态出了问题。 下面是在不同环境下的不同解决方法。
SweetHunter
2020/05/10
2.1K0
芯片后仿及SDF反标
启用SDF反标。在file.sdf中指定的最小值、类型或最大值中的一种,在实例instance_name上进行反标。
数字芯片社区
2021/12/02
5.5K0
芯片后仿及SDF反标
废掉腾讯云后:美亚柏科 9830 万中标
2021年9月30日,珠海市公安局(科信支队)珠海公安大数据智能化建设采购项目公开招标公告发布,预算 103398915.2 元。 中标结果 2021年10月22日中标(成交)结果公告发布,腾讯云计算(北京)有限责任公司 100,127,866.00 元中标。 综合评分法汇总表: 废标公告 2021年12月25日废标公告发布,本项目因故根据《中华人民共和国政府采购法》第36条规定,做废标处理。 《中华人民共和国政府采购法》第36条规定: 在招标采购中,出现下列情形之一的,应予废标: (一)符合专业条件的
云头条
2022/07/13
8170
废掉腾讯云后:美亚柏科 9830 万中标
使用结构化的标头字段改善HTTP
原文 / https://www.fastly.com/blog/improve-http-structured-headers
LiveVideoStack
2020/08/04
6660
CentOS挂载NAS存储后权限的更改
最后我们为了安全,再次将'根限制'勾选,这样做的意义是:就算你用nfs3挂载的文件系统,那么依然无法修改属主属组,更为安全,如下图:
染指流年
2023/03/13
4.1K0
CentOS挂载NAS存储后权限的更改
服务器未能识别 HTTP 标头 SOAPAction 的值
SOAPAction HTTP request header被用来标识SOAP HTTP请求的目的地,其值是个URI地址。SOAP发送并不限制格式、URI特征或其必须可解析,那么在这种情况下,发送一个HTTP SOAP请求时,其HTTP客户端必须使用/指明SOAPAction HTTP request header。 SOAPAction header的内容可以被用在服务端,诸如:防火墙适当的过滤基于HTTP的SOAP请求消息等场景。SOAPAction header的值为空串("")表示SOAP消息的目
张善友
2018/01/19
3.1K0
ThinkPHP5.1中URL重写.htaccess更改后无效的解决方法
昨天是打算更换项目框架的,决定了这个 ThinkPHP5,我使用的是 5.1 版本 开发中一直不喜欢 URL 中有这个index.php,这个时候就要使用.htaccess 来进行 URL 重写,之前有文章大概介绍了一下简单配置.htaccess 就可以实现的几个功能以及.htaccess 文件使用手册,框架都会通过 URL 重写隐藏应用的入口文件index.php,ThinkPHP 框架和 Laravel 框架的入口文件路径一样,都是在public下面 本地开发使用的是 Apache 环境,所以按照官方文
沈唁
2018/05/24
10.9K1
安卓开发_浅谈Fragment之ListFragment
ListFragment,即Fragment的一个子类,当我们用的一个Fragment只需要一个listview视图的时候使用 该类有几个特点: 1、ListFragment 本身具只有一个ListView视图,返回的也是一个只有ListView的布局对象 2、ListFragment 不需要指定布局,本身固定,只有一个ListView视图 3、给ListFragment中的ListView加载数据或者绑定适配器都只能出现onCreateView(),因为onCreateView方法之后,ListView对
听着music睡
2018/05/18
2.1K0
浪潮云被废标后、东华软件 5724 万中标:河北省“智慧交管”项目(第五包)
2021年11月23日,河北省公安厅高速公路交通警察总队发布《“智慧交管”项目开发统一应用门户、应用平台;公安网、视频专网云平台、地理信息平台等部分》招标公告。 项目概况:项目建设内容主要包括完善高速公路前端智能感知系统,建设高速交警总队智慧交管大脑、统一应用门户、智慧交管应用平台、一体化指挥调度平台、智能化统一管理平台,升级高速交警总队公安交通集成指挥平台,升级改造高速交警总队、11个支队、22个大队指挥中心配套设施,同时租赁移动警务服务、链路和机柜。 招标范围:(第五包)开发统一应用门户、应用平台;公安
云头条
2022/05/17
5690
浪潮云被废标后、东华软件 5724 万中标:河北省“智慧交管”项目(第五包)
树莓派更改Wi-Fi后不重启
//配置Wi-Fi 配置你的Wi-Fi信息 sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
用户2458545
2022/09/07
4510
Android开发之ListFragment结合LoaderManager加载数据
之前实现过Android开发之ContentProvider结合LoaderManager加载数据,现在来实现用ListFragment加载 先看main.xml
提莫队长
2019/03/01
6750
Android开发之ListFragment结合LoaderManager加载数据
点击加载更多

相似问题

在Nsis中查找Powershell路径

17

如何使用常量更改R中的文件路径?

22

如何使用NSIS EnVar插件编辑路径?

222

我们是否有任何常量来获取NSIS中的当前用户路径

17

如何使用openFileOutput()指定文件路径?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文