<?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>高阶组件 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E9%AB%98%E9%98%B6%E7%BB%84%E4%BB%B6/</link><description>Recent content in 高阶组件 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 14 Mar 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E9%AB%98%E9%98%B6%E7%BB%84%E4%BB%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>高阶组件</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/react/react-011/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/react/react-011/</guid><description>&lt;h2 id="一-前言"&gt;一 前言&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;React&lt;/code&gt;高阶组件(&lt;code&gt;HOC&lt;/code&gt;)，对于很多&lt;code&gt;react&lt;/code&gt;开发者来说并不陌生，它是灵活使用&lt;code&gt;react&lt;/code&gt;组件的一种技巧，高阶组件本身不是组件，它是一个参数为组件，返回值也是一个组件的函数。&lt;/p&gt;
&lt;p&gt;高阶作用用于&lt;strong&gt;强化组件，复用逻辑，提升渲染性能等&lt;/strong&gt;作用。高阶组件也并不是很难理解，其实接触过后还是蛮简单的，接下来将按照，&lt;strong&gt;高阶组件理解？&lt;/strong&gt;，&lt;strong&gt;高阶组件具体怎么使用？应用场景&lt;/strong&gt;， &lt;strong&gt;高阶组件实践(源码级别)&lt;/strong&gt; 为突破口，带大家详细了解一下高阶组件。&lt;/p&gt;
&lt;p&gt;我们带着问题去开始今天的讨论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 什么是高阶组件，它解决了什么问题？&lt;/li&gt;
&lt;li&gt;2 有几种高阶组件，它们优缺点是什么？&lt;/li&gt;
&lt;li&gt;3 如何写一个优秀高阶组件？&lt;/li&gt;
&lt;li&gt;4 &lt;code&gt;hoc&lt;/code&gt;怎么处理静态属性，跨层级&lt;code&gt;ref&lt;/code&gt;等问题？&lt;/li&gt;
&lt;li&gt;5 高阶组件怎么控制渲染，隔离渲染？&lt;/li&gt;
&lt;li&gt;6 高阶组件怎么监控原始组件的状态？&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;高阶组件（HOC）是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分，它是一种基于 React 的组合特性而形成的设计模式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/react/react-011/image-01.webp"&gt;&lt;/p&gt;
&lt;h2 id="二-全方位看高阶组件"&gt;二 全方位看高阶组件&lt;/h2&gt;
&lt;h2 id="1-几种包装强化组件的方式"&gt;1 几种包装强化组件的方式&lt;/h2&gt;
&lt;h3 id="-mixin模式"&gt;① mixin模式&lt;/h3&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-011/image-02.webp"&gt;&lt;/p&gt;
&lt;h4 id="老版本的react-mixins"&gt;老版本的&lt;code&gt;react-mixins&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;react&lt;/code&gt;初期提供一种组合方法。通过&lt;code&gt;React.createClass&lt;/code&gt;,加入&lt;code&gt;mixins&lt;/code&gt;属性，具体用法和&lt;code&gt;vue&lt;/code&gt; 中&lt;code&gt;mixins&lt;/code&gt;相似。具体实现如下。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;customMixin&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;componentDidMount&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;( &lt;span style="color:#e6db74"&gt;&amp;#39;------componentDidMount------&amp;#39;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;say&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;APP&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;createClass&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mixins&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [ &lt;span style="color:#a6e22e"&gt;customMixin&lt;/span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;getInitialState&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;alien&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;render&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hello&lt;/span&gt; ,&lt;span style="color:#a6e22e"&gt;world&lt;/span&gt; , &lt;span style="color:#a6e22e"&gt;my&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;is&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; } &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种&lt;code&gt;mixins&lt;/code&gt;只能存在&lt;code&gt;createClass&lt;/code&gt;中，后来&lt;code&gt;React.createClass&lt;/code&gt;连同&lt;code&gt;mixins&lt;/code&gt;这种模式被废弃了。&lt;code&gt;mixins&lt;/code&gt;会带来一些负面的影响。&lt;/p&gt;</description></item></channel></rss>