React 父组件传递属性给子组件时,子组件调用该属性时出现的Bug

问题描述:React 父组件传递属性给子组件时,子组件在函数中使用到该属性时(失效), 换言之就算传递属性发生变化,在子组件调用该属性用到的还是第一次传进来的值。

问题代码
IndexContent.jsx

import React, { useState} from 'react';
const IndexContent = ({ uid, talk_type, receiver_id, index_name }) => {
    useEffect(() => {
    	console.log("进入IndexContent",talk_type,receiver_id)
        onLoad({ uid, talk_type, receiver_id, limit: 20 }) //这个onLoad不需要管
    }, [index_name])

    return (
        <>
            <PanelFooter  talk_type={talk_type} receiver_id={receiver_id} name={"测试"}/>
        </>
    )
}
export default IndexContent;

PanelFooter.jsx

import React, { useState } from 'react';
const PanelFooter = ({ talk_type, receiver_id, name }) => {

    useEffect(() => {
        console.log("进入PanelFooter", talk_type, receiver_id)
    }, [talk_type, receiver_id])
    
	const onSendMessage = (data = {}, callBack) => {
        let message = {
            ...data,
            receiver: {
                talk_type: talk_type,
                receiver_id: receiver_id,
            },
        };
        console.log("onSendMessage", message.receiver)
     }
     
	 const evnets = {
        msg_event: onSendMessage 
     }
	return (<><Editor editorEvent={editorEvent} /></>)
}
export default PanelFooter;

第一次进来加载,并且调用 onSendMessage 方法

进入PanelFooter 1 2
进入IndexContent 1 2
onSendMessage {talk_type:1,receiver_id:2}

当前切换会话后,继续调用onSendMessage 方法

进入PanelFooter 2 20
进入IndexContent 2 20
onSendMessage {talk_type:1,receiver_id:2}

  • 子组件调用方法里的值没有发生改变

解决办法

PanelFooter.jsx

import React, { useState,useRef } from 'react';

const PanelFooter = ({ talk_type, receiver_id, name }) => {

    // 使用 ref 来存储最新的 talk_type 和 receiver_id
    const talkTypeRef = useRef(talk_type);
    const receiverIdRef = useRef(receiver_id);

    useEffect(() => {
        talkTypeRef.current = talk_type;
        receiverIdRef.current = receiver_id;
    }, [talk_type, receiver_id])
    
	const onSendMessage = (data = {}, callBack) => {
        let message = {
            ...data,
            receiver: {
                talk_type: talkTypeRef.current,
                receiver_id: receiverIdRef.current,
            },
        };
        console.log("onSendMessage", message.receiver)
     }
     
	 const evnets = {
        msg_event: onSendMessage 
     }


	return (<><Editor editorEvent={editorEvent} /></>)
}
export default PanelFooter;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值