这个例子里的 component 总是重新挂载

2022-11-08 09:41:01 +08:00
 sillydaddy
const Main = (props)=>{
    var [somevar, setSomevar] = useState<number>(0);
    const SubComponent = (props)=>{
        var [count, setCount] = useState<number>(0);
        useEffect(()=>{
            console.log("SubComponent mounted!");
            return ()=>{console.log("SubComponent dis mounted");};
        }, [props]);
        return (<div>
                <div>count:{count}</div>
                <button onClick={()=>setCount(count+1)}>count++</button>
            </div>);
    }
  
    return (<div>
        <div>somevar:{somevar}</div>
        <button onClick={()=>setSomevar(somevar+1)}>somevar++</button>
        <SubComponent>
        </SubComponent>
    </div>);
}

每次点击 somevar++,SubComponent 都会重新 mount 和 unmount ,而且 count 也会清零。 点击 count++不会导致重新挂载。

什么决定了重新挂载呢?这里的父子组件结构,并没有变化啊。

2252 次点击
所在节点    React
22 条回复
theohateonion
2022-11-09 12:32:04 +08:00
@sillydaddy 或者换一种理解,每次函数都会重新执行。所以 subComponent 每次 state 变化都会是新的。
ragnaroks
2022-11-10 10:20:42 +08:00
@sillydaddy
不是 lambda 表达式每次都是生成一个新的实例,而是你的例子中,"somevar" 是一个被引用的变量。

<button onClick={()=>setSomevar(somevar + 1)}>somevar++</button> 可能会重新渲染。

但 <button onClick={()=>setSomevar(451)}>somevar++</button> 不会。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/893491

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX