Reactjs 不使用setState进行React更新

Reactjs 不使用setState进行React更新,reactjs,Reactjs,我已经阅读了一些关于我的问题的答案,但我仍然不知道如何解决这个问题。我有一个适度嵌套的树对象。在更新树中的值时,我很清楚不直接更新状态的规则,因此我创建了树的浅层副本,进行修改并更新状态,以便正确显示树。我注意到一些奇怪的事情;然而。当我更新树的浅层副本时,状态会得到更新……我不确定如何更新或为什么更新,但我确定这是一个我不理解的概念。如果这是一个问题,希望得到一些帮助: export const FldDataTree = (props) => { const

我已经阅读了一些关于我的问题的答案,但我仍然不知道如何解决这个问题。我有一个适度嵌套的树对象。在更新树中的值时,我很清楚不直接更新状态的规则,因此我创建了树的浅层副本,进行修改并更新状态,以便正确显示树。我注意到一些奇怪的事情;然而。当我更新树的浅层副本时,状态会得到更新……我不确定如何更新或为什么更新,但我确定这是一个我不理解的概念。如果这是一个问题,希望得到一些帮助:

export const FldDataTree = (props) => {          
    const [treeData, setTreeData] = useState({data:[]})  

    const findNode = (node,id) => {               
        let result;         
        for(let i=0;i<node.length;i++){                        
            if(node[i].recordid == id) return(node[i]);            
            if(node[i].children){
                result=findNode(node[i].children,id);
            }        
            return result;
         }
     }

     const HandleFormCallback = (resp) => {                
         if(resp.action=="save"){            
             if(controls.editid){       
                 let ns = treeData.data;                 
                  let node = findNode(ns,controls.editid)                                 
                  if(node){
                      node.foldername = resp.data.foldername
                      console.log(treeData.data)     //<=============treeData.data was updated....why?
                  }
              }
          }
      }
export const FldDataTree=(道具)=>{
const[treeData,setTreeData]=useState({data:[]})
常量findNode=(节点,id)=>{
让结果;
对于(设i=0;i{
如果(响应操作==“保存”){
if(controls.editid){
设ns=treeData.data;
let node=findNode(ns,controls.editid)
如果(节点){
node.foldername=resp.data.foldername

console.log(treeData.data)//在您的情况下,浅层复制将无法工作,因为它是一个树结构,嵌套对象不会被克隆


要进行深度复制,可以使用
let ns=JSON.parse(JSON.stringify(treeData.data))
或任何用于深度复制的第三方库。

这是因为您正在将
ns
设置为等于
treeData.data
。当您这样做时,您没有分配给ns树数据值,而是引用它,如果您想制作一个真正的副本,那么请使用spread操作符创建一个新对象…类似于
let ns=[…treeData.data]
。这就可以了。谢谢你的回复,Ezequiel。我已经将代码更改为我能想到的所有内容:
ns=[{…treeData.data}]
ns=[…treeData.data]
ns={…treeData}
并且它仍然不会返回值。Id我传递实际的treeData.data(我不应该这样做)然后返回正确的值。这很奇怪,我使用了树结构,而spread操作符工作了…你能添加一个例子说明你的teeData.data是什么样子吗?…我看到在你的if语句中你使用了“==”而不是“==”,我建议你更改它!同时更改
return(node[I])
返回节点[i]
这很奇怪,但我能用
deepClone
解决这个问题。但我很困惑,因为我认为你建议的方法是深度复制而不是浅复制。所以,我不是很确定,但问题是通过使用第三方库解决的。不过,谢谢你的帮助。谢谢Sandipan。我用了
deepClone
为了解决这个问题,我很感激你的回答。