<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Saiki&#39;s home</title>
  
  <subtitle>快乐的鱼塘</subtitle>
  <link href="https://saikikoko.github.io/atom.xml" rel="self"/>
  
  <link href="https://saikikoko.github.io/"/>
  <updated>2021-06-03T02:12:47.759Z</updated>
  <id>https://saikikoko.github.io/</id>
  
  <author>
    <name>Saiki</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>一文彻底搞懂slot</title>
    <link href="https://saikikoko.github.io/2021/06/03/%E4%B8%80%E6%96%87%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82slot/"/>
    <id>https://saikikoko.github.io/2021/06/03/%E4%B8%80%E6%96%87%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82slot/</id>
    <published>2021-06-03T02:09:29.000Z</published>
    <updated>2021-06-03T02:12:47.759Z</updated>
    
    <content type="html"><![CDATA[<p>slot具体用法，以及渲染函数和jsx语法</p><a id="more"></a><p>什么时候会用到插槽？</p><p>有了<code>props</code>，为什么还需要<code>slot</code>插槽?</p><p>插槽更灵活，即插即用，不占空间</p><h2 id="模板语法"><a href="#模板语法" class="headerlink" title="模板语法"></a>模板语法</h2><h4 id="具名插槽"><a href="#具名插槽" class="headerlink" title="具名插槽"></a>具名插槽</h4><p>假如有个子组件如下</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">slot</span>&gt;</span><span class="tag">&lt;/<span class="name">slot</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>基础用法，在父组件中使用子组件<code>child</code>的时候，在子组件标签内部的内容会被视为插槽的内容。如下，child开始标签和结束标签之间所有内容，会被当做默认插槽的内容，插入到<code>&lt;slot&gt;&lt;/slot&gt;</code>中</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">child</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>这是一个插槽<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">  好的</span><br><span class="line"><span class="tag">&lt;/<span class="name">child</span>&gt;</span></span><br></pre></td></tr></table></figure><p>但是，我们也可以给插槽命名，这时候在父组件中，通过<code>slot=&quot;xxx&quot;</code>，就可以将内容插入对应名字的插槽内，子组件对应如下</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">header</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">slot</span> <span class="attr">name</span>=<span class="string">&quot;header&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">slot</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">header</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">main</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">slot</span>&gt;</span><span class="tag">&lt;/<span class="name">slot</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">main</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">footer</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">slot</span> <span class="attr">name</span>=<span class="string">&quot;footer&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">slot</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">footer</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>此时，子组件有三个插槽，两个具名插槽<code>header</code>和<code>footer</code>，还有一个默认插槽。对应父组件的如何运用这些插槽，如下写法：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">child</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">template</span> <span class="attr">slot</span>=<span class="string">&quot;header&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h1</span>&gt;</span>这是头部<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">template</span>&gt;</span>这是内容<span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">template</span> <span class="attr">slot</span>=<span class="string">&quot;footer&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h1</span>&gt;</span>这是尾部<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">child</span>&gt;</span></span><br></pre></td></tr></table></figure><p><code>vue 2.6</code>版本开始语法有所更新，通过<code>v-slot:xxx</code>的方式，对插槽进行命名</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">v-slot:header</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>这是一个头部<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">v-slot</span>&gt;</span> <span class="comment">&lt;!-- 可以使用v-slot:default 也可以省略v-slot，三种方式都代表默认插槽 --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span>&gt;</span>这是内容<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">v-slot:footer</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>这是一个尾部<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>注意 <strong><code>v-slot</code> 只能添加在 <code>&lt;template&gt;</code> 上</strong>（有一种特殊情况）</p></blockquote><blockquote><p>当被提供的内容只有默认插槽时，组建的标签才可以被当作插槽的模板来使用。这样我们可以把<code>v-slot</code>直接用在组件上：</p></blockquote><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">current-user</span> <span class="attr">v-slot:default</span>=<span class="string">&quot;slotProps&quot;</span>&gt;</span></span><br><span class="line">  &#123;&#123; slotProps.user.firstName &#125;&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">current-user</span>&gt;</span></span><br></pre></td></tr></table></figure><p>通过上面的写法，父级可以非常自由地在子组件中插入对应的内容，但是如果父级想要在插槽中访问子级的作用域时，该如何操作呢？<code>vue</code>给我们提供了作用域插槽</p><h4 id="插槽作用域"><a href="#插槽作用域" class="headerlink" title="插槽作用域"></a>插槽作用域</h4><p>假如有如下子组件，通过<code>v-bind:foo</code>在插槽上绑定了一个<code>foo</code>的值</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">slot</span> <span class="attr">v-bind:foo</span>=<span class="string">&quot;foo&quot;</span> <span class="attr">:user</span>=<span class="string">&quot;user&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">slot</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong>废弃的<code>slot-scope</code>语法</strong></p><p>在父组件中，则可以通过任意一个取名的参数接受插槽传递的<code>props</code>，比如使用<code>slotProps</code>接受子组件默认插槽传递的所有props属性，所以<code>slotPoops</code>包括两个属性<code>foo</code>和<code>user</code></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">slot-scope</span>=<span class="string">&quot;slotProps&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;slotProps.foo&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;slotProps.user&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br></pre></td></tr></table></figure><p>也支持解构的方式来读取子级传递过来的参数</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">slot-scope</span>=<span class="string">&quot;&#123;foo, user&#125;&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;foo&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;user&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong><code>vue 2.6.x</code>新语法</strong></p><p>新语法，不再将具名插槽和插槽作用域，分成两个不同的属性，而是通过指令<code>v-slot</code>将二者合二为一，具体如何使用，见下面的示例</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">slot</span> <span class="attr">name</span>=<span class="string">&quot;footer&quot;</span> <span class="attr">:user</span>=<span class="string">&quot;fullName&quot;</span> <span class="attr">:foo</span>=<span class="string">&quot;foo1&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">slot</span>&gt;</span> <span class="comment">&lt;!-- child的插槽 --&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 父级 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">v-slot:footer</span>=<span class="string">&quot;&#123;foo, user&#125;&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;&#123;foo.bar&#125;&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;&#123;user&#125;&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br></pre></td></tr></table></figure><p>新语法，看上去比废弃的属性更为直观</p><p><code>v-slot</code>缩写为<code>#</code></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span> #<span class="attr">footer</span>=<span class="string">&quot;&#123;foo, user&#125;&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;&#123;foo.bar&#125;&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;&#123;user&#125;&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="具体示例"><a href="#具体示例" class="headerlink" title="具体示例"></a>具体示例</h4><blockquote><p><strong>插槽 prop 允许我们将插槽转换为可复用的模板，这些模板可以基于输入的 prop 渲染出不同的内容。</strong>这在设计封装数据逻辑同时允许父级组件自定义部分布局的可复用组件时是最有用的。</p></blockquote><p>实现一个官方的例子<code>todo-list</code>组件</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">li</span></span></span><br><span class="line"><span class="tag">    <span class="attr">v-for</span>=<span class="string">&quot;todo in filteredTodos&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">v-bind:key</span>=<span class="string">&quot;todo.id&quot;</span></span></span><br><span class="line"><span class="tag">  &gt;</span></span><br><span class="line">    <span class="comment">&lt;!--</span></span><br><span class="line"><span class="comment">    我们为每个 todo 准备了一个插槽，</span></span><br><span class="line"><span class="comment">    将 `todo` 对象作为一个插槽的 prop 传入。</span></span><br><span class="line"><span class="comment">    --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">slot</span> <span class="attr">name</span>=<span class="string">&quot;todo&quot;</span> <span class="attr">v-bind:todo</span>=<span class="string">&quot;todo&quot;</span>&gt;</span></span><br><span class="line">      <span class="comment">&lt;!-- 后备内容 --&gt;</span></span><br><span class="line">      &#123;&#123; todo.text &#125;&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">slot</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="javascript">  <span class="keyword">export</span> <span class="keyword">default</span> &#123;</span></span><br><span class="line">    props: &#123;</span><br><span class="line">      todos: &#123;</span><br><span class="line"><span class="javascript">        type: <span class="built_in">Array</span>,</span></span><br><span class="line"><span class="javascript">        <span class="keyword">default</span>: <span class="function">() =&gt;</span> [],</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    computed: &#123;</span><br><span class="line">      filteredTodos() &#123;</span><br><span class="line"><span class="javascript">        <span class="keyword">return</span> <span class="built_in">this</span>.todos</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">lang</span>=<span class="string">&quot;scss&quot;</span> <span class="attr">scoped</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><p>在父级引用</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">template</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">todo-list</span> <span class="attr">v-bind:todos</span>=<span class="string">&quot;todos&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">template</span> <span class="attr">v-slot:todo</span>=<span class="string">&quot;&#123; todo &#125;&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">span</span> <span class="attr">v-if</span>=<span class="string">&quot;todo.isComplete&quot;</span>&gt;</span>✓<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">    &#123;&#123; todo.text &#125;&#125;</span><br><span class="line">  <span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">todo-list</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="javascript"><span class="keyword">import</span> TodoList <span class="keyword">from</span> <span class="string">&#x27;./TodoList&#x27;</span></span></span><br><span class="line"><span class="javascript"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span></span><br><span class="line">  components: &#123;</span><br><span class="line">    TodoList</span><br><span class="line">  &#125;,</span><br><span class="line">  data() &#123;</span><br><span class="line"><span class="javascript">    <span class="keyword">return</span> &#123;</span></span><br><span class="line">      todos: [</span><br><span class="line">        &#123;</span><br><span class="line"><span class="javascript">          text: <span class="string">&#x27;吃饭&#x27;</span>,</span></span><br><span class="line"><span class="javascript">          isComplete: <span class="literal">false</span>,</span></span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line"><span class="javascript">          text: <span class="string">&#x27;洗澡&#x27;</span>,</span></span><br><span class="line"><span class="javascript">          isComplete: <span class="literal">true</span></span></span><br><span class="line">        &#125;</span><br><span class="line">      ]</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- Add &quot;scoped&quot; attribute to limit CSS to this component only --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">scoped</span>&gt;</span></span><br><span class="line">h3 &#123;</span><br><span class="line">  margin: 40px 0 0;</span><br><span class="line">&#125;</span><br><span class="line">ul &#123;</span><br><span class="line">  list-style-type: none;</span><br><span class="line">  padding: 0;</span><br><span class="line">&#125;</span><br><span class="line">li &#123;</span><br><span class="line">  display: inline-block;</span><br><span class="line">  margin: 0 10px;</span><br><span class="line">&#125;</span><br><span class="line">a &#123;</span><br><span class="line"><span class="css">  <span class="selector-tag">color</span>: <span class="selector-id">#42b983</span>;</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="渲染函数中的插槽"><a href="#渲染函数中的插槽" class="headerlink" title="渲染函数中的插槽"></a>渲染函数中的插槽</h2><p>组件的本质是渲染函数，渲染函数产出vnode，插槽的本质实际上也是产出vnode的一个函数</p><p>可以通过<code>this.$slots</code>访问静态插槽的内容，每个插槽都是一个VNode数组：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">render: <span class="function"><span class="keyword">function</span> (<span class="params">createElement</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// `&lt;div&gt;&lt;slot&gt;&lt;/slot&gt;&lt;/div&gt;`</span></span><br><span class="line">  <span class="keyword">return</span> createElement(<span class="string">&#x27;div&#x27;</span>, <span class="built_in">this</span>.$slots.default)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>也可以通过<code>this.$scopedSlots</code>访问作用域插槽，每个作用域插槽都是一个返回若干VNode的函数</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">props: [<span class="string">&#x27;message&#x27;</span>],</span><br><span class="line">render: <span class="function"><span class="keyword">function</span> (<span class="params">createElement</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// `&lt;div&gt;&lt;slot :text=&quot;message&quot;&gt;&lt;/slot&gt;&lt;/div&gt;`</span></span><br><span class="line">  <span class="keyword">return</span> createElement(<span class="string">&#x27;div&#x27;</span>, [</span><br><span class="line">    <span class="built_in">this</span>.$scopedSlots.default(&#123;</span><br><span class="line">      text: <span class="built_in">this</span>.message</span><br><span class="line">    &#125;)</span><br><span class="line">  ])</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果要用渲染函数向子组件中传递作用域插槽，可以利用 VNode 数据对象中的 <code>scopedSlots</code> 字段</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">render: <span class="function"><span class="keyword">function</span> (<span class="params">createElement</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// `&lt;div&gt;&lt;child v-slot=&quot;props&quot;&gt;&lt;span&gt;&#123;&#123; props.text &#125;&#125;&lt;/span&gt;&lt;/child&gt;&lt;/div&gt;`</span></span><br><span class="line">  <span class="keyword">return</span> createElement(<span class="string">&#x27;div&#x27;</span>, [</span><br><span class="line">    createElement(<span class="string">&#x27;child&#x27;</span>, &#123;</span><br><span class="line">      <span class="comment">// 在数据对象中传递 `scopedSlots`</span></span><br><span class="line">      <span class="comment">// 格式为 &#123; name: props =&gt; VNode | Array&lt;VNode&gt; &#125;</span></span><br><span class="line">      scopedSlots: &#123;</span><br><span class="line">        <span class="keyword">default</span>: <span class="function"><span class="keyword">function</span> (<span class="params">props</span>) </span>&#123;</span><br><span class="line">          <span class="keyword">return</span> createElement(<span class="string">&#x27;span&#x27;</span>, props.text)</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  ])</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将上面的<code>todo-list</code>组件改写成渲染函数形式</p><p>首先是子组件</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">render(h) &#123;</span><br><span class="line">  <span class="keyword">return</span> h(<span class="string">&#x27;ul&#x27;</span>, [</span><br><span class="line">    ...this.filteredTodos(<span class="function"><span class="params">i</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">return</span> h(<span class="string">&#x27;li&#x27;</span>, &#123;</span><br><span class="line">        key: i.id,</span><br><span class="line">      &#125;, [</span><br><span class="line">        <span class="built_in">this</span>.$scopedSlots.todo ? <span class="built_in">this</span>.$scopedSlots.todo(&#123;</span><br><span class="line">          todo: i</span><br><span class="line">        &#125;) : i.text</span><br><span class="line">      ])</span><br><span class="line">    &#125;)</span><br><span class="line">  ])</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后是父组件</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">render(h) &#123;</span><br><span class="line">  <span class="keyword">return</span> h(<span class="string">&#x27;todo-list&#x27;</span>, &#123;</span><br><span class="line">    props: &#123;</span><br><span class="line">      todos: <span class="built_in">this</span>.todos,</span><br><span class="line">    &#125;,</span><br><span class="line">    scopedSlots: &#123;</span><br><span class="line">      todo: <span class="function">(<span class="params">&#123;todo&#125;</span>) =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> [</span><br><span class="line">          todo.isComplete ? h(<span class="string">&#x27;span&#x27;</span>, <span class="string">&#x27;✓&#x27;</span>) : <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">          todo.text</span><br><span class="line">        ]</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Jsx语法"><a href="#Jsx语法" class="headerlink" title="Jsx语法"></a>Jsx语法</h2><p>可以看到使用渲染函数来书写十分繁琐，那有没有简便一点的方法呢？有，那就是<code>Jsx</code>语法</p><p>同样地，我们将<code>todoList</code>用<code>Jsx</code>改造一下</p><p>子组件</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    &lt;ul&gt;</span><br><span class="line">        &#123;</span><br><span class="line">        <span class="built_in">this</span>.filteredTodos.map(<span class="function"><span class="params">todo</span> =&gt;</span> &#123;</span><br><span class="line">         <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">li</span> <span class="attr">key</span>=<span class="string">&#123;todo.id&#125;</span>&gt;</span></span></span><br><span class="line"><span class="xml">          &#123;this.$scopedSlots.todo ? this.$scopedSlots.todo(&#123;todo&#125;) : todo.text &#125;</span></span><br><span class="line"><span class="xml">          <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span>&#125;)</span><br><span class="line">            &#125;</span><br><span class="line">      &lt;/ul&gt;</span><br><span class="line">)&#125;</span><br></pre></td></tr></table></figure><p>父组件</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;todo-list todos=&#123;<span class="built_in">this</span>.todos&#125; scopedSlots=&#123;&#123;</span><br><span class="line">        todo: <span class="function">(<span class="params">&#123;todo&#125;</span>) =&gt;</span> &#123;</span><br><span class="line">          <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="xml">            &#123;todo.isComplete ? <span class="tag">&lt;<span class="name">span</span>&gt;</span>✓<span class="tag">&lt;/<span class="name">span</span>&gt;</span> : &#x27;&#x27;&#125;</span></span><br><span class="line"><span class="xml">            &#123;todo.text&#125;</span></span><br><span class="line"><span class="xml">          <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span>   </span><br><span class="line">        &#125;</span><br><span class="line">      &#125;&#125;&gt;&lt;/todo-list&gt;</span><br><span class="line">    )</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><p><a href="https://www.zhihu.com/question/37548226/answer/609289491">如何理解Vue.js的组件中的slot? - HcySunYang的回答 - 知乎 </a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;slot具体用法，以及渲染函数和jsx语法&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>打造团队代码规范</title>
    <link href="https://saikikoko.github.io/2021/05/10/%E6%89%93%E9%80%A0%E5%9B%A2%E9%98%9F%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/"/>
    <id>https://saikikoko.github.io/2021/05/10/%E6%89%93%E9%80%A0%E5%9B%A2%E9%98%9F%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/</id>
    <published>2021-05-10T08:51:17.000Z</published>
    <updated>2021-05-10T08:51:52.310Z</updated>
    
    <content type="html"><![CDATA[<p>打造团队代码规范</p><a id="more"></a><h1 id="打造团队代码规范"><a href="#打造团队代码规范" class="headerlink" title="打造团队代码规范"></a>打造团队代码规范</h1><ul><li>EditorConfig</li><li>Prettier</li><li>ESLint</li><li>Husky</li><li>Lint-staged</li><li>Commitizen</li></ul><h2 id="EditorConfig"><a href="#EditorConfig" class="headerlink" title="EditorConfig"></a><a href="https://editorconfig.org/">EditorConfig</a></h2><p>帮助一个团队多个开发人员在使用不同IDE和编辑器开发同一个项目时，能保持同样的编码风格</p><h2 id="Prettier"><a href="#Prettier" class="headerlink" title="Prettier"></a><a href="https://prettier.io/docs/en/options.html">Prettier</a></h2><p>一款十分好用的代码格式化工具</p><p>通过编写<code>.prettierrc</code></p><h2 id="ESLint"><a href="#ESLint" class="headerlink" title="ESLint"></a><a href="https://cn.eslint.org/">ESLint</a></h2><p>一个检查代码质量和风格的工具，并且可以支持自动修复</p><ol><li>安装</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i eslint -D</span><br></pre></td></tr></table></figure><ol start="2"><li>配置</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx eslint --init</span><br></pre></td></tr></table></figure><p><img src="https://gitee.com/Saikikoko/blog-image-storage/raw/master/img/20210509135215.png" alt="image-20210509135204307"></p><ol start="3"><li>第二步完成后，会自动生成一个<code>.eslintrc.js</code>文件</li></ol><p>如有额外的规则，可以在文件中的<code>rules</code>进行追加</p><ol start="4"><li>vscode中下载插件</li><li>如果需要保存文件时，自动进行修复，则在vscode配置中，添加如下配置</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;editor.codeActionsOnSave&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;source.fixAll.eslint&quot;</span>: <span class="literal">true</span></span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><ol start="6"><li><p>解决<code>prettier</code>和<code>ESLint</code>的冲突</p><p>a. 下载插件</p></li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -D --save-exact prettier</span><br><span class="line">npm i eslint-plugin-prettier eslint-config-prettier -D</span><br></pre></td></tr></table></figure><p>​    b. 添加插件</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  ...</span><br><span class="line">  <span class="keyword">extends</span>: [</span><br><span class="line">    <span class="string">&#x27;plugin:vue/essential&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;airbnb-base&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;plugin:prettier/recommended&#x27;</span> <span class="comment">// 添加 prettier 插件</span></span><br><span class="line">  ],</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="husky"><a href="#husky" class="headerlink" title="husky"></a><a href="https://github.com/typicode/husky">husky</a></h2><p><code>husky</code>: 一套git hook工具，可以在git提交时配合ESLint进行代码格式和质量校验</p><ol><li>配置<code>husky</code></li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx husky-init &amp;&amp; npm install</span><br></pre></td></tr></table></figure><p>上述命令会自动安装husky依赖，在项目根目录创建<code>.husky</code>目录，目录下有一个<code>pre-commit</code>文件，里面有一个<code>npm test</code>的默认指令，它在git提交时会运行，除此之外，还在<code>package.json</code>的<code>script</code>添加一条命令<code>husky install</code></p><ol start="2"><li>修改<code>pre-commit</code>指令</li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">eslint --fix ./src --ext .vue,.js,.ts</span><br></pre></td></tr></table></figure><p>配置完以后，git提交时，会检索所有文件，但是我们只想检索我们修改的文件，这时候需要另一个工具<code>lint-staged</code>配合</p><h2 id="lint-staged"><a href="#lint-staged" class="headerlink" title="lint-staged"></a><a href="https://github.com/okonet/lint-staged">lint-staged</a></h2><p>它可以让 husky 的 <code>hook</code> 触发的命令只作用于 <code>git add</code>那些文件（即 git 暂存区的文件），而不会影响到其他文件</p><ol><li>安装</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i lint-staged -D</span><br></pre></td></tr></table></figure><ol start="2"><li>添加<code>package.json</code></li></ol><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&quot;lint-staged&quot;: &#123;</span><br><span class="line">  &quot;*.&#123;vue,js,ts&#125;&quot;: &quot;eslint --fix&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="3"><li>修改 <code>.husky/pre-commit</code> hook 的触发命令为：<code>npx lint-staged</code></li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx lint-staged</span><br></pre></td></tr></table></figure><h4 id="和sourceTree配合使用"><a href="#和sourceTree配合使用" class="headerlink" title="和sourceTree配合使用"></a>和<code>sourceTree</code>配合使用</h4><p>正常情况下，使用sourceTree提交代码，触发husky钩子的时候，会提示报错，<code>npx</code>命令没有找到，此时在<code>pre-commit</code>文件添加一条代码就行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> PATH=/usr/<span class="built_in">local</span>/bin:<span class="variable">$PATH</span></span><br></pre></td></tr></table></figure><h2 id="规范commit提交信息"><a href="#规范commit提交信息" class="headerlink" title="规范commit提交信息"></a>规范commit提交信息</h2><ol><li>安装<code>Commitizen</code></li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install commitizen -D</span><br></pre></td></tr></table></figure><ol start="2"><li>初始化项目</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx commitizen init cz-conventional-changelog --save-dev --save-exact</span><br></pre></td></tr></table></figure><ol start="3"><li>使用<code>git cz</code>提交</li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;打造团队代码规范&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>vue开发中的一些骚操作</title>
    <link href="https://saikikoko.github.io/2020/09/29/vue%E7%9A%84%E4%B8%80%E4%BA%9B%E9%AA%9A%E6%93%8D%E4%BD%9C/"/>
    <id>https://saikikoko.github.io/2020/09/29/vue%E7%9A%84%E4%B8%80%E4%BA%9B%E9%AA%9A%E6%93%8D%E4%BD%9C/</id>
    <published>2020-09-29T07:47:40.000Z</published>
    <updated>2021-04-08T00:58:28.937Z</updated>
    
    <content type="html"><![CDATA[<p>vue2开发中一些常用的技巧</p><a id="more"></a><h2 id="介绍require-context的使用"><a href="#介绍require-context的使用" class="headerlink" title="介绍require.context的使用"></a>介绍require.context的使用</h2><p>使用场景：大规模重复劳动，手动引入同一个目录下的文件或资源等</p><p><code>require.context</code>api介绍</p><ul><li>directory 要扫描的目录</li><li>useSudirectories 是否需要扫描子目录</li><li>regExp 匹配规则</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">require</span>.context(directory, useSudirectories = <span class="literal">false</span>, regExp =  <span class="regexp">/^\.\//</span>) &#123;&#125;</span><br></pre></td></tr></table></figure><h2 id="通过Vue的自定义指令来控制按钮的权限"><a href="#通过Vue的自定义指令来控制按钮的权限" class="headerlink" title="通过Vue的自定义指令来控制按钮的权限"></a>通过Vue的自定义指令来控制按钮的权限</h2><p><code>Vue.directive( id, [definition\] )</code></p><ul><li><p><strong>参数</strong>：</p><ul><li><code>&#123;string&#125; id</code></li><li><code>&#123;Function | Object&#125; [definition]</code></li></ul></li><li><p><strong>使用</strong></p></li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 注册</span></span><br><span class="line">Vue.directive(<span class="string">&#x27;my-directive&#x27;</span>, &#123;</span><br><span class="line">  bind: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;&#125;, <span class="comment">// 只调用一次，指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置</span></span><br><span class="line">  inserted: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;&#125;, <span class="comment">// 被绑定元素插入父节点时调用 (仅保证父节点存在，但不一定已被插入文档中)</span></span><br><span class="line">  update: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;&#125;, <span class="comment">// 所在组件的 VNode 更新时调用</span></span><br><span class="line">  componentUpdated: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;&#125;, <span class="comment">// 指令所在组件的 VNode 及其子 VNode 全部更新后调用</span></span><br><span class="line">  unbind: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;&#125; <span class="comment">// 只调用一次，指令与元素解绑时调用</span></span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 注册 (指令函数)</span></span><br><span class="line">Vue.directive(<span class="string">&#x27;my-directive&#x27;</span>, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="comment">// 这里将会被 `bind` 和 `update` 调用</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><a href="https://cn.vuejs.org/v2/guide/custom-directive.html">更多具体的参见vue官方文档</a></p><p>编写一个<code>v-permission</code>指令来控制按钮的显隐，有权限的显示，否则则隐藏</p><p>结合插件的写法</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// permission</span></span><br><span class="line"><span class="keyword">const</span> Auth = [<span class="string">&#x27;admin&#x27;</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> checkAuth = <span class="function"><span class="keyword">function</span>(<span class="params">authList</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> Auth.some(<span class="function"><span class="params">item</span> =&gt;</span> authList.includes(item))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">install</span>(<span class="params">Vue</span>) </span>&#123;</span><br><span class="line">     Vue.directive(<span class="string">&#x27;permission&#x27;</span>, &#123;</span><br><span class="line">    inserted(el, binding) &#123;</span><br><span class="line">      <span class="keyword">if</span>(!checkAuth(binding.value)) &#123;</span><br><span class="line">        el.parentNode &amp;&amp; el.parentNode.removeChild(el)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;) </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;install&#125;</span><br></pre></td></tr></table></figure><p>然后在入口文件引入</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//main.js</span></span><br><span class="line"><span class="keyword">import</span> Permission form <span class="string">&#x27;./permission.js&#x27;</span></span><br><span class="line">Vue.use(Permission)</span><br></pre></td></tr></table></figure><p>之后在<code>.vue</code>文件使用</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;button v-permission&#x3D;&quot;[&#39;user&#39;]&quot;&gt;add&lt;&#x2F;button&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--</span><br><span class="line">&lt;button v-permission&#x3D;&quot;[&#39;admin&#39;]&quot;&gt;add&lt;&#x2F;button&gt;</span><br><span class="line">--&gt;</span><br></pre></td></tr></table></figure><h2 id="通过-sync是子组件改变父组件通过props传进来的值"><a href="#通过-sync是子组件改变父组件通过props传进来的值" class="headerlink" title="通过.sync是子组件改变父组件通过props传进来的值"></a>通过.sync是子组件改变父组件通过props传进来的值</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- parent --&gt;</span><br><span class="line">&lt;child :name.sync&#x3D;&quot;name&quot;&gt;&lt;&#x2F;child&gt;</span><br><span class="line">&lt;!-- 同 --&gt;</span><br><span class="line">&lt;child @update:name&#x3D;&quot;name&quot;&gt;&lt;&#x2F;child&gt;</span><br><span class="line"></span><br><span class="line">&lt;script&gt;</span><br><span class="line">  data() &#123;</span><br><span class="line">    return &#123;</span><br><span class="line">      name: &#39;小红&#39;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&lt;&#x2F;script&gt;</span><br></pre></td></tr></table></figure><p>子组件里面通过<code>this.$emit(&#39;update:name&#39;, &#39;小明&#39;)</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- child.vue --&gt;</span><br><span class="line">this.$emit(&#39;update.name&#39;, &#39;小明&#39;)</span><br></pre></td></tr></table></figure><p>这样就能使子组件改变父组件传进来的props的值</p><h2 id="Vue中的jsx写法"><a href="#Vue中的jsx写法" class="headerlink" title="Vue中的jsx写法"></a>Vue中的jsx写法</h2><p>jsx让我们用更接近模板的写法，编写渲染函数</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">p</span>&gt;</span>hello &#123; this.message &#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>jsx里面通过<code>&#123;&#125;</code>单括号包裹的形式，动态传递参数</p><p>也可以引入==组件==</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> oneComponent <span class="keyword">from</span> <span class="string">&#x27;./oneComponent&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">oneComponent</span>&gt;</span><span class="tag">&lt;/<span class="name">oneComponent</span>&gt;</span></span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="Attributes-Props"><a href="#Attributes-Props" class="headerlink" title="Attributes/Props"></a>Attributes/Props</h4><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;email&quot;</span> /&gt;</span></span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>动态绑定</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">input</span></span></span></span><br><span class="line"><span class="xml">    type=&quot;email&quot;</span></span><br><span class="line"><span class="xml">    placeholder=&#123;this.placeholderText&#125;</span></span><br><span class="line"><span class="xml">  /&gt;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用<code>...</code>运算符</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">  <span class="keyword">const</span> inputAttrs = &#123;</span><br><span class="line">    type: <span class="string">&#x27;email&#x27;</span>,</span><br><span class="line">    placeholder: <span class="string">&#x27;Enter your email&#x27;</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">input</span> &#123;<span class="attr">...</span>&#123; <span class="attr">attrs:</span> <span class="attr">inputAttrs</span> &#125;&#125; /&gt;</span></span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="Slots插槽"><a href="#Slots插槽" class="headerlink" title="Slots插槽**"></a>Slots插槽**</h4><p>命名插槽</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    &lt;MyComponent&gt;</span><br><span class="line">      &lt;header slot=<span class="string">&quot;header&quot;</span>&gt;header&lt;/header&gt;</span><br><span class="line">      &lt;footer slot=<span class="string">&quot;footer&quot;</span>&gt;footer&lt;/footer&gt;</span><br><span class="line">    &lt;/MyComponent&gt;</span><br><span class="line">  )</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>作用域插槽</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">render() &#123;</span><br><span class="line">  <span class="keyword">const</span> scopedSlots = &#123;</span><br><span class="line">    header: <span class="function">() =&gt;</span> <span class="xml"><span class="tag">&lt;<span class="name">header</span>&gt;</span>header<span class="tag">&lt;/<span class="name">header</span>&gt;</span></span>,</span><br><span class="line">    footer: <span class="function">() =&gt;</span> <span class="xml"><span class="tag">&lt;<span class="name">footer</span>&gt;</span>footer<span class="tag">&lt;/<span class="name">footer</span>&gt;</span></span>,</span><br><span class="line">      <span class="keyword">default</span>: <span class="function">() =&gt;</span> <span class="xml"><span class="tag">&lt;<span class="name">h1</span>&gt;</span>content<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">MyComponent</span> <span class="attr">scopedSlots</span>=<span class="string">&#123;scopedSlots&#125;</span> /&gt;</span></span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&lt;!-- 渲染函数写法 --&gt;</span><br><span class="line">render(h) &#123;</span><br><span class="line">  <span class="keyword">return</span> h(Mycomponent, &#123;</span><br><span class="line">    scopedSlots: &#123;</span><br><span class="line">      header: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> h(<span class="string">&#x27;header&#x27;</span>, [<span class="string">&#x27;header&#x27;</span>])</span><br><span class="line">      &#125;,</span><br><span class="line">      footer: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> h(<span class="string">&#x27;footer&#x27;</span>, [<span class="string">&#x27;footer&#x27;</span>])</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&lt;!-- 模板写法 --&gt;</span><br><span class="line">&lt;MyComponent&gt;</span><br><span class="line">    &lt;template v-slot:header&gt;</span><br><span class="line">      &lt;header&gt;header&lt;/header&gt;</span><br><span class="line">  &lt;/template&gt;</span><br><span class="line">  </span><br><span class="line">  &lt;template #footer&gt;</span><br><span class="line">      &lt;header&gt;header&lt;/header&gt;</span><br><span class="line">  &lt;/template&gt;</span><br><span class="line">&lt;/MyComponent&gt;</span><br></pre></td></tr></table></figure><p><a href="##Vue%E6%8F%92%E6%A7%BD">扩展一下Vue的插槽内容</a></p><h4 id="指令"><a href="#指令" class="headerlink" title="指令"></a>指令</h4><p>==vue官网给出的vOn并不能用==</p><p>那么jsx如何监听事件？</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&lt;p on=&#123;</span><br><span class="line">    &#123;</span><br><span class="line">      click: <span class="built_in">this</span>.add,</span><br><span class="line">      change: <span class="built_in">this</span>.change</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;&gt;&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p &#123;...&#123;</span><br><span class="line">    on: &#123;</span><br><span class="line">      click: <span class="built_in">this</span>.add,</span><br><span class="line">      change: <span class="built_in">this</span>.change</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;&#125;&gt;&lt;/p&gt;</span><br></pre></td></tr></table></figure><p><code>vModel和domPropsInnerHTML</code>是有效的</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;input vModel=&#123;<span class="built_in">this</span>.newTodoText&#125; /&gt;</span><br><span class="line">&lt;p domPropsInnerHTML=&#123;html&#125; /&gt; &lt;!-- v-html --&gt;</span><br></pre></td></tr></table></figure><p>加上修饰符</p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;input vModel_trim=&#123;<span class="built_in">this</span>.newTodoText&#125; /&gt;</span><br></pre></td></tr></table></figure><p><code>v-if</code>和<code>v-for</code>都没有直接的指令支持，但是可以通过<code>if</code>判断或者循环语句实现相同的效果</p><p><code>v-if</code></p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="built_in">this</span>.ifTrue ? <span class="xml"><span class="tag">&lt;<span class="name">p</span>&gt;</span>true<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span> : <span class="xml"><span class="tag">&lt;<span class="name">p</span>&gt;</span>false<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span>&#125;</span><br></pre></td></tr></table></figure><p><code>v-for</code></p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"> &lt;ul&gt;</span><br><span class="line">  &#123;<span class="built_in">this</span>.pArr.map(<span class="function"><span class="params">item</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">return</span>  <span class="xml"><span class="tag">&lt;<span class="name">li</span>&gt;</span>&#123;item.name&#125;<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span></span><br><span class="line">  &#125;)&#125;</span><br><span class="line">&lt;/ul&gt;</span><br></pre></td></tr></table></figure><h4 id="函数式组件"><a href="#函数式组件" class="headerlink" title="函数式组件"></a>函数式组件</h4><p>将返回jsx的函数默认转换成函数式组件</p><h2 id="函数式组件-1"><a href="#函数式组件-1" class="headerlink" title="函数式组件"></a>函数式组件</h2><p>当一个组件只是接受一些props参数，不需要渲染时，比如包装组件时，我们可以使用函数式组件，它的渲染开销十分小，要想实现，只需要添加<code>functional: true</code>即可，函数式组件没有<code>this</code>上下文对象，所有的参数通过<code>context</code>传递</p><h2 id="Vue插槽"><a href="#Vue插槽" class="headerlink" title="Vue插槽"></a>Vue插槽</h2><h4 id="插槽命名"><a href="#插槽命名" class="headerlink" title="插槽命名"></a>插槽命名</h4><p>插槽名字默认为default，如果父组件的内容没有指定插槽，所有的内容默认插入该插槽中</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- child --&gt;</span><br><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;slot&gt;&lt;&#x2F;slot&gt; &lt;!-- name 为 default--&gt;</span><br><span class="line">  &lt;&#x2F;div&gt;</span><br><span class="line">&lt;&#x2F;template&gt;</span><br></pre></td></tr></table></figure><h4 id="具名插槽"><a href="#具名插槽" class="headerlink" title="具名插槽"></a>具名插槽</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;slot name&#x3D;&quot;header&quot;&gt;&lt;&#x2F;slot&gt;</span><br><span class="line">    &lt;slot name&#x3D;&quot;footer&quot;&gt;&lt;&#x2F;slot&gt;</span><br><span class="line">    &lt;slot&gt;&lt;&#x2F;slot&gt;</span><br><span class="line">  &lt;&#x2F;div&gt;</span><br><span class="line">&lt;&#x2F;template&gt;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- parent --&gt;</span><br><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;child&gt;</span><br><span class="line">      &lt;template v-slot:header&gt;</span><br><span class="line">        &lt;h1&gt;Here might be a page title&lt;&#x2F;h1&gt;</span><br><span class="line">      &lt;&#x2F;template&gt;</span><br><span class="line"></span><br><span class="line">      &lt;p&gt;A paragraph for the main content.&lt;&#x2F;p&gt;</span><br><span class="line">      &lt;p&gt;And another one.&lt;&#x2F;p&gt;</span><br><span class="line"></span><br><span class="line">      &lt;template v-slot:footer&gt;</span><br><span class="line">        &lt;p&gt;Here&#39;s some contact info&lt;&#x2F;p&gt;</span><br><span class="line">      &lt;&#x2F;template&gt;</span><br><span class="line">      &lt;&#x2F;child&gt;</span><br><span class="line">  &lt;&#x2F;div&gt;</span><br><span class="line">&lt;&#x2F;template&gt;</span><br></pre></td></tr></table></figure><h4 id="插槽作用域scopedSlots"><a href="#插槽作用域scopedSlots" class="headerlink" title="插槽作用域scopedSlots"></a>插槽作用域scopedSlots</h4><p>scopedSlots是一个对象，对象上的属性是返回每个插槽内容的函数，函数的参数则是插槽绑定的props，</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- child --&gt;</span><br><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;slot name&#x3D;&quot;header&quot; :page&#x3D;&quot;page&quot;&gt;&lt;&#x2F;slot&gt;</span><br><span class="line">    &lt;slot name&#x3D;&quot;footer&quot; :page&#x3D;&quot;page&quot;&gt;&lt;&#x2F;slot&gt;</span><br><span class="line">    &lt;slot&gt;&lt;&#x2F;slot&gt;</span><br><span class="line">  &lt;&#x2F;div&gt;</span><br><span class="line">&lt;&#x2F;template&gt;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- parent --&gt;</span><br><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;child&gt;</span><br><span class="line">      &lt;template v-slot:header&#x3D;&quot;slotProps&quot;&gt;</span><br><span class="line">        &lt;h1&gt;Here might be a page title&lt;&#x2F;h1&gt;</span><br><span class="line">        &lt;p&gt;&#123;&#123;slotProps.page.header&#125;&#125;&lt;&#x2F;p&gt;</span><br><span class="line">      &lt;&#x2F;template&gt;</span><br><span class="line"></span><br><span class="line">      &lt;p&gt;A paragraph for the main content.&lt;&#x2F;p&gt;</span><br><span class="line">      &lt;p&gt;And another one.&lt;&#x2F;p&gt;</span><br><span class="line"></span><br><span class="line">      &lt;template #footer&#x3D;&quot;&#123;page&#125;&quot;&gt; &lt;!-- 缩写 + 解构--&gt;</span><br><span class="line">        &lt;p&gt;Here&#39;s some contact info&lt;&#x2F;p&gt;</span><br><span class="line">        &lt;p&gt;&#123;&#123;page.footer&#125;&#125;&lt;&#x2F;p&gt;</span><br><span class="line">      &lt;&#x2F;template&gt;</span><br><span class="line">      &lt;&#x2F;child&gt;</span><br><span class="line">  &lt;&#x2F;div&gt;</span><br><span class="line">&lt;&#x2F;template&gt;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;vue2开发中一些常用的技巧&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>每日一道算法题</title>
    <link href="https://saikikoko.github.io/2020/09/12/%E6%AF%8F%E6%97%A5%E4%B8%80%E9%81%93%E7%AE%97%E6%B3%95%E9%A2%98/"/>
    <id>https://saikikoko.github.io/2020/09/12/%E6%AF%8F%E6%97%A5%E4%B8%80%E9%81%93%E7%AE%97%E6%B3%95%E9%A2%98/</id>
    <published>2020-09-12T06:52:00.000Z</published>
    <updated>2021-04-08T00:58:28.938Z</updated>
    
    <content type="html"><![CDATA[<p>每日打卡算法题</p><a id="more"></a><p><a href="https://leetcode-cn.com/problems/two-sum/">两数之和</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;number[]&#125;</span> <span class="variable">nums</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;number&#125;</span> <span class="variable">target</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;number[]&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> twoSum = <span class="function"><span class="keyword">function</span>(<span class="params">nums, target</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// for(let i = 0; i &lt; nums.length; i++) &#123;</span></span><br><span class="line">    <span class="comment">//     for(let j = 0; j&lt;nums.length; j++) &#123;</span></span><br><span class="line">    <span class="comment">//         if(nums[i] + nums[j] === target &amp;&amp; i !== j) return [i,j]</span></span><br><span class="line">    <span class="comment">//     &#125;</span></span><br><span class="line">    <span class="comment">// &#125;</span></span><br><span class="line">    <span class="keyword">let</span> obj = &#123;&#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">let</span> i =<span class="number">0</span>; i&lt;nums.length; i++) &#123;</span><br><span class="line">        <span class="keyword">let</span> num = nums[i];</span><br><span class="line">        <span class="keyword">if</span>(num <span class="keyword">in</span> obj) &#123;</span><br><span class="line">            <span class="keyword">return</span> [obj[num], i]</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            obj[target - num] = i</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>利用空间换取时间</p><p><a href="https://leetcode-cn.com/problems/valid-parentheses/submissions/">有效的括号</a> </p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;string&#125;</span> <span class="variable">s</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;boolean&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> isValid = <span class="function"><span class="keyword">function</span>(<span class="params">s</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> stack = []</span><br><span class="line">    <span class="keyword">const</span> map = &#123;</span><br><span class="line">        <span class="string">&#x27;(&#x27;</span>: <span class="string">&#x27;)&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;&#123;&#x27;</span>: <span class="string">&#x27;&#125;&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;[&#x27;</span>: <span class="string">&#x27;]&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">let</span> i=<span class="number">0</span>;i&lt;s.length;i++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(s[i] <span class="keyword">in</span> map) &#123;</span><br><span class="line">            stack.push(s[i])</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">if</span>(map[stack.pop()] !== s[i]) &#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> !stack.length</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>利用字典的思想</p><p><a href="https://leetcode-cn.com/problems/simplify-path/solution/">简化路径</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;string&#125;</span> <span class="variable">path</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;string&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> simplifyPath = <span class="function"><span class="keyword">function</span>(<span class="params">path</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> stack = []</span><br><span class="line">    <span class="keyword">const</span> paths = path.split(<span class="string">&#x27;/&#x27;</span>)</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">let</span> i =<span class="number">0</span>;i&lt;paths.length;i++) &#123;</span><br><span class="line">        <span class="keyword">const</span> p = paths[i]</span><br><span class="line">        <span class="keyword">if</span>(p === <span class="string">&#x27;..&#x27;</span>) &#123;</span><br><span class="line">            stack.pop()</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span>(p &amp;&amp; p !== <span class="string">&#x27;.&#x27;</span>) &#123;</span><br><span class="line">            stack.push(p)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;/&#x27;</span> + stack.join(<span class="string">&#x27;/&#x27;</span>)</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>一个简单的链表</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 手动实现链表结构</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Node</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>(element) &#123;</span><br><span class="line">    <span class="built_in">this</span>.element = element</span><br><span class="line">    <span class="built_in">this</span>.next =<span class="literal">null</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">LinkNodeList</span> </span>&#123;</span><br><span class="line">  <span class="keyword">constructor</span>() &#123;</span><br><span class="line">    <span class="built_in">this</span>.head = <span class="literal">null</span></span><br><span class="line">    <span class="built_in">this</span>.length = <span class="number">0</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  append(element) &#123;</span><br><span class="line">    <span class="keyword">let</span> node = <span class="keyword">new</span> Node(element)</span><br><span class="line">    <span class="keyword">let</span> cur</span><br><span class="line">    <span class="keyword">if</span>(!<span class="built_in">this</span>.head) &#123;</span><br><span class="line">      <span class="built_in">this</span>.head = node</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      cur = <span class="built_in">this</span>.head</span><br><span class="line">      <span class="keyword">while</span>(cur.next) &#123;</span><br><span class="line">        cur = cur.next </span><br><span class="line">      &#125;</span><br><span class="line">      cur.next =node</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">this</span>.length += <span class="number">1</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  print() &#123;</span><br><span class="line">    <span class="keyword">let</span> cur = <span class="built_in">this</span>.head</span><br><span class="line">    <span class="keyword">let</span> ret = []</span><br><span class="line">    <span class="keyword">while</span>(cur) &#123;</span><br><span class="line">      ret.push(cur.element)</span><br><span class="line">      cur = cur.next</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ret.join(<span class="string">&#x27;==&gt;&#x27;</span>)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  removeAt(index) &#123;</span><br><span class="line">    <span class="keyword">let</span> prev</span><br><span class="line">    <span class="keyword">let</span> cur = <span class="built_in">this</span>.head</span><br><span class="line">    <span class="keyword">let</span> i = <span class="number">0</span></span><br><span class="line">    <span class="keyword">if</span>(index === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="built_in">this</span>.head = cur.next</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="keyword">while</span>(i &lt; index) &#123;</span><br><span class="line">        prev = cur</span><br><span class="line">        cur = cur.next</span><br><span class="line">        i++</span><br><span class="line">      &#125;</span><br><span class="line">      prev.next = cur.next</span><br><span class="line">      cur.next = <span class="literal">null</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">this</span>.length -= <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">return</span> cur.element;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> linkList = <span class="keyword">new</span> LinkNodeList()</span><br><span class="line">linkList.append(<span class="string">&#x27;hah&#x27;</span>)</span><br><span class="line">linkList.append(<span class="string">&#x27;yy&#x27;</span>)</span><br><span class="line">linkList.removeAt(<span class="number">1</span>)</span><br><span class="line">linkList.print()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/middle-of-the-linked-list/submissions/">链表的中间节点</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;ListNode&#125;</span> <span class="variable">head</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;ListNode&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> middleNode = <span class="function"><span class="keyword">function</span>(<span class="params">head</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 初学时的暴力解法</span></span><br><span class="line">    <span class="comment">// let n = 0</span></span><br><span class="line">    <span class="comment">// let p = &#123;&#125;</span></span><br><span class="line">    <span class="comment">// p.next = head</span></span><br><span class="line">    <span class="comment">// let node = p</span></span><br><span class="line">    <span class="comment">// let arr = []</span></span><br><span class="line">    <span class="comment">// while(node) &#123;</span></span><br><span class="line">    <span class="comment">//     if(node.val) &#123;</span></span><br><span class="line">    <span class="comment">//         arr.push(node)</span></span><br><span class="line">    <span class="comment">//         n++</span></span><br><span class="line">    <span class="comment">//     &#125;</span></span><br><span class="line">    <span class="comment">//     node = node.next</span></span><br><span class="line">    <span class="comment">// &#125;</span></span><br><span class="line">    <span class="comment">// if(n%2 === 0) &#123;</span></span><br><span class="line">    <span class="comment">//     return arr[n/2]</span></span><br><span class="line">    <span class="comment">// &#125; else &#123;</span></span><br><span class="line">    <span class="comment">//     return arr[Math.floor(n/2)]</span></span><br><span class="line">    <span class="comment">// &#125;</span></span><br><span class="line">    <span class="comment">// 快慢指针法</span></span><br><span class="line">    <span class="keyword">let</span> slow = head</span><br><span class="line">    <span class="keyword">let</span> fast = head</span><br><span class="line">    <span class="keyword">while</span>(fast &amp;&amp; fast.next) &#123;</span><br><span class="line">        slow = slow.next</span><br><span class="line">        fast = fast.next.next</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> slow</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>没有写边界判断的逻辑，只是一个简单的熟悉链表结构的demo</p><p><a href="https://leetcode-cn.com/problems/remove-linked-list-elements/submissions/">链表的删除</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for singly-linked list.</span></span><br><span class="line"><span class="comment"> * function ListNode(val) &#123;</span></span><br><span class="line"><span class="comment"> *     this.val = val;</span></span><br><span class="line"><span class="comment"> *     this.next = null;</span></span><br><span class="line"><span class="comment"> * &#125;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;ListNode&#125;</span> <span class="variable">head</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;number&#125;</span> <span class="variable">val</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;ListNode&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> removeElements = <span class="function"><span class="keyword">function</span>(<span class="params">head, val</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 添加一个哨兵元素</span></span><br><span class="line">    <span class="keyword">let</span> prev = &#123;</span><br><span class="line">        next: head</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">let</span> cur = prev</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span>(cur.next) &#123;</span><br><span class="line">        <span class="keyword">if</span>(cur.next.val === val) &#123;</span><br><span class="line">            cur.next = cur.next.next</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            cur = cur.next</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> prev.next</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/reverse-linked-list/submissions/">链表翻转</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for singly-linked list.</span></span><br><span class="line"><span class="comment"> * function ListNode(val) &#123;</span></span><br><span class="line"><span class="comment"> *     this.val = val;</span></span><br><span class="line"><span class="comment"> *     this.next = null;</span></span><br><span class="line"><span class="comment"> * &#125;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;ListNode&#125;</span> <span class="variable">head</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;ListNode&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> reverseList = <span class="function"><span class="keyword">function</span>(<span class="params">head</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">let</span> cur = head</span><br><span class="line">    <span class="keyword">let</span> prev = <span class="literal">null</span></span><br><span class="line">    <span class="keyword">while</span>(cur !== <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="keyword">let</span> next = cur.next</span><br><span class="line">        cur.next = prev</span><br><span class="line">        prev = cur</span><br><span class="line">        cur = next    </span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> prev</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/linked-list-cycle-ii/submissions/">环形链表II</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for singly-linked list.</span></span><br><span class="line"><span class="comment"> * function ListNode(val) &#123;</span></span><br><span class="line"><span class="comment"> *     this.val = val;</span></span><br><span class="line"><span class="comment"> *     this.next = null;</span></span><br><span class="line"><span class="comment"> * &#125;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;ListNode&#125;</span> <span class="variable">head</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;ListNode&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> detectCycle = <span class="function"><span class="keyword">function</span>(<span class="params">head</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 解法一</span></span><br><span class="line">    <span class="comment">// const cache = new Set()</span></span><br><span class="line">    <span class="comment">// while(head) &#123;</span></span><br><span class="line">    <span class="comment">//     if(cache.has(head)) &#123;</span></span><br><span class="line">    <span class="comment">//         return head</span></span><br><span class="line">    <span class="comment">//     &#125; else &#123;</span></span><br><span class="line">    <span class="comment">//         cache.add(head)</span></span><br><span class="line">    <span class="comment">//         head = head.next</span></span><br><span class="line">    <span class="comment">//     &#125;</span></span><br><span class="line">    <span class="comment">// &#125;</span></span><br><span class="line">    <span class="comment">// return null</span></span><br><span class="line">    <span class="comment">// 解法二 快慢指针</span></span><br><span class="line">    <span class="keyword">let</span> fast = head</span><br><span class="line">    <span class="keyword">let</span> slow = head</span><br><span class="line">    <span class="keyword">let</span> start = head</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">while</span>(fast &amp;&amp; fast.next) &#123;</span><br><span class="line">        fast = fast.next.next</span><br><span class="line">        slow = slow.next</span><br><span class="line">        <span class="keyword">if</span>(slow == fast) &#123;</span><br><span class="line">            <span class="keyword">while</span>(slow &amp;&amp; start) &#123;</span><br><span class="line">                <span class="keyword">if</span>(slow == start) &#123;</span><br><span class="line">                    <span class="keyword">return</span> slow</span><br><span class="line">                &#125;</span><br><span class="line">                slow = slow.next</span><br><span class="line">                start = start.next         </span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">null</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/invert-binary-tree/">翻转二叉树</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @lc app=leetcode.cn id=226 lang=javascript</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * [226] 翻转二叉树</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// @lc code=start</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * function TreeNode(val) &#123;</span></span><br><span class="line"><span class="comment"> *     this.val = val;</span></span><br><span class="line"><span class="comment"> *     this.left = this.right = null;</span></span><br><span class="line"><span class="comment"> * &#125;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;TreeNode&#125;</span> <span class="variable">root</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;TreeNode&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> invertTree = <span class="function"><span class="keyword">function</span>(<span class="params">root</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span>(root == <span class="literal">null</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> root</span><br><span class="line">  &#125;</span><br><span class="line">  [root.left, root.right] = [invertTree(root.right), invertTree(root.left)]</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> root</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>二叉树遍历</p><p>前序遍历：自己-》left-》right<br>中序遍历：left-》自己-》right<br>后序遍历：left-》right-》自己</p><p><a href="https://leetcode-cn.com/problems/binary-tree-preorder-traversal/">前序遍历</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// @lc code=start</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * function TreeNode(val) &#123;</span></span><br><span class="line"><span class="comment"> *     this.val = val;</span></span><br><span class="line"><span class="comment"> *     this.left = this.right = null;</span></span><br><span class="line"><span class="comment"> * &#125;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;TreeNode&#125;</span> <span class="variable">root</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;number[]&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> preorderTraversal = <span class="function"><span class="keyword">function</span>(<span class="params">root, arr = []</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// 递归</span></span><br><span class="line">  <span class="comment">// if(root) &#123;</span></span><br><span class="line">  <span class="comment">//   arr.push(root.val)</span></span><br><span class="line">  <span class="comment">//   preorderTraversal(root.left, arr)</span></span><br><span class="line">  <span class="comment">//   preorderTraversal(root.right, arr)</span></span><br><span class="line">  <span class="comment">// &#125;</span></span><br><span class="line">  <span class="comment">// return arr</span></span><br><span class="line">  <span class="comment">// 迭代</span></span><br><span class="line">  <span class="keyword">let</span> result = []</span><br><span class="line">  <span class="keyword">let</span> stack = [] <span class="comment">// 用来得到right</span></span><br><span class="line">  <span class="keyword">let</span> cur = root</span><br><span class="line"></span><br><span class="line">  <span class="keyword">while</span>(cur || stack.length &gt; <span class="number">0</span>) &#123;</span><br><span class="line">    <span class="keyword">while</span>(cur) &#123;</span><br><span class="line">      result.push(cur.val)</span><br><span class="line">      stack.push(cur)</span><br><span class="line">      cur = cur.left</span><br><span class="line">    &#125;</span><br><span class="line">    cur = stack.pop()</span><br><span class="line">    cur = cur.right</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> result</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>二叉搜索树：节点自身大于左子树，小于右子树<br><a href="https://leetcode-cn.com/problems/binary-tree-inorder-traversal/submissions/">中序遍历</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> inorderTraversal = <span class="function"><span class="keyword">function</span>(<span class="params">root</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 递归</span></span><br><span class="line">    <span class="comment">// if(root == null) &#123;</span></span><br><span class="line">    <span class="comment">//     return arr</span></span><br><span class="line">    <span class="comment">// &#125;</span></span><br><span class="line">    <span class="comment">// inorderTraversal(root.left, arr)</span></span><br><span class="line">    <span class="comment">// if(root.val) arr.push(root.val)</span></span><br><span class="line">    <span class="comment">// inorderTraversal(root.right, arr)</span></span><br><span class="line">    <span class="comment">// return arr</span></span><br><span class="line">    <span class="comment">// 迭代</span></span><br><span class="line">    <span class="keyword">let</span> result = []</span><br><span class="line">    <span class="keyword">let</span> stack = []</span><br><span class="line">    <span class="keyword">let</span> cur = root</span><br><span class="line">    <span class="keyword">while</span>(cur || stack.length &gt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">while</span>(cur) &#123;</span><br><span class="line">            stack.push(cur)</span><br><span class="line">            cur = cur.left</span><br><span class="line">        &#125;</span><br><span class="line">        cur = stack.pop()</span><br><span class="line">        result.push(cur.val)</span><br><span class="line">        cur = cur.right</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> result</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/">二叉树的深度</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;TreeNode&#125;</span> <span class="variable">root</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;number&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> maxDepth = <span class="function"><span class="keyword">function</span>(<span class="params">root</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 递归</span></span><br><span class="line">    <span class="keyword">if</span>(root == <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">Math</span>.max(maxDepth(root.left), maxDepth(root.right)) + <span class="number">1</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/">二叉搜索树的最近公共祖先</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> lowestCommonAncestor = <span class="function"><span class="keyword">function</span>(<span class="params">root, p, q</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 递归</span></span><br><span class="line">    <span class="comment">// if(p.val &gt; root.val &amp;&amp; q.val &gt; root.val) &#123;</span></span><br><span class="line">    <span class="comment">//     return lowestCommonAncestor(root.right, p, q)</span></span><br><span class="line">    <span class="comment">// &#125; else if(p.val &lt; root.val &amp;&amp; q.val &lt; root.val) &#123;</span></span><br><span class="line">    <span class="comment">//     return lowestCommonAncestor(root.left, p, q)</span></span><br><span class="line">    <span class="comment">// &#125; else &#123;</span></span><br><span class="line">    <span class="comment">//     return root</span></span><br><span class="line">    <span class="comment">// &#125;</span></span><br><span class="line">    <span class="comment">// 迭代</span></span><br><span class="line">    <span class="keyword">while</span>(root) &#123;</span><br><span class="line">        <span class="keyword">if</span>(p.val &gt; root.val &amp;&amp; q.val &gt; root.val) &#123;</span><br><span class="line">            root = root.right</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span>(q.val &lt; root.val &amp;&amp; p.val &lt; root.val) &#123;</span><br><span class="line">            root = root.left</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> root</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/">二叉树最近公共祖先</a></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;TreeNode&#125;</span> <span class="variable">root</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;TreeNode&#125;</span> <span class="variable">p</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param <span class="type">&#123;TreeNode&#125;</span> <span class="variable">q</span></span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return <span class="type">&#123;TreeNode&#125;</span></span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> lowestCommonAncestor = <span class="function"><span class="keyword">function</span>(<span class="params">root, p, q</span>) </span>&#123;</span><br><span class="line">    <span class="comment">// 递归</span></span><br><span class="line">    <span class="keyword">if</span>(root == <span class="literal">null</span> || root == p || root == q) &#123;</span><br><span class="line">        <span class="keyword">return</span> root</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> left = lowestCommonAncestor(root.left, p, q)</span><br><span class="line">    <span class="keyword">let</span> right = lowestCommonAncestor(root.right, p, q)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span>(left == <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> right</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(right == <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> left</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> root</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h4 id="二分法查找"><a href="#二分法查找" class="headerlink" title="二分法查找"></a>二分法查找</h4><ol><li>二分法依赖顺序表结构</li><li>二分法查找针对的是有序数据</li><li>数据量太大、太小不适合二分法</li></ol><p>四种常见的二分法变形问题：</p><ol><li>查找第一个值等于给定值的元素</li><li>查找最后一个值等于给定值的元素</li><li>查找第一个大于等于给定值的元素</li><li>查找最后一个小于等于给定值的元素</li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;每日打卡算法题&lt;/p&gt;</summary>
    
    
    
    
    <category term="算法" scheme="https://saikikoko.github.io/tags/%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>npm包发布</title>
    <link href="https://saikikoko.github.io/2020/08/27/npm%E5%8C%85%E5%8F%91%E5%B8%83/"/>
    <id>https://saikikoko.github.io/2020/08/27/npm%E5%8C%85%E5%8F%91%E5%B8%83/</id>
    <published>2020-08-27T08:12:59.000Z</published>
    <updated>2021-04-08T00:58:28.937Z</updated>
    
    <content type="html"><![CDATA[<p>教你怎么发布一个自己的npm包</p><a id="more"></a><ol><li><p>编写测试文件</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exports</span>.sayHello = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="built_in">console</span>.log(<span class="string">&#x27;hello&#x27;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>使用<code>npm init</code>初始化包描述文件<code>package.json</code></p></li><li><p>注册包仓库账号</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm adduser</span><br></pre></td></tr></table></figure></li><li><p>上传包</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm publish .</span><br></pre></td></tr></table></figure><p>上传包的时候一定要用官方的镜像，否则会出错，这里推荐镜像管理工具<code>nrm</code></p><p>⚠️注意发布的包不要和npm官方仓库的包重名，以及需要验证你的邮箱</p></li><li><p>下载测试发布的包</p></li><li><p>管理包权限</p><p>通常你发布的包，只能自己维护，如果其他人也想有权限，可以使用下面的命令进行管理</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm owner ls &lt;package name&gt; </span><br><span class="line">npm owner add &lt;user&gt; &lt;package name&gt; </span><br><span class="line">npm owner rm &lt;user&gt; &lt;package name&gt;</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;教你怎么发布一个自己的npm包&lt;/p&gt;</summary>
    
    
    
    <category term="node" scheme="https://saikikoko.github.io/categories/node/"/>
    
    
    <category term="node" scheme="https://saikikoko.github.io/tags/node/"/>
    
  </entry>
  
  <entry>
    <title>frontend one piece</title>
    <link href="https://saikikoko.github.io/2020/08/10/frontend-one-piece/"/>
    <id>https://saikikoko.github.io/2020/08/10/frontend-one-piece/</id>
    <published>2020-08-10T02:29:12.000Z</published>
    <updated>2024-03-26T02:14:26.240Z</updated>
    
    <content type="html"><![CDATA[<p>收集各个前端社区优质的文章</p><a id="more"></a><h2 id="前端好文收藏向"><a href="#前端好文收藏向" class="headerlink" title="前端好文收藏向"></a>前端好文收藏向</h2><p>去寻找吧，前端大秘宝one piece，我把所有东西都留在那。前端就此进入大航海时代🐶</p><h4 id="webpack"><a href="#webpack" class="headerlink" title="webpack"></a>webpack</h4><ul><li><a href="https://mp.weixin.qq.com/s/6sV4wF5LwSXQhd-OKjwkOg">webpack最佳配置指北</a></li><li><a href="https://mp.weixin.qq.com/s/o3flb6peR2VL9VAKYRQwZQ">玩转 webpack，使你的打包速度提升 90%</a></li><li><a href="https://mp.weixin.qq.com/s/DJrmP4KStjujtydQoh1Ncg">你的 import 被 webpack 编译成了什么？</a></li><li><a href="https://mp.weixin.qq.com/s/mcQuU7PWxczvnTGFw5W1FQ">Webpack漫谈</a></li></ul><h4 id="Vue"><a href="#Vue" class="headerlink" title="Vue"></a>Vue</h4><ul><li><a href="https://mp.weixin.qq.com/s/tsaSfAged0yO7hKkGGQbtw">抄笔记：尤雨溪在Vue3.0 Beta直播里聊到了这些…</a></li><li><a href="https://mp.weixin.qq.com/s/synjBGTEe1YVMSDGaTc5pQ">Vue开发必须知道的36个技巧</a></li><li><a href="https://mp.weixin.qq.com/s/z5kAkyAzsj6erfWUQSN3UA">Vue源码解析，keep-alive是如何实现缓存的？</a></li><li><a href="https://mp.weixin.qq.com/s/CPE11TSmXwtMVuDy5H_Bew">Vue超好玩的新特性：在CSS中引入JS变量</a></li><li><a href="https://mp.weixin.qq.com/s/PSdxI6hjlhvJagltqFr7Jg">10个实用技巧让你的 Vue 代码更优雅</a></li><li><a href="https://mp.weixin.qq.com/s/WCfHdXCTnM71UT9K3LaiVA">一篇干货，轻松上手Vue.js 3.0</a></li><li><a href="https://mp.weixin.qq.com/s/tME3wwPXTtv4DTDGLsvtLw">一文让你30分钟快速掌握Vue3</a></li><li><a href="https://mp.weixin.qq.com/s/Yxj-avIaci1l7Qn1WDN2fA">活用async/await，让Vue变得更好用的装饰器！</a></li><li><a href="https://mp.weixin.qq.com/s/uR9vv8N9EMBbcaT4csGUWw">34条我能告诉你的Vue之实操篇</a></li><li><a href="https://mp.weixin.qq.com/s/7u3hHp4zT7aTQTvQ6JjM-w">揭秘Vuejs九个优化技巧</a></li><li><a href="https://mp.weixin.qq.com/s/u8gcINHOrrc8XfRqyjPiag">前端权限管理</a></li></ul><h4 id="前端安全"><a href="#前端安全" class="headerlink" title="前端安全"></a>前端安全</h4><ul><li><a href="https://mp.weixin.qq.com/s/w0N-jxJ7S6C7bFC8g3NP3A">为什么cookie会有httponly属性?真实案例解释XSS的三种攻击</a></li><li><a href="https://mp.weixin.qq.com/s/_2WeheJfK8ao3HrI4TXa8w">XSS攻防实战（附JS源码</a></li><li><a href="https://mp.weixin.qq.com/s/TtIxPRzxTz_gG4OqKGutxw">常见登录鉴权方案</a></li><li><a href="https://mp.weixin.qq.com/s/8icBQurPVBZhMStJlyPOOA">常见网站攻击技术，一篇打包全部带走！</a></li><li><a href="https://mp.weixin.qq.com/s/WHL9zCsBXQpO4AzYE8JHxw">聊聊前端安全之CSRF</a></li></ul><h4 id="工程化"><a href="#工程化" class="headerlink" title="工程化"></a>工程化</h4><ul><li><a href="https://mp.weixin.qq.com/s/NH6EzRgFrhS6z2jYnI2E2Q">Gitlab-ci: 从零开始的前端自动化部署</a></li><li><a href="https://mp.weixin.qq.com/s/sJMydobsSxzxj2SECwcr_A">99% 开发者没弄明白的 babel 知识</a></li><li><a href="https://mp.weixin.qq.com/s/_U6kk9MRlBNKg7pAy8ChIw">下一代前端构建工具 - Vite 2.x 源码级分析</a></li><li><a href="https://mp.weixin.qq.com/s/Np-tDI84_VTJPHAIAl8aGQ">关于前端大管家 package.json，你知道多少？</a></li><li><a href="https://mp.weixin.qq.com/s/RcnBRaNwH9WVaEbbLPTL3Q">浏览器跨 Tab 窗口通信原理及应用实践</a></li></ul><h4 id="业务"><a href="#业务" class="headerlink" title="业务"></a>业务</h4><ul><li><a href="https://mp.weixin.qq.com/s/wz7b19Nsa9jt6Ke75gcW-w">划线高亮和插入笔记的技术实现</a></li><li><a href="https://mp.weixin.qq.com/s/3hXLSOQC-B5JGmkOaYjgqw">不使用第三方库怎么实现【前端引导页】功能？</a></li><li><a href="https://mp.weixin.qq.com/s/vLi0T8DilnlBN_gFjktIGg">(10月最新) 前端图形学实战: 从零开发几何画板(vue3 + vite版)</a></li><li><a href="https://mp.weixin.qq.com/s/KMFarLh0Xjl-NYmkxFZRrg">前端主题切换方案详解</a></li><li><a href="https://mp.weixin.qq.com/s/yVnEnA1IhVde1OiNlGKN-w">深入浅出音视频与 WebRTC</a></li></ul><h4 id="JS"><a href="#JS" class="headerlink" title="JS"></a>JS</h4><ul><li><a href="https://mp.weixin.qq.com/s/tTnStR6BiAHihnaNlXBB1Q">正则极简教程，再也不会学了忘</a></li><li><a href="https://mp.weixin.qq.com/s/cruL9JGZNZQFrMSrzJJWiQ">一文了解文件上传全过程</a></li><li><a href="https://mp.weixin.qq.com/s/72KP0b5V1aJGUMB1vh9F1g">一文带你层层解锁文件下载的奥秘</a></li><li><a href="https://mp.weixin.qq.com/s/KPgzXkCYfkstNF_kvtMvNg">文件上传，搞懂这8种场景就够了</a></li><li><a href="https://mp.weixin.qq.com/s/69v_xQ93o_MGph1XqDdjTQ">谈谈JS二进制：File、Blob、FileReader、ArrayBuffer、Base64</a></li><li><a href="https://mp.weixin.qq.com/s/SRNt3V1CCtyYgQSc6QSjZA">面试官：请设计一个不能操作 DOM 和调接口的环境</a></li><li><a href="https://mp.weixin.qq.com/s/AmV22FF0kUvGk5SYLCu6fw">前端文件流、切片下载和上传：优化文件传输效率与用户体验</a></li></ul><h4 id="Node"><a href="#Node" class="headerlink" title="Node"></a>Node</h4><ul><li><a href="https://mp.weixin.qq.com/s/JmAmVXj3GAki4IQIJm6vnw">深入理解洋葱模型中间件机制</a></li><li><a href="Node.js%E5%87%A0%E7%A7%8D%E5%88%9B%E5%BB%BA%E5%AD%90%E8%BF%9B%E7%A8%8B%E6%96%B9%E6%B3%95">Node.js几种创建子进程方法</a></li></ul><h4 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h4><ul><li><a href="https://mp.weixin.qq.com/s/NsskGw4o-YcdY6yalcZaBQ">前端发展史的江湖恩怨情仇</a></li><li><a href="https://mp.weixin.qq.com/s/2xzmZbw9x-lqOcYP-h48gw">给自己点时间再记记这200条Git命令</a></li><li><a href="https://mp.weixin.qq.com/s/BzCJl4H_6XOmfz02seiDEA">前端开发不得不知道的异常捕获技巧</a></li><li><a href="https://mp.weixin.qq.com/s/QBGU4DWBEvN_4UmLDdf5uA">前端性能优化，从宏观到微观的万字长文</a></li><li><a href="https://mp.weixin.qq.com/s/K5BvmVxkiwTg9XZBl5K-pw">一网打尽可视化拖拽组件库核心技术要点</a></li><li><a href="https://mp.weixin.qq.com/s/SCFk6FgtKQ8N-VrV6OmioA">一文搞懂Web Worker(从原理到实践)</a></li><li><a href="https://mp.weixin.qq.com/s/T_Z_xKByZwbrvERoG-1OFw">快速掌握 Performance 性能分析：一个真实的优化案例</a></li><li><a href="https://mp.weixin.qq.com/s/DiEuJa8QXt2Ne2DJRW7NIA">当 Vite 遇上微前端</a></li><li><a href="https://mp.weixin.qq.com/s/ajq-eGu4DBLbHXEm2HGV8Q">一文搞懂得物前端监控</a> </li><li><a href="https://mp.weixin.qq.com/s/ZQ1KP569I6MmNmkV8TNAug">Chrome开发者建议你这样调试web应用</a></li><li><a href="https://mp.weixin.qq.com/s/Hxl1bEKXoSoa1kYNDe8KyQ?forceh5=1">谈谈跨域</a></li></ul><h4 id="脚手架"><a href="#脚手架" class="headerlink" title="脚手架"></a>脚手架</h4><ul><li><a href="https://juejin.cn/post/6879265583205089287">前端CLI脚手架思路解析-从0到1搭建</a></li><li><a href="https://mp.weixin.qq.com/s/nhJBoROH4VGMlJ2iFBhTIw">Vue CLI 是如何实现的 – 终端命令行工具篇</a></li></ul><h4 id="计算机网络"><a href="#计算机网络" class="headerlink" title="计算机网络"></a>计算机网络</h4><ul><li><a href="https://mp.weixin.qq.com/s/JBcnEBSX1RqMnF7DUkU5VA">GET和POST请求的本质区别</a></li><li><a href="https://mp.weixin.qq.com/s/hMxT2IUTHZYi1KWozETswg">三年前端还不会配置Nginx，被老板打了，今天一口气学完</a></li></ul><h4 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h4><ul><li><a href="https://mp.weixin.qq.com/s/Vcm4m5HQ7P6lc0q0nIlYfg">相见恨晚的前端开发利器</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;收集各个前端社区优质的文章&lt;/p&gt;</summary>
    
    
    
    
    <category term="前端" scheme="https://saikikoko.github.io/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="收藏" scheme="https://saikikoko.github.io/tags/%E6%94%B6%E8%97%8F/"/>
    
  </entry>
  
  <entry>
    <title>彩蛋🥚：手把手教你😏如何调试Vue源码</title>
    <link href="https://saikikoko.github.io/2020/08/07/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E5%A6%82%E4%BD%95%E8%B0%83%E8%AF%95Vue%E6%BA%90%E7%A0%81/"/>
    <id>https://saikikoko.github.io/2020/08/07/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E5%A6%82%E4%BD%95%E8%B0%83%E8%AF%95Vue%E6%BA%90%E7%A0%81/</id>
    <published>2020-08-07T04:03:40.000Z</published>
    <updated>2021-04-08T00:58:28.938Z</updated>
    
    <content type="html"><![CDATA[<p>教你如何调试Vue2.x的源码，从环境准备到编写测试用例</p><a id="more"></a><h4 id="调试环境准备"><a href="#调试环境准备" class="headerlink" title="调试环境准备"></a>调试环境准备</h4><p>首先，我们要准备一下调试环境（这里不会细讲git有关的操作，推荐<a href="https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html">阮一峰老师的教程</a>）。</p><ol><li><p>首先去Vue官方github仓库fork一份源码到自己的仓库（<a href="https://cloud.tencent.com/developer/article/1487508">没有账户，先自行创建一个</a>）</p></li><li><p>克隆一份源码到自己本地</p></li><li><p>打开项目，运行npm i安装依赖</p></li><li><p>打开package.json，找到script配置对象，在dev一栏改成如下配置</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&quot;dev&quot;: &quot;rollup -w -c scripts/config.js --sourcemap --environment TARGET:web-full-dev&quot;,</span><br></pre></td></tr></table></figure></li><li><p>运行npm run dev，它会帮助我们在dist目录下，打包一份带有映射关系的Vue.js文件，这对我们之后调试源码非常有帮助<br><img src="https://cdn.jsdelivr.net/gh/Saikikoko/blogImgStorage/20200807150244.png"><br>好了，如果以上步骤都完成了，我们就可以愉快的开始调试了，🚀起飞！</p></li></ol><h4 id="简单看看new-Vue干了什么"><a href="#简单看看new-Vue干了什么" class="headerlink" title="简单看看new Vue干了什么"></a>简单看看new Vue干了什么</h4><p>我们在项目example目下新建一个test目录，之后的测试用例都会写在该目录下。好了，开始动手开干吧！</p><p>编写一个<code>01-new Vue.html</code>文件</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="meta-keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>Vue<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;../../dist/vue.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app&quot;</span>&gt;</span></span><br><span class="line">    &#123;&#123;message&#125;&#125;</span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">const</span> app = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">      el: <span class="string">&quot;#app&quot;</span>,</span></span><br><span class="line">      data: &#123;</span><br><span class="line"><span class="javascript">        message: <span class="string">&quot;hello Vue&quot;</span></span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  <span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在浏览器中打开编写的测试用例，然后打开控制台，找到我们写的测试用例文件，然后在<code>new Vue</code>处打上断点，接着刷新浏览器，我们就进入调试模式了，具体的调试Chrome步骤，有不熟悉的可以看看这篇文章，<a href="https://juejin.im/post/6844903877532205064">Chrome 专家调试法</a></p><p>打断点，进入new Vue函数里面后，看到如下代码</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Vue</span> (<span class="params">options</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (process.env.NODE_ENV !== <span class="string">&#x27;production&#x27;</span> &amp;&amp;</span><br><span class="line">    !(<span class="built_in">this</span> <span class="keyword">instanceof</span> Vue)</span><br><span class="line">  ) &#123;</span><br><span class="line">    warn(<span class="string">&#x27;Vue is a constructor and should be called with the `new` keyword&#x27;</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">this</span>._init(options)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以看到，改构造函数主要是调用<code>_init</code>函数，对传入的options进行了处理，好我们接着进入_init函数看一看</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">Vue.prototype._init = <span class="function"><span class="keyword">function</span> (<span class="params">options?: Object</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> vm: Component = <span class="built_in">this</span></span><br><span class="line">  <span class="comment">// a uid</span></span><br><span class="line">  vm._uid = uid++</span><br><span class="line"></span><br><span class="line">  <span class="keyword">let</span> startTag, endTag</span><br><span class="line">  <span class="comment">/* istanbul ignore if */</span></span><br><span class="line">  <span class="keyword">if</span> (process.env.NODE_ENV !== <span class="string">&#x27;production&#x27;</span> &amp;&amp; config.performance &amp;&amp; mark) &#123;</span><br><span class="line">    startTag = <span class="string">`vue-perf-start:<span class="subst">$&#123;vm._uid&#125;</span>`</span></span><br><span class="line">    endTag = <span class="string">`vue-perf-end:<span class="subst">$&#123;vm._uid&#125;</span>`</span></span><br><span class="line">    mark(startTag)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// a flag to avoid this being observed</span></span><br><span class="line">  vm._isVue = <span class="literal">true</span></span><br><span class="line">  <span class="comment">// merge options</span></span><br><span class="line">  <span class="keyword">if</span> (options &amp;&amp; options._isComponent) &#123;</span><br><span class="line">    <span class="comment">// optimize internal component instantiation</span></span><br><span class="line">    <span class="comment">// since dynamic options merging is pretty slow, and none of the</span></span><br><span class="line">    <span class="comment">// internal component options needs special treatment.</span></span><br><span class="line">    initInternalComponent(vm, options)</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    vm.$options = mergeOptions(</span><br><span class="line">      resolveConstructorOptions(vm.constructor),</span><br><span class="line">      options || &#123;&#125;,</span><br><span class="line">      vm</span><br><span class="line">    )</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">/* istanbul ignore else */</span></span><br><span class="line">  <span class="keyword">if</span> (process.env.NODE_ENV !== <span class="string">&#x27;production&#x27;</span>) &#123;</span><br><span class="line">    initProxy(vm)</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    vm._renderProxy = vm</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">// expose real self</span></span><br><span class="line">  vm._self = vm</span><br><span class="line">  initLifecycle(vm) <span class="comment">// init Lifecycle</span></span><br><span class="line">  initEvents(vm) <span class="comment">// initEvents</span></span><br><span class="line">  initRender(vm)</span><br><span class="line">  callHook(vm, <span class="string">&#x27;beforeCreate&#x27;</span>)</span><br><span class="line">  initInjections(vm) <span class="comment">// resolve injections before data/props</span></span><br><span class="line">  initState(vm) <span class="comment">// 初始化响应式</span></span><br><span class="line">  initProvide(vm) <span class="comment">// resolve provide after data/props</span></span><br><span class="line">  callHook(vm, <span class="string">&#x27;created&#x27;</span>)</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* istanbul ignore if */</span></span><br><span class="line">  <span class="keyword">if</span> (process.env.NODE_ENV !== <span class="string">&#x27;production&#x27;</span> &amp;&amp; config.performance &amp;&amp; mark) &#123;</span><br><span class="line">    vm._name = formatComponentName(vm, <span class="literal">false</span>)</span><br><span class="line">    mark(endTag)</span><br><span class="line">    measure(<span class="string">`vue <span class="subst">$&#123;vm._name&#125;</span> init`</span>, startTag, endTag)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (vm.$options.el) &#123;</span><br><span class="line">    vm.$mount(vm.$options.el)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以看到<code>_init</code>是绑定在Vue原型上，该方法进行了一系列处理，核心逻辑都在这段</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">initLifecycle(vm) <span class="comment">// init Lifecycle</span></span><br><span class="line">initEvents(vm) <span class="comment">// initEvents</span></span><br><span class="line">initRender(vm)</span><br><span class="line">callHook(vm, <span class="string">&#x27;beforeCreate&#x27;</span>)</span><br><span class="line">initInjections(vm) <span class="comment">// resolve injections before data/props</span></span><br><span class="line">initState(vm) <span class="comment">// 初始化响应式</span></span><br><span class="line">initProvide(vm) <span class="comment">// resolve provide after data/props</span></span><br><span class="line">callHook(vm, <span class="string">&#x27;created&#x27;</span>)</span><br></pre></td></tr></table></figure><p>它们进行了初始化生命周期，初始化时间，初始化渲染，初始化data、computed、methods、props等等。</p><p>最后面是执行了<code>$mount</code>挂载，他会把Vue渲染成真实dom并挂载到我们制定的el元素上。</p><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>本文旨在帮助怎么进行Vue源码调试，具体的代码逻辑不做详解。授人以鱼不如授人以渔，大家加油吧💪。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;教你如何调试Vue2.x的源码，从环境准备到编写测试用例&lt;/p&gt;</summary>
    
    
    
    <category term="Vue" scheme="https://saikikoko.github.io/categories/Vue/"/>
    
    
    <category term="前端" scheme="https://saikikoko.github.io/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="Vue" scheme="https://saikikoko.github.io/tags/Vue/"/>
    
  </entry>
  
  <entry>
    <title>勿忘初心，方得始终</title>
    <link href="https://saikikoko.github.io/2020/08/02/%E5%8B%BF%E5%BF%98%E5%88%9D%E5%BF%83/"/>
    <id>https://saikikoko.github.io/2020/08/02/%E5%8B%BF%E5%BF%98%E5%88%9D%E5%BF%83/</id>
    <published>2020-08-02T11:51:06.000Z</published>
    <updated>2021-04-08T00:58:28.937Z</updated>
    
    <content type="html"><![CDATA[<p>天气微凉</p><a id="more"></a><h4 id="简单聊一聊为什么打算开始写博客？"><a href="#简单聊一聊为什么打算开始写博客？" class="headerlink" title="简单聊一聊为什么打算开始写博客？"></a>简单聊一聊为什么打算开始写博客？</h4><p>大家可能都知道费曼学习法，费曼学习法宗旨就是已教促学。如果一件技术你不仅自己学会了，而且能把它言简意赅地表述出来并教给别人，那么你一定真正把它融会贯通了。</p><p>作为一个前端技术开发人员，大家都知道最近几年，前端社区蓬勃发展，各种新技术，新概念层出不穷，所以笔者想通过写文章的方式，来记录自己的学习过程，分享自己的学习经验，帮助自己掌握的更加深入的同时，期望也能帮助到浏览到我写的文章的同样渴望进步的你们。</p><p>希望以此为起点，砥砺前行！！！</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;天气微凉&lt;/p&gt;</summary>
    
    
    
    <category term="杂谈" scheme="https://saikikoko.github.io/categories/%E6%9D%82%E8%B0%88/"/>
    
    
    <category term="聊聊" scheme="https://saikikoko.github.io/tags/%E8%81%8A%E8%81%8A/"/>
    
  </entry>
  
</feed>
