填充后反应返回空数组(可能重新渲染问题)

React returning empty array after populating it (possibly re-render problem)

我从发送到 EditMainContact 的父组件加载联系人,这是一个 dialog/modal 表单,其中在输入中设置值以编辑它们。所以我使用 contacto 作为 useEffect 的触发器,因此当它加载或更改时,相关数据将转换为我稍后将使用的 2 个数组。它们是 tels_empresaemails_empresa。 同时,当这些更改时,将填充表单的值(这是不起作用的地方)。它显示了一个具有最后一个值的输入。我可能在这里遗漏了一些东西,也许这是出于某种原因重新渲染,最后它 returns 一个 empty-ish 数组。代码比这长得多,但我把我认为解决这个问题所需的数据放在这里。

export default function EditMainContact({contacto}) {
    const [tels_empresa,setTels_empresa] =useState();
    const [emails_empresa,setEmails_empresa] =useState();
    const [telFormValues, setTelFormValues] = useState([]); 
    const [emailFormValues, setEmailFormValues] = useState([]);  
    
    useEffect(()=>{
        setTels_empresa(contacto?.telefonos_empresa?.split(",").map(par=>par.split(":")));
        setEmails_empresa(contacto?.emails_empresa?.split(",").map(par=>par.split(":")));
    },[contacto]);
    
    useEffect(()=>{
        tels_empresa?.map((inp, index)=>{
            setTelFormValues([...telFormValues,{tel_identificador: inp[0], tel: inp[1]}]);
            setFormValues({...formValues, ["telefonos_empresa"]: telFormValues});
        });
    },[tels_empresa]);
    
    useEffect(()=>{
        emails_empresa?.map((inp, index)=>{ 
            setEmailFormValues([...emailFormValues,{email_identificador: inp[0],email:inp[1]}]);
            setFormValues({...formValues, ["emails_empresa"]: emailFormValues});
        });
    },[emails_empresa])

}

问题是在 useEffect 回调的范围内,您没有 telFormValuesemailFormValuesformValues.[=18 的最新值=]

每次 tels_empresaemails_empresa 更改时,都会重新创建 useEffect 回调和 运行s,但它指向其他常量的“旧”值你在回调的范围内使用。

要解决此问题,您有 2 个选择:

  1. 将其他常量添加到 dependencies 数组。 (但这将使 useEffect 运行 也在其他常量更改时)

  2. 使用 setter 以前的值功能。这可确保您获得最新的值。这是一个示例:(您需要对其他 setters 执行相同的操作)

    setTelFormValues((prevTelFormValues) => [...prevTelFormValues, {tel_identificador: inp[0]...