【发布时间】:2019-05-09 04:19:19
【问题描述】:
我用 React 玩了几年,在某些情况下仍然对挂载/卸载机制感到困惑。
由于挂载/卸载是执行副作用的地方,我不希望它们被随机调用。所以我需要弄清楚它们是如何工作的。据我目前所知,当虚拟 dom 不存在于真实 dom 中时,它往往会被卸载。然而,这似乎不是全部,我无法推理
function TestMount(props) {
useEffect(() => {
console.log("componentDidMount", props.name);
return () => {
console.log("componentWillUnount", props.name);
};
}, []);
return <h1>Test content {" " + JSON.stringify(props.name)}</h1>;
}
function Update({ click }) {
return <button onClick={click}>Update</button>;
}
function App() {
const [count, setCount] = useState(0);
const Component = name => <TestMount name={name} />;
return (
<div className="App">
<h1>{count}</h1>
<Component name="one" />
{Component("two")}
<Update click={() => setCount(x => x + 1)} />
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
组件一是重新加载应用程序渲染超时而组件二不是?为什么会发生这种情况?
【问题讨论】:
-
因为
{name: 'one'} !== {name: 'one'},但是'two' === 'two' -
@zerkms 看不到它与 react 中的挂载机制有什么关系
-
@zerkms 真正相关的是
(()=>'one')!==(()=>'one'),但'two'==='two' -
我不知道你为什么这么认为,你有
{name: 'one'}道具,我看不出你在哪里有匿名函数() => 'one' -
@zerkms
()=>'one'实际上是合法的 react 组件,另一个()=>'one'是一个 另一个 react 组件,如果有不同的身份。如果初始化不同的组件来创建元素,react 将卸载第一个组件并重新安装第二个组件,而不是更新“相同”的组件
标签: reactjs