<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>React 状态提升 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/react-%E7%8A%B6%E6%80%81%E6%8F%90%E5%8D%87/</link><description>Recent content in React 状态提升 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 20 Mar 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/react-%E7%8A%B6%E6%80%81%E6%8F%90%E5%8D%87/index.xml" rel="self" type="application/rss+xml"/><item><title>react 状态提升</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/react/react-015/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/react/react-015/</guid><description>&lt;p&gt;在开始介绍状态提升之前，我想先介绍一下 Prop Drilling（属性钻取）的概念。&lt;/p&gt;
&lt;h2 id="什么是prop-drilling-"&gt;什么是Prop Drilling ？&lt;/h2&gt;
&lt;p&gt;那么，什么是状态提升呢？我们都知道 React 中的&lt;strong&gt;prop drilling&lt;/strong&gt;（属性钻取）。&lt;strong&gt;prop drilling&lt;/strong&gt;意味着从父组件向子组件传递一些 props。通过这种方式，我们可以在不同的组件之间共享数据或函数。可以使用 prop 传递任何类型的数据。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/react/react-015/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;在上面的示例代码中，你可以看到，Home 组件具有一个名为 name 的状态，并且她与子组件共用 name 变量。在 React 中，只能将数据从父组件传递到子组件。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/react/react-015/image-02.webp"&gt;&lt;/p&gt;
&lt;h2 id="什么是-state-lifting"&gt;什么是 State Lifting&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/react/react-015/image-03.webp"&gt;&lt;/p&gt;
&lt;p&gt;一般来说，状态提升允许你将数据从子组件移动到父组件，与Props Drilling不同，你可以在父组件使用子组件的状态值。这是不是很疯狂？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在 React 生态中，我们知道数据只能从父组件流向子组件，但现在将学习如何让数据反过来流动。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;但是，为什么要这么做？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们可以在父组件中定义状态并将其以 prop 的方式传递给子组件，但是这么做有可能会导致性能损失和代码复杂度提升。在我之前的博客中有提到：保持状态本地化很重要。因为当状态更新时，组件以及该组件的子组件都会重新渲染。&lt;/p&gt;
&lt;p&gt;此外对于代码复杂性，对于如 Modal 这样的组件，选择在子组件中声明状态而不是在父组件中声明状态，将能够使代码更易于阅读。使用这种方法，你不必在每个父组件中声明状态。&lt;/p&gt;
&lt;p&gt;通常对应用程序中的大多数组件来说，这是不必要的。但是，对于某些类型的组件，特别是可重用组件，会有这种需求。下面描述一下最通用的场景。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多说无用，上代码：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/react/react-015/image-04.webp"&gt;&lt;/p&gt;
&lt;p&gt;例如，我们有一个常见的 Modal 组件，我们想要在 Modal 中保留可见性状态。当一些组件想要使用这个 Modal 时，通常会定义自己的可见状态，但是通过 State Lifting，这个步骤将不再必要。&lt;/p&gt;
&lt;p&gt;在 上面的 Modal 组件中，做了如下操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先，使用forwardRef执行 ref 转发，ref 转发是一种自动将 ref 通过组件传递给子组件的技术。&lt;/li&gt;
&lt;li&gt;使用 useState 声明状态以控制Modal组件的展示或隐藏。&lt;/li&gt;
&lt;li&gt;使用 React 内置的 &lt;code&gt;useImperativeHandle&lt;/code&gt; hook 将属性或者方法暴露出去，这里我们添加了一些数据和函数供父组件使用。现在父组件可以直接调用子组件的&lt;code&gt;show&lt;/code&gt;、&lt;code&gt;hide&lt;/code&gt;、&lt;code&gt;isVisble&lt;/code&gt;这些方法和属性。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/react/react-015/image-05.webp"&gt;&lt;/p&gt;</description></item></channel></rss>