代码之家  ›  专栏  ›  技术社区  ›  user938363

React Native:状态更新未触发重新渲染

  •  0
  • user938363  · 技术社区  · 4 年前

    我的RN 0.62.2应用程序上传图像并显示。图像存储在状态数组中。当上传新图像时,新图像将添加到数组末尾。以下是添加图像的方法:

      const [imgs, setImgs] = useState();
      const addImages = (pics) => {
        if (!pics || pics===[] || pics==={}) return;
        let temp = imgs, updated=false;
        if (imgs && imgs!==[] && imgs!=={}) {
            let names = imgs.map(item => item.fileName);
            for(let i=0;i<pics.length;i++) {
                if (!names.includes(pics[i].fileName)) {
                    temp.push(pics[i]);
                    updated = true;
                };
            };
            if (updated) setImgs(temp); //<<== add more images to the array and reset the state
        } else {
            setImgs(pics);  //<<==for initial upload of images
        };
    

    图像阵列显示在组件内:

     return (
           <MyAccordion title={"Image"} absPosition={false} initOpen={accordImgOpen} screenSize={{width:screen_width, height:((imgs && imgs.length>9) ? screen_width+(screen_width/3)*(Math.ceil(((imgs.length-9)%3)/3)):screen_width)}} >                      
                 <DisplayImages pics={imgs} deleteImage={deleteImage} />  //<<==here imgs is a state and the images array is display in grids
            </MyAccordion>
     )
    

    直到今天,代码一直运行良好。现在添加的图像不是按功能组件呈现的 DisplayImages 刚好在…之后。我需要做一些事情,比如打开Modal并关闭它以触发重新渲染。控制台输出显示状态 imgs 已更新。什么可以防止页面在状态更新后重新呈现?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Duy Nguyen    4 年前

    我认为这里的问题是你没有克隆imgs。试试这个

    const [imgs, setImgs] = useState();
      const addImages = (pics) => {
        if (!pics || pics===[] || pics==={}) return;
        let temp = [...imgs], updated=false;
        if (imgs && imgs!==[] && imgs!=={}) {
            let names = imgs.map(item => item.fileName);
            for(let i=0;i<pics.length;i++) {
                if (!names.includes(pics[i].fileName)) {
                    temp.push(pics[i]);
                    updated = true;
                };
            };
            if (updated) setImgs(temp); //<<== add more images to the array and reset the state
        } else {
            setImgs(pics);  //<<==for initial upload of images
        };