Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子组件在父组件更改状态时不会获得新的支持(功能组件)

子组件在父组件更改状态时不会获得新的支持(功能组件)
EN

Stack Overflow用户
提问于 2020-10-13 09:42:22
回答 1查看 195关注 0票数 0

当父组件更改状态时,为什么我的子组件没有得到新的道具。我使用数据库中带有3个元素的列表来测试,在Add_Friend_Modal中使用状态Add_Friend_Modal来存储所有子Add_Friend_Selected。我尝试当用户单击Add_Friend_Modal中的移除按钮时,状态list_user_selected将被更新。但是,当我单击第一个子组件的删除按钮时,props.list_user_selected只得到了数组[]。第二个子组件得到数组第一个子组件。第三个子组件得到数组第一个子组件,第二个子组件。我什么都试过了,但都没有用。有人能向我解释一下为什么,以及如何解决吗?

子组件

代码语言:javascript
运行
AI代码解释
复制
const Add_Friend_Selected = props => {
    return (
        <li className="list-group-item px-0 d-flex">
            <figure className="avatar mr-3">
                <img src={props.avatar} className="rounded-circle" alt="image" />
            </figure>
            <div>
                <div>{props.name}</div>
                <div className="small text-muted">{props.mobile}</div>
            </div>
            <a onClick={() => props.delete_user_selected(props.id)} className="text-danger ml-auto" data-toggle="tooltip" title="Remove">
                <i className="mdi mdi-delete-outline"></i>
            </a>
        </li>
    )
}

父组件

代码语言:javascript
运行
AI代码解释
复制
const Add_Friend_Modal = props => {
    const [count_user_selected,set_count_user_selected] = useState(0);
    const [list_user_selected,set_list_user_selected] = useState([]);
    const user = useSelector((state) => state.user);
    const input_mobile_friend = useRef("");
    
    const delete_user_selected = (id) => {
        const delete_user_index = list_user_selected.findIndex(user_selected => user_selected.props.id === id);
        console.log(delete_user_index)
        set_list_user_selected([...list_user_selected.splice(delete_user_index,1)])
    }
    const add_invite_friend = () => {
        if(input_mobile_friend.current.value) {
            call_api({
                url : `/users/search?mobile=${input_mobile_friend.current.value}`
            })
                .then(response => {
                    const user_find = response.data.data;
                    if(user_find && !list_user_selected.some(user_selected => user_selected.props.id === user_find._id )) {
                        const new_user_selected = (
                            <Add_Friend_Selected name={user_find.name} avatar={user_find.avatar} 
                                                 mobile={user_find.mobile} id={user_find._id} 
                                                 list_user_selected={list_user_selected}
                                                 delete_user_selected={(id) => {
                                                     delete_user_selected(id)
                                                     set_count_user_selected(list_user_selected.length + 1)
                                                 }}
                                                 />
                        )

                        set_list_user_selected([...list_user_selected,new_user_selected])
                        set_count_user_selected(list_user_selected.length + 1)
                    }
                    else {
                        console.log("Not found")
                    }
                })
                .catch(error => {
                    console.log(error)
                })
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-13 14:21:24

修复代码的步骤:

  • 在“useEffect”

中不调用“componentDidMount”以外的其他位置的apis

  • 如果要使用函数来呈现组件,则需要在功能组件

的返回方法中调用它

看看这些代码是否可以帮助您:

代码语言:javascript
运行
AI代码解释
复制
//state for update when your api call finished
const [user_find, set_user_find] = useState(null)

//useEffect for call your api
useEffect(() => {
  //componentSkillMount its a variable for not update an unmounted component
  let componentSkillMount = true;
  call_api({
    url : `/users/search?mobile=${input_mobile_friend.current.value}`
    })
    .then(response => {
      //if your component skill mounted you can update that
      componentSkillMount && set_user_find(response.data.data)
    })
  return () => componentSkillMount = false
}, [])

return (
  //if the api call finished you can return a full component
  user_find && (
    <Add_Friend_Selected name={user_find.name} avatar={user_find.avatar} 
      mobile={user_find.mobile} id={user_find._id} 
      list_user_selected={list_user_selected}
      delete_user_selected={(id) => {
          delete_user_selected(id)
          set_count_user_selected(list_user_selected.length + 1)
      }}
      />
  )
)

尝试将此代码修改为您的代码:)

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

https://stackoverflow.com/questions/64340415

复制
相关文章
sas文本挖掘案例:如何使用SAS计算Word Mover的距离
Word Mover的距离(WMD)是用于衡量两个文档之间差异的距离度量,它在文本分析中的应用是由华盛顿大学的一个研究小组在2015年引入的。
拓端
2020/07/17
1.2K0
sas文本挖掘案例:如何使用SAS计算Word Mover的距离
浮点数在计算机中是如何表示的
相比int等整型,float等浮点类型的表示和存储较为复杂,但它又是一个无法回避的话题,那么就有必要对浮点一探究竟了。在计算机中,一般用IEEE浮点近似表示任意一个实数,那么它实际上又是如何表示的呢?
编程珠玑
2019/09/02
1.9K0
Netty 在 Dubbo 中是如何应用的?
众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟。
IT大咖说
2020/02/26
2.2K0
Tomcat在SpringBoot中是如何启动的?
我们知道SpringBoot给我们带来了一个全新的开发体验,我们可以直接把web程序打成jar包,直接启动,这就得益于SpringBoot内置了容器,可以直接启动,本文将以Tomcat为例,来看看SpringBoot是如何启动Tomcat的,同时也将展开学习下Tomcat的源码,了解Tomcat的设计。
挨踢小子部落阁
2019/10/14
1.6K0
Tomcat在SpringBoot中是如何启动的?
Tomcat在SpringBoot中是如何启动的
我们知道SpringBoot给我们带来了一个全新的开发体验,我们可以直接把web程序达成jar包,直接启动,这就得益于SpringBoot内置了容器,可以直接启动,本文将以Tomcat为例,来看看SpringBoot是如何启动Tomcat的,同时也将展开学习下Tomcat的源码,了解Tomcat的设计。
macrozheng
2019/09/27
1.7K0
Tomcat在SpringBoot中是如何启动的?
我们知道SpringBoot给我们带来了一个全新的开发体验,我们可以直接把web程序打成jar包,直接启动,这就得益于SpringBoot内置了容器,可以直接启动,本文将以Tomcat为例,来看看SpringBoot是如何启动Tomcat的,同时也将展开学习下Tomcat的源码,了解Tomcat的设计。
Bug开发工程师
2019/10/11
1.4K0
Tomcat在SpringBoot中是如何启动的?
在 Python 中是如何管理内存的?
Python内存池:内存池的概念就是预先在内存中申请一定数量的,大小相等 的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。
宇宙之一粟
2020/10/26
1.9K0
Netty 在 Dubbo 中是如何应用的?
众所周知,国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天我们就来一探究竟。
Java技术栈
2019/11/29
9760
SQL语句在MySQL中是如何执行的
开门见山,当我们输入一条 SQL 语句的时候,MySQL 内部究竟执行了什么?直接上架构图,我们才能对其有一个概念,而不要陷入细节之中。
码哥字节
2020/03/24
4.5K0
SQL语句在MySQL中是如何执行的
Java 类在 Tomcat 中是如何加载的?
https://www.cnblogs.com/xing901022/p/4574961.html
Java技术栈
2019/09/26
2.6K0
Java 类在 Tomcat 中是如何加载的?
梯度是如何计算的
引言 深度学习模型的训练本质上是一个优化问题,而常采用的优化算法是梯度下降法(SGD)。对于SGD算法,最重要的就是如何计算梯度。此时,估计跟多人会告诉你:采用BP(backpropagation)算
机器学习算法工程师
2018/03/06
2.6K0
梯度是如何计算的
浮点数在计算机系统中是如何表示和存储的
在计算机系统中,浮点数是以一种称为浮点数表示法的形式来表示和存储的。浮点数表示法使用科学计数法的形式,将一个实数表示为一个值乘以一个基数的幂的形式。表示一个浮点数需要三个要素:符号位、尾数和指数。
一凡sir
2023/08/10
5320
程序在计算机中如何运行的
累加寄存器(AC) :主要进行加法运算。 标志寄存器(PSW) :记录状态,做逻辑运算。 程序计数器(PC) :是用于存放下一条指令所在单元的地址的地方。 基质寄存器(BX) :储存当前数据内存开始的位置。 变址寄存器 :储存基质寄存器的相对位置。 通用寄存器(GPRs):支持有所的用法。 指令寄存器(IR) :CPU专用,储存指令。 堆栈寄存器(SP) :记录堆栈的起始位置。
心跳包
2020/08/31
1.6K0
程序在计算机中如何运行的
RPM索引在Artifactory中是如何工作
RPM是用于保存和管理RPM软件包的仓库。我们在RHEL和Centos系统上常用的Yum安装就是安装的RPM软件包,而Yum的源就是一个RPM软件包的仓库。JFrog Artifactory是成熟的RPM和YUM存储库管理器。JFrog的官方Wiki页面提供有关Artifactory RPM存储库的详细信息。
JFrog杰蛙科技
2020/07/03
2.1K0
RPM索引在Artifactory中是如何工作
在 golang 中是如何对 epoll 进行封装的?
在协程没有流行以前,传统的网络编程中,同步阻塞是性能低下的代名词,一次切换就得是 3 us 左右的 CPU 开销。各种基于 epoll 的异步非阻塞的模型虽然提高了性能,但是基于回调函数的编程方式却非常不符合人的的直线思维模式。开发出来的代码的也不那么容易被人理解。
开发内功修炼
2022/05/07
4.1K0
在 golang 中是如何对 epoll 进行封装的?
SAS宏程序中的查询
我们在写相对复杂的宏的时候,通常会在开始位置加一些判断,比如判断某个变量是否在、一个路径是否存在、一个路径下面某种文件是否存在。。。
专业余码农
2020/07/16
1.2K0
sas软件是做什么的?数据分析sas软件,sas软件下载安装教程
SAS是一款用于数据分析和统计建模的软件。它可以帮助用户对大量数据进行处理、分析、建模和可视化。下面我们来看看它的一些主要特点。
用户10436734
2023/03/31
1.9K0
sas软件是做什么的?数据分析sas软件,sas软件下载安装教程
什么是JWT及在JAVA中如何使用?
在不使用JWT的情况下,我们一般选择的是cookie和session来进行服务鉴权(判断是否登录,是否具有某种权限),但是这是针对于只有一个客户端的情况下,现在客户端从pc端增长到了app端,现在就是多端访问了。
叫我阿杰好了
2022/11/07
3.2K0
什么是JWT及在JAVA中如何使用?
高级语言中的语句在汇编中是如何实现的
我们都知道对于c语言来说,它是需要先转换成汇编语言,然后再生成机器语言的。那么在c语言中,各种条件语句,各种表达式的计算,在汇编中是何如实现的呢?今天我们就来讲解一下。
程序那些事儿
2023/03/07
6880
高级语言中的语句在汇编中是如何实现的
【方法】学习 SAS 的正确姿势是怎样的?
作者 CDA 数据分析师 SAS 作为世界知名大数据分析产品,只要是大机构, 不论是、制药、金融、保险、市场部门、NGO 还是政府部门,SAS 的覆盖率,都是完全不可被替代的。甚至部分IT公司在统计
CDA数据分析师
2018/02/26
2.2K0
【方法】学习 SAS 的正确姿势是怎样的?

相似问题

映射与复杂键的多个索引

22

从多个映射和键列表到映射中的键和相应值的列表

40

yml -多个键映射到相同的值

151

Groovy映射中相同键的多个值

118

具有多个键映射到相同值的字典

568
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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