<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Lemon</title>
  
  <subtitle>think &amp; action</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://zhan1025.github.io/"/>
  <updated>2019-06-26T12:22:48.754Z</updated>
  <id>https://zhan1025.github.io/</id>
  
  <author>
    <name>Zhan</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>generator方法</title>
    <link href="https://zhan1025.github.io/2019/06/26/generator%E6%96%B9%E6%B3%95/"/>
    <id>https://zhan1025.github.io/2019/06/26/generator方法/</id>
    <published>2019-06-26T12:04:07.000Z</published>
    <updated>2019-06-26T12:22:48.754Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><blockquote><p>再简单复习一下，generator</p></blockquote><a id="more"></a><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">step1</span> (<span class="params">success</span>) </span>&#123;</span><br><span class="line">  setTimeout(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">'step1'</span>);</span><br><span class="line">    success();</span><br><span class="line">  &#125;, <span class="number">1000</span>);</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">step2</span> (<span class="params">success</span>) </span>&#123;</span><br><span class="line">  setTimeout(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">'step2'</span>);</span><br><span class="line">    success();</span><br><span class="line">  &#125;, <span class="number">1000</span>);</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">step3</span> (<span class="params">success</span>) </span>&#123;</span><br><span class="line">  setTimeout(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">'step3'</span>);</span><br><span class="line">    success();</span><br><span class="line">  &#125;, <span class="number">1000</span>);</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">main</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="comment">// generator 配合yield和next来实现异步编程，</span></span><br><span class="line">  <span class="comment">// yield让函数等待上一个执行完后再执行，next（）让执行指针跳到下下一个</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">yield</span> step1;</span><br><span class="line">  <span class="keyword">yield</span> step2;</span><br><span class="line">  <span class="keyword">yield</span> step3;</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">run</span> (<span class="params">fn</span>) </span>&#123;</span><br><span class="line">  <span class="comment">/**</span></span><br><span class="line"><span class="comment">   * 在fn，也就是main这个generator函数执行完后，会返回一个generator</span></span><br><span class="line"><span class="comment">   * .next后会返回下一个yield等待执行的信息，一个对象&#123;done: false value: ƒ step1()&#125;</span></span><br><span class="line"><span class="comment">   * 那么我们通过，这个对象中的done来判断，这个generator是否执行完成（false表示后面还有一不代码要执行）</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line"><span class="keyword">let</span> gen=fn()</span><br><span class="line">  <span class="function"><span class="keyword">function</span> <span class="title">next</span> (<span class="params"></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">let</span> result = gen.next();</span><br><span class="line">    <span class="built_in">console</span>.log(result)</span><br><span class="line">    <span class="keyword">if</span> (result.done) <span class="keyword">return</span></span><br><span class="line">    result.value(next);</span><br><span class="line">  &#125;</span><br><span class="line">  next();</span><br><span class="line">&#125;</span><br><span class="line">run (main)</span><br></pre></td></tr></table></figure><p><img src="./images/generator.png" alt="输出"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;再简单复习一下，generator&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="ES6" scheme="https://zhan1025.github.io/tags/ES6/"/>
    
      <category term="generator" scheme="https://zhan1025.github.io/tags/generator/"/>
    
      <category term="异步编程" scheme="https://zhan1025.github.io/tags/%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>深入了解vue响应式原理</title>
    <link href="https://zhan1025.github.io/2019/06/23/%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3vue%E5%93%8D%E5%BA%94%E5%BC%8F%E5%8E%9F%E7%90%86/"/>
    <id>https://zhan1025.github.io/2019/06/23/深入了解vue响应式原理/</id>
    <published>2019-06-23T08:27:50.000Z</published>
    <updated>2019-06-26T07:37:34.185Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script>    <div id="aplayer-UuJscvzI" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="25718007" data-server="song" data-type="mode:circulation" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"></div>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>react一篇稍微深入</title>
    <link href="https://zhan1025.github.io/2019/06/20/react%E4%B8%80%E7%AF%87%E7%A8%8D%E5%BE%AE%E6%B7%B1%E5%85%A5/"/>
    <id>https://zhan1025.github.io/2019/06/20/react一篇稍微深入/</id>
    <published>2019-06-20T09:46:24.000Z</published>
    <updated>2019-06-21T14:25:51.071Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="setState-Object-fn-callback"><a href="#setState-Object-fn-callback" class="headerlink" title="setState( Object | fn, callback )"></a>setState( Object | fn, callback )</h2><ol start="2"><li>在一个流程中（render3完成，页面dom得到更新，叫一个数据更新流程）多次setState，会合并为一个setState来调用，合并机制非常好，但是会出现问题</li></ol><p>3.利用第一个参数函数形式解决</p><figure class="highlight pf"><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">先前的<span class="keyword">state</span></span><br><span class="line">this.<span class="built_in">set</span>State(（prevState）=&gt; &#123;</span><br><span class="line">return &#123; &#125;</span><br><span class="line">&#125;)</span><br><span class="line">等同||</span><br><span class="line">this.<span class="built_in">set</span>State(（prevState）=&gt; (&#123;&#125;))</span><br></pre></td></tr></table></figure><p>4.列表渲染<br>key的重要性，是给到react内部去优化性能<br>key在兄弟节点中是必须的</p><p>   4.1. 虚拟dom的比对叫做 diff算法</p><ol><li><p>不同的根节点的树，就不需要比较了，直接以新的替换</p><p>特性：</p><ol><li>同级比较<br>1.1 同级元素类型变了，那么就不再比较子元素，直接将老的树销毁，生成新的树替换<br>1.2 同级元素相同，这时再递归比较子元素</li><li>子元素比较<blockquote><p>react中支持key属性，当子元素拥有key是，react使用key来匹配原有数上的子元素以及最新树上的子元素，使用key来匹配，使得效率变得更高</p></blockquote></li></ol></li></ol><h1 id="react实现"><a href="#react实现" class="headerlink" title="#     react实现"></a>#     react实现</h1><p>虚拟dom就是一段，jsx语法对象</p><p>1.受控组件<br>需要使用state数据去控制这个form元素</p><p>2.非受控组件<br>不需要使用state数据去控制的表单元素</p><p>非受控组件input的默认值，用defaultValue={this.state.value}</p><p>chexkoutbox  用defaultChecked</p><h1 id="生命周期"><a href="#生命周期" class="headerlink" title="# 生命周期"></a># 生命周期</h1><p>三大阶段<br>1.挂载</p><ul><li><p>constructor（）在组件实例化的时候触发</p><pre><code> 不能在里面setState1. 调用父类的z构造函数super（props）  2. 初始化数据 this.state = {}   3.绑定this指向</code></pre></li><li><p>render（）渲染</p><pre><code> 默认进来一次，后续如果有更新会再次触发使用setState要小心</code></pre></li><li><p>componentDidMount()</p><pre><code>组件挂载完成 1. 获取异步数据 2. 获取dom元素    </code></pre></li><li><p>componentWillMount()即将过期， 不要使用</p></li><li><p>static getDerivedStateFromProps ( props,state) 能够根据props数来设置state数据   </p><pre><code>1. 默认render之前调用一次2. 后续数据有变化，重新render之前又会调用3. 不能使用 this.setState4. 需要 return {} | null 如果是</code></pre><p>2.更新</p><ul><li><p>static getDerivedStateFromProps</p></li><li><p>shouldComponentUpdate （nextProps， nextState）<br>  这个组件是否是应该进行渲染？ 做性能优化<br>  一般不去用他，推荐使用 PureComponent<br>  如果使用了它，就不能再使用PureConponent<br>  ！ 需要返回中，布尔值，如果返回true -&gt; 更新生命周期函数往下执行，false -&gt; 不更新生命周期不往下执行</p></li><li><p>render</p><ul><li>getSnapshotBeforeUpdate(prevProps, prevState)</li></ul><p><strong>真实DOM渲染完成的前一刻触发</strong><br>此生命周期的任何返回值将作为参数传递给 componentDidUpdate()。</p><ul><li>componentDidUpdate(prevProps, prevState, snapshot)</li></ul><p>snapshot 是 getSnapshotBeforeUpdate 返回的值</p><ol><li>不能随意的去使用网络请求和setState。 除非加上了判断条件</li></ol></li></ul><p>3.销毁<br>conmponentWillUnmounted</p></li></ul><h2 id="组件之间通信"><a href="#组件之间通信" class="headerlink" title="组件之间通信"></a>组件之间通信</h2><ol><li><p>父 -&gt; 子     props</p></li><li><p>子-&gt; 父   传递方法给子组件</p></li><li><p>兄-&gt; 弟    3.1.状态提升</p><pre><code>3.2.使用第三方的中央事件管理器 （pubsub）3.3.context</code></pre><p> Context 提供了一个无需为每层组件手动添加 props，就能在组件树间进行数据传递的方法。            </p><p> let MyContest = React.createContext()创建一个context对象</p><pre><code>MyContext.Provider 组件  供应商MyContext.Consumer 组件  消费者， 开始结束标签内需要使用一个**函数**来return jsx，而这个函数接收一个参数，参数就是供应商的value数据 一.使用以上三步骤</code></pre><p> ​             二.在消费者组件使用  static ContextType = MyContext</p><pre><code>this.context接收数据</code></pre><p> ​        3.4.自己写一个bus</p></li></ol><p>4.react官方提供的状态管理器   flux<br>    第三方： Redux javascript的状态管理器，跟Vuex很相似<br>        &gt; 单一数据源，整个应用的state被存储在一颗object tree中<br>        1. 在redux的流程中任何时刻state，都不会发生变化，不能直接改变<br>        2. state的改变不是改变原来的state，是生成了一个新的state替换旧的state，<br>        3. Reducers不能改变state，生成一个新的state 去return（纯函数的概念）<br>        纯函数：任何时候都不会修改参数，有相同的入参，一定会产生相同的出参（每次传入相同的参数，都会出现相同的返回值）</p><blockquote><p>react组件标签之间的内容不会自动渲染出来，会在props中传入children </p></blockquote><h2 id="ref的三种使用手法"><a href="#ref的三种使用手法" class="headerlink" title="ref的三种使用手法"></a>ref的三种使用手法</h2><p>Refs 提供了一种方式，允许我们访问 DOM 节点或在 render 方法中创建的 React 元素</p><ol><li>ref=”myUL”   this.refs.myUL</li><li>ref={(target)=&gt;{this.myUL =  target}}  this.myUL </li><li>构造函数中定义 this.myUL = React.createRef()<br>ref={this.myUL}  在元素标签上设置<br>this.myUL.current  获取元素<h2 id="在组件标签内写内容，利用改组件的-this-props-children-来实现相vue中solt功能"><a href="#在组件标签内写内容，利用改组件的-this-props-children-来实现相vue中solt功能" class="headerlink" title="在组件标签内写内容，利用改组件的{this.props.children}来实现相vue中solt功能"></a>在组件标签内写内容，利用改组件的{this.props.children}来实现相vue中solt功能</h2></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="react" scheme="https://zhan1025.github.io/tags/react/"/>
    
      <category term="入门" scheme="https://zhan1025.github.io/tags/%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>react一篇搞定入门</title>
    <link href="https://zhan1025.github.io/2019/06/17/react%E4%B8%80%E7%AF%87%E6%90%9E%E5%AE%9A%E5%85%A5%E9%97%A8/"/>
    <id>https://zhan1025.github.io/2019/06/17/react一篇搞定入门/</id>
    <published>2019-06-17T13:56:20.000Z</published>
    <updated>2019-06-20T14:31:23.925Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>1.React 认为渲染逻辑本质上与其他 UI 逻辑内在耦合，比如，在 UI 中需要绑定处理事件、在某些时刻状态发生变化时需要通知到 UI，以及需要在 UI 中展示准备好的数据</p><p>2.在 JavaScript 代码中将 JSX 和 UI 放在一起时，会在视觉上有辅助作用。它还可以使 React 显示更多有用的错误和警告消息。</p><p>react  2013.5开源 （轻量级视图层库 、虚拟dom）</p><blockquote><p>对与虚拟dom，简单说就是，在render时 return出来的那段jsx，是一个js对象，称之为虚拟dom，<br>它没有直接渲染到web页面上，react 通过diff算法对现象产生的虚拟dom和之前的比较，比较出最小的dom改变，然后去渲染web页面<br>vue  2015</p></blockquote><a id="more"></a><h1 id="react-使用"><a href="#react-使用" class="headerlink" title="react 使用"></a>react 使用</h1><ul><li>cdn 链接的方式</li><li>自己搭建 webpack 的环境</li><li>使用一些官方或第三方的脚手架</li></ul><h2 id="cdn-链接的方式"><a href="#cdn-链接的方式" class="headerlink" title="cdn 链接的方式"></a>cdn 链接的方式</h2><figure class="highlight html"><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"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/react@16/umd/react.development.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</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">"https://unpkg.com/react-dom@16/umd/react-dom.development.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><ul><li>react         react核心内容</li><li>react-dom     react用来渲染真实dom的一个库</li></ul><h2 id="自己搭建-webapck-环境"><a href="#自己搭建-webapck-环境" class="headerlink" title="自己搭建 webapck 环境"></a>自己搭建 webapck 环境</h2><blockquote><ol><li>npm init -y<ol start="2"><li>npm install –save-dev webpack webpack-cli webpack-dev-server</li><li>npm install –save react react-dom</li><li>npm install –save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader</li><li>写 webpack 配置文件</li><li>写 babel 配置文件</li><li>src 文件夹 放源代码</li><li>public 文件夹 放静态资源文件</li></ol></li></ol></blockquote><h2 id="使用脚手架-create-react-app"><a href="#使用脚手架-create-react-app" class="headerlink" title="使用脚手架 create-react-app"></a>使用脚手架 create-react-app</h2><blockquote><ol><li>npm install -g create-react-app<ol start="2"><li>create-react-app <projectname></projectname></li></ol></li></ol></blockquote><p>或者</p><blockquote><ol><li>npx create-react-app <projectname></projectname></li></ol></blockquote><h2 id="ReactDOM-render"><a href="#ReactDOM-render" class="headerlink" title="ReactDOM.render();"></a>ReactDOM.render();</h2><p>一个ract项目只会调用一次<br>两个参数，<br>1.要渲染在页面上的内容(react元素 | html | 虚拟dom)<br>2.要渲染在页面上的某个位置（挂载点）</p><h1 id="jsx-语法"><a href="#jsx-语法" class="headerlink" title="jsx 语法"></a>jsx 语法</h1><ul><li>单个根元素</li><li>单标签一定要闭合</li><li>img 必须要加alt属性</li><li>标签都是小写字母，组件首字母大写</li><li>class -&gt;className</li><li>for -&gt;htmlFor</li><li><h2 id="jsx注-使用js的注释"><a href="#jsx注-使用js的注释" class="headerlink" title="jsx注: 使用js的注释{/* */}"></a>jsx注: 使用js的注释{/* */}</h2><h2 id="jsx-的插值表达式：使用单个花括号，来作为表达式"><a href="#jsx-的插值表达式：使用单个花括号，来作为表达式" class="headerlink" title="jsx 的插值表达式：使用单个花括号，来作为表达式"></a>jsx 的插值表达式：使用单个花括号，来作为表达式</h2>只能是简单的单个表达式，不能是语句也不能是条件或循环语句<br>如果需要使用条件，可采用三元运算符</li></ul><p>实现v-html     需要使用 dangerouslySetInnerHTML 这个属性，dangerouslySetInnerHTML 这个属性需要接受一个对象的value </p><figure class="highlight javascript"><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="keyword">let</span> str = <span class="string">'&lt;h1&gt;hello react&lt;/h1&gt;'</span>;</span><br><span class="line">ReactDOM.render(</span><br><span class="line">&lt;div dangerouslySetInnerHTML=&#123;&#123; <span class="attr">__html</span>: str &#125;&#125;&gt;<span class="xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line">,documnet.getElementById(<span class="string">'app'</span>))</span><br><span class="line"><span class="comment">// 最后显示的就是div包着h1标签</span></span><br><span class="line"></span><br><span class="line">&#123;&#123; <span class="attr">__html</span>: 插值html &#125;&#125;</span><br><span class="line"></span><br><span class="line">&#123; <span class="string">''</span> &#125; | &#123;<span class="literal">false</span>&#125; | &#123;<span class="literal">null</span>&#125; | &#123;underfined&#125;这种情况可以实现，v-<span class="keyword">if</span></span><br></pre></td></tr></table></figure><p><strong><em>react中没有指令系统</em></strong></p><h1 id="组件-amp-props"><a href="#组件-amp-props" class="headerlink" title="组件 &amp; props"></a>组件 &amp; props</h1><ul><li>react 中没有全局组件的概念，你需要使用哪个组件，就必须引入进来使用</li></ul><p>一 . 组件定义</p><ol><li>函数式组件</li><li>类组建</li></ol><p>二. 函数组件的定义</p><ol><li>定义一个函数，然后return出来一段jsx语法<br>，这段jsx语法就是这个组件的模板内容</li><li>PS ：函数名就是组件名，首字母大写<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> Hello =<span class="function"><span class="params">()</span> =&gt;</span> &#123; <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">h1</span>&gt;</span><span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span>&#125;</span><br></pre></td></tr></table></figure></li></ol><p>三. 类定义的组件</p><ol><li>定义一个类，类名就是组件名（首字母大写）</li><li>这个类需要继承，React.Component 这个基础组件</li><li>类中必须要有render函数，render函数return出来一段jsx语法，这段jsx语法就是这个组件的模板内容<figure class="highlight scala"><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="class"><span class="keyword">class</span> <span class="title">World</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">render () &#123; <span class="keyword">return</span> &lt;p&gt;&lt;/p&gt;&#125;&#125;</span><br><span class="line">`</span><br></pre></td></tr></table></figure></li></ol><p>PS:组件更多注意事项</p><ol><li>组件模板内容，如果需要换行去写，就是用（）包裹起来</li><li><h2 id="没有用React，为什么要引入："><a href="#没有用React，为什么要引入：" class="headerlink" title="没有用React，为什么要引入："></a>没有用React，为什么要引入：</h2></li><li>jsxc是一个语法糖</li><li>由于转换后的代码中使用了React ,使用React就必须要引入</li></ol><h2 id="组件的props属性"><a href="#组件的props属性" class="headerlink" title="组件的props属性"></a>组件的props属性</h2><p>所有 React 组件都必须像纯函数一样保护它们的 props 不被更改</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="function"><span class="keyword">function</span> <span class="title">sum</span>(<span class="params">a, b</span>) </span>&#123;</span><br><span class="line"><span class="keyword">return</span> a + b;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>调用组件的时候，在标签上写的属性，属性名就是一个prop</li><li><ol><li>props是个集合，prop是个具体的某个一个</li></ol></li><li><ol start="2"><li>Vue中使用props首先要在组件中定义props选项，而react不用</li></ol></li></ul><ol><li><p>函数组件，所有prop会做为参数传递</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> Hello = <span class="function">(<span class="params">&#123;name,age&#125;</span>) =&gt;</span> &#123;&#125;</span><br></pre></td></tr></table></figure></li><li><p>类组件<br>所有prop会在this.props身上</p><figure class="highlight scala"><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"><span class="class"><span class="keyword">class</span> <span class="title">World</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">render () &#123; <span class="keyword">return</span> &lt;p&gt;&lt;/p&gt;&#125;&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="props默认值"><a href="#props默认值" class="headerlink" title="props默认值"></a>props默认值</h2><p>例如有一个World组件，那么默认的props就是，World.defaultProps = {<br>name: ‘李四’<br>}</p><h2 id="react-元素"><a href="#react-元素" class="headerlink" title="react 元素"></a>react 元素</h2><p>一. 什么叫做react元素，最基本的一个单元，任何标签都可以 看成一个react元素</p><p>虚拟DOM元素 | JSX代码中的任意标签 | 通过React.createElement 创建出来的js对象<br>二. 如何区分React元素 与React组件<br>组件就是一系列React元素的组成</p><p>三. 什么是元素变量<br> 定义一个变量，变量值是一个React元素<br>const div = </p><h1>hello</h1><p></p><h2 id="state"><a href="#state" class="headerlink" title="state"></a>state</h2><p>数据绑定的两种方式<br>1.props<br>2.state 私有</p><p>一. 什么叫有状态组件， 什么叫无状态组件<br>组建有没有状态，主要看这个组件有没有state<br>一般类组件就可以称为有状态组件，函数组件叫做无状态组件</p><p>二. 组件要有变化，两种方式</p><ol><li>组件接收到的props有了变化</li><li>组件自身的state有变化<br>三. 组件的state或props有变化，组件就会更新，更新的效果其实就是类组件的render函数重新执行，函数组件重新调用了<br>PS:<ol><li>如果要让组件有state, 首先要确保这个组件是类组件。</li><li>要在 构造函数中定义 状态的初始值。</li><li>写了 构造函数的话，就必须在构造函数的第一行调用父类的构造函数 super()<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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Clock</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  <span class="comment">// 让这个组件有自身的状态数据（state），通过 构造函数</span></span><br><span class="line">  <span class="keyword">constructor</span>(props) &#123;</span><br><span class="line">    <span class="keyword">super</span>(props); <span class="comment">// 调用父类的构造函数</span></span><br><span class="line">    <span class="comment">// 通过 this.state 给组件赋初始的state值, 不能setState</span></span><br><span class="line">    <span class="keyword">this</span>.state = &#123;</span><br><span class="line">      date: <span class="keyword">new</span> <span class="built_in">Date</span>()</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></li></ol></li></ol><h2 id="React-Fragment组件，效果像vue中template"><a href="#React-Fragment组件，效果像vue中template" class="headerlink" title="React.Fragment组件，效果像vue中template"></a>React.Fragment组件，效果像vue中template</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> React, &#123;Frigment, Component&#125; <span class="keyword">from</span> <span class="string">'react'</span></span><br></pre></td></tr></table></figure><h2 id="this-绑定的四种方法"><a href="#this-绑定的四种方法" class="headerlink" title="this 绑定的四种方法"></a>this 绑定的四种方法</h2><p>父 -&gt; 子     prop<br> 子 -&gt; 父</p><ul><li><ol><li>调用子组件的时候，传递一个自己的方法下去，这个方法里面有修改自己state的功能更</li></ol></li><li><ol start="2"><li>子组件通过 this.props.propName() {/<em>是一个方法名</em>/}</li></ol></li><li><p>一、事件处理函数需要主动修改 this 指向，</p></li></ul><ol><li>为什么不能使用 apply 与 call 呢。<br>apply 与 call 会立即执行，而 bind 是<strong><em>返回一个新的函数</em></strong></li></ol><p> *2. 处理在 jsx 上面直接 bind 的方式，我们还有以下几种修改this指向的方式</p><ul><li><ol><li>jsx bind （不推荐）</li></ol></li><li><ol start="2"><li>箭头函数 （不推荐）</li></ol></li><li><ol start="3"><li>统一都在 构造函数中 去做 this 绑定 (推荐)</li></ol></li><li><ol start="4"><li>使用 实验性的 public class fields 语法 (推荐) func  = () =&gt; {}<h2 id="react-性能优化"><a href="#react-性能优化" class="headerlink" title="react 性能优化"></a>react 性能优化</h2></li></ol></li></ul><p>虽然react的defer算法可以根据虚拟dom的改变只渲染改变了的元素，但是父组件变了，子组件就会重新render，</p><p>在性能优化时能不渲染就不渲染，那么就要使用PureComponent基础组件</p><blockquote><p>遵循原则：</p><ol><li>不使用bind绑定this，因为bind返回的是新的方法</li><li>不使用箭头函数函数</li></ol><p>统一在constructor中绑定this<br>使用 实验性的 public class fields 语法 （就是方法这么定义 fn1 = () =&gt; {}）<br>!!! 不遵循该规则，机会破坏React.PureComponent的性能优化</p></blockquote><figure class="highlight js"><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;Son age=&#123;<span class="keyword">this</span>.state.age&#125; fn = &#123;<span class="keyword">this</span>.fn1.bind(<span class="keyword">this</span>)&#125;/&gt;</span><br><span class="line">&lt;Son age=&#123;<span class="keyword">this</span>.state.age&#125; fn = &#123;()=&gt;&#123;<span class="built_in">console</span>.log(<span class="number">123</span>) &#125;&#125;/&gt;</span><br></pre></td></tr></table></figure><p> React.PureCompoent 会在组件内容，比较数据是否有更新，如果有就render。如果没有就不会 render</p><blockquote><p>例如在父组件state的某个属性值变了，而子组件并没有依赖这个属性，那么要让子组件，不再次render ，那么就让子组件 class Son extends React.PureComponent {}</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;1.React 认为渲染逻辑本质上与其他 UI 逻辑内在耦合，比如，在 UI 中需要绑定处理事件、在某些时刻状态发生变化时需要通知到 UI，以及需要在 UI 中展示准备好的数据&lt;/p&gt;
&lt;p&gt;2.在 JavaScript 代码中将 JSX 和 UI 放在一起时，会在视觉上有辅助作用。它还可以使 React 显示更多有用的错误和警告消息。&lt;/p&gt;
&lt;p&gt;react  2013.5开源 （轻量级视图层库 、虚拟dom）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对与虚拟dom，简单说就是，在render时 return出来的那段jsx，是一个js对象，称之为虚拟dom，&lt;br&gt;它没有直接渲染到web页面上，react 通过diff算法对现象产生的虚拟dom和之前的比较，比较出最小的dom改变，然后去渲染web页面&lt;br&gt;vue  2015&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="React" scheme="https://zhan1025.github.io/tags/React/"/>
    
      <category term="入门" scheme="https://zhan1025.github.io/tags/%E5%85%A5%E9%97%A8/"/>
    
      <category term="核心概念" scheme="https://zhan1025.github.io/tags/%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5/"/>
    
      <category term="jsx" scheme="https://zhan1025.github.io/tags/jsx/"/>
    
  </entry>
  
  <entry>
    <title>hexo添加自定义音乐播放器</title>
    <link href="https://zhan1025.github.io/2019/06/16/hexo%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/"/>
    <id>https://zhan1025.github.io/2019/06/16/hexo添加自定义音乐播放器/</id>
    <published>2019-06-16T01:51:16.000Z</published>
    <updated>2019-06-16T03:33:48.804Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><ul><li>1.使用音乐平台自己的插件</li><li>2.结合 MetingJS 使用 APlayer</li><li>3.使用 hexo-tag-aplayer</li><li>花里胡哨，一通乱搞法</li></ul><h3 id="使用音乐平台自己的插件"><a href="#使用音乐平台自己的插件" class="headerlink" title="使用音乐平台自己的插件"></a>使用音乐平台自己的插件</h3><p>  这里就以网易云做例子，登录网易云网页版<br>    - 生成单曲的那种直接点进一首歌，可以在音乐封面下，看见生成外链的蓝色字，点击进入看提示操作<br>    <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=420400344&auto=1&height=66"></iframe></p><a id="more"></a>  <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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">iframe</span></span></span><br><span class="line"><span class="tag"><span class="attr">frameborder</span>=<span class="string">"no"</span></span></span><br><span class="line"><span class="tag"><span class="attr">border</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag"><span class="attr">marginwidth</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag"><span class="attr">marginheight</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag"><span class="attr">width</span>=<span class="string">330</span></span></span><br><span class="line"><span class="tag"><span class="attr">height</span>=<span class="string">86</span></span></span><br><span class="line"><span class="tag"><span class="attr">src</span>=<span class="string">"//music.163.com/outchain/player?type=2&amp;id=420400344&amp;auto=1&amp;height=66"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">iframe</span>&gt;</span></span><br></pre></td></tr></table></figure><ul><li><p>生成歌单：进入我的主页-&gt;点击你想生成外链歌单的歌单-&gt;在歌单播放次数边上，有外链入口</p><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="220" src="//music.163.com/outchain/player?type=0&id=2845370038&auto=1&height=430"></iframe><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">iframe</span></span></span><br><span class="line"><span class="tag"><span class="attr">frameborder</span>=<span class="string">"no"</span></span></span><br><span class="line"><span class="tag"><span class="attr">border</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag"><span class="attr">marginwidth</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag"><span class="attr">marginheight</span>=<span class="string">"0"</span></span></span><br><span class="line"><span class="tag"><span class="attr">width</span>=<span class="string">330</span></span></span><br><span class="line"><span class="tag"><span class="attr">height</span>=<span class="string">220</span></span></span><br><span class="line"><span class="tag"><span class="attr">src</span>=<span class="string">"//music.163.com/outchain/player?type=0&amp;id=2845370038&amp;auto=1&amp;height=430"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">iframe</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul><br>  > 可以在你想插入的地方插入，在mackdown中插入也是可以的,然后一些配置看官网的祥解吧  > 官方的外链，虽然很方便但缺点很明显，一些歌曲受版权保护无法生成外链，播放器样式单一不灵活<h3 id="结合-MetingJS-使用-APlayer"><a href="#结合-MetingJS-使用-APlayer" class="headerlink" title="结合 MetingJS 使用 APlayer"></a>结合 MetingJS 使用 APlayer</h3><p>  APlayer 目前广泛使用的 HTML5 音乐播放器，MetingJS 用于解析歌曲链接<br>  另外还有一个dplayer用来插入视频</p><p>  <a href="https://github.com/metowolf/MetingJS#option" target="_blank" rel="noopener">MetingJS</a><br>  <a href="https://aplayer.js.org/#/" target="_blank" rel="noopener">Aplayer</a><br><strong><em>在文章中应用</em></strong></p><blockquote><p> 新建 /layout/_widget/aplayer.ejs<br> 在文章头部，添加 aplayer: true<br> 然而不是所有的文章你都会去加音乐，所以在 /_partial/head.ejs 加上这段代码</p></blockquote><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">```ejs</span><br><span class="line">    &lt;% if (page.aplayer === true) &#123; %&gt;</span><br><span class="line">     &lt;%- partial(&apos;_widget/aplayer&apos;) %&gt;</span><br><span class="line"> &lt;% &#125; %&gt;</span><br><span class="line">```</span><br></pre></td></tr></table></figure><p>然后就是插入这个<br>    <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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span></span></span><br><span class="line"><span class="tag"> <span class="attr">class</span>=<span class="string">"aplayer"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-fixed</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-id</span>=<span class="string">"490697747"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-server</span>=<span class="string">"netease"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-type</span>=<span class="string">"playlist"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-order</span>=<span class="string">"random"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-autoplay</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-mutex</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-loop</span>=<span class="string">"all"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-list-folded</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-volume</span>=<span class="string">"0.7"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">fixed</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-listmaxheight</span>=<span class="string">"240px"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">data-theme</span>=<span class="string">"#FF4081"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--这个id就是网页中打开的音乐id，在网址后面--&gt;</span></span><br></pre></td></tr></table></figure></p><div class="aplayer" data-fixed="true" data-id="490697747" data-server="netease" data-type="playlist" data-order="random" data-autoplay="true" data-mutex="true" data-loop="all" data-list-folded="false" data-volume="0.7" fixed="true" data-listmaxheight="240px" data-theme="#FF4081"></div><blockquote><p>我是在ejs文件全局引入<br> <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></pre></td><td class="code"><pre><span class="line">&gt;         <span class="tag">&lt;<span class="name">link</span> <span class="attr">href</span>=<span class="string">"https://cdnjs.cloudflare.com/ajax/libs/aplayer/1.10.1/APlayer.min.css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span>&gt;</span></span><br><span class="line">&gt;         <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdnjs.cloudflare.com/ajax/libs/aplayer/1.10.1/APlayer.min.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">&gt;          <span class="comment">&lt;!-- Import meting.js --&gt;</span></span><br><span class="line">&gt;          <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.jsdelivr.net/npm/meting@2.0.1/dist/Meting.min.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">&gt;</span><br></pre></td></tr></table></figure></p></blockquote><blockquote><table><thead><tr><th align="center">参数</th><th align="center">是否必须</th><th align="center">默认值</th><th align="center">描述&amp;可选值</th></tr></thead><tbody><tr><td align="center">data-id</td><td align="center">是</td><td align="center"></td><td align="center">单曲ID / 歌单ID / 专辑ID / 搜索关键词</td></tr><tr><td align="center">data-server</td><td align="center">是</td><td align="center"></td><td align="center">音乐平台：<code>netease</code>,<code>tencent</code>,<code>kugou</code>,<code>xiami</code>,<code>baidu</code></td></tr><tr><td align="center">data-type</td><td align="center">是</td><td align="center"></td><td align="center">音乐类型：<code>song</code>,<code>playlist</code>,<code>album</code>,<code>search</code>,<code>artist</code></td></tr><tr><td align="center"></td><td align="center"></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">data-autoplay</td><td align="center">否</td><td align="center"><code>false</code></td><td align="center">是否自动播放，移动端浏览器不支持该选项</td></tr><tr><td align="center">data-mutex</td><td align="center">否</td><td align="center"><code>true</code></td><td align="center">播放时是否暂停其他<code>APlayer</code>对象</td></tr><tr><td align="center">data-listmaxheight</td><td align="center">否</td><td align="center"><code>340px</code></td><td align="center">播放列表最高高度</td></tr><tr><td align="center">data-preload</td><td align="center">否</td><td align="center"><code>auto</code></td><td align="center">音乐预加载模式：<code>none</code>, <code>metadata</code>, <code>auto</code></td></tr><tr><td align="center">data-theme</td><td align="center">否</td><td align="center"><code>#2980b9</code></td><td align="center">主题色</td></tr><tr><td align="center">data-mini</td><td align="center">否</td><td align="center"><code>false</code></td><td align="center">是否开启迷你模式</td></tr><tr><td align="center">data-loop</td><td align="center">否</td><td align="center"><code>all</code></td><td align="center">循环方式：<code>all</code>, <code>one</code>, <code>none</code></td></tr><tr><td align="center">data-order</td><td align="center">否</td><td align="center"><code>list</code></td><td align="center">播放顺序：<code>list</code>, <code>random</code></td></tr><tr><td align="center">data-lrc</td><td align="center">否</td><td align="center"><code>false</code></td><td align="center"></td></tr><tr><td align="center">data-list-folded</td><td align="center">否</td><td align="center"><code>false</code></td><td align="center">歌单列表初始时是否折叠</td></tr><tr><td align="center">data-volume</td><td align="center">否</td><td align="center"><code>0.7</code></td><td align="center">用户未自定义前的默认初始化音量</td></tr><tr><td align="center"><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"><span class="meta">&gt;</span><span class="bash"></span></span><br><span class="line"><span class="meta">&gt;</span><span class="bash"></span></span><br></pre></td></tr></table></figure></td><td align="center"></td><td align="center"></td><td align="center"></td></tr></tbody></table></blockquote><p>配置参照这个官方表</p><table><thead><tr><th>Name</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td>container</td><td>document.querySelector(‘.aplayer’)</td><td>player container</td></tr><tr><td>fixed</td><td>false</td><td>enable fixed mode, <a href="https://aplayer.js.org/#/home?id=fixed-mode" target="_blank" rel="noopener">see more details</a></td></tr><tr><td>mini</td><td>false</td><td>enable mini mode, <a href="https://aplayer.js.org/#/home?id=mini-mode" target="_blank" rel="noopener">see more details</a></td></tr><tr><td>autoplay</td><td>false</td><td>audio autoplay</td></tr><tr><td>theme</td><td>‘#b7daff’</td><td>main color</td></tr><tr><td>loop</td><td>‘all’</td><td>player loop play, values: ‘all’, ‘one’, ‘none’</td></tr><tr><td>order</td><td>‘list’</td><td>player play order, values: ‘list’, ‘random’</td></tr><tr><td>preload</td><td>‘auto’</td><td>values: ‘none’, ‘metadata’, ‘auto’</td></tr><tr><td>volume</td><td>0.7</td><td>default volume, notice that player will remember user setting, default volume will not work after user set volume themselves</td></tr><tr><td>audio</td><td>-</td><td>audio info, should be an object or object array</td></tr><tr><td>audio.name</td><td>-</td><td>audio name</td></tr><tr><td>audio.artist</td><td>-</td><td>audio artist</td></tr><tr><td>audio.url</td><td>-</td><td>audio url</td></tr><tr><td>audio.cover</td><td>-</td><td>audio cover</td></tr><tr><td>audio.lrc</td><td>-</td><td><a href="https://aplayer.js.org/#/home?id=lrc" target="_blank" rel="noopener">see more details</a></td></tr><tr><td>audio.theme</td><td>-</td><td>main color when switching to this audio, it has priority over the above theme</td></tr><tr><td>audio.type</td><td>‘auto’</td><td>values: ‘auto’, ‘hls’, ‘normal’ or other custom type, <a href="https://aplayer.js.org/#/home?id=mse-support" target="_blank" rel="noopener">see more details</a></td></tr><tr><td>customAudioType</td><td>-</td><td><a href="https://aplayer.js.org/#/home?id=mse-support" target="_blank" rel="noopener">see more details</a></td></tr><tr><td>mutex</td><td>true</td><td>prevent to play multiple player at the same time, pause other players when this player start play</td></tr><tr><td>lrcType</td><td>0</td><td><a href="https://aplayer.js.org/#/home?id=lrc" target="_blank" rel="noopener">see more details</a></td></tr><tr><td>listFolded</td><td>false</td><td>indicate whether list should folded at first</td></tr><tr><td>listMaxHeight</td><td>-</td><td>list max height</td></tr><tr><td>storageName</td><td>‘aplayer-setting’</td><td>localStorage key that store player setting</td></tr></tbody></table><h3 id="使用-hexo-tag-aplayer"><a href="#使用-hexo-tag-aplayer" class="headerlink" title="使用 hexo-tag-aplayer"></a>使用 hexo-tag-aplayer</h3><p>在文章中使用：<br><a href="https://github.com/MoePlayer/hexo-tag-aplayer" target="_blank" rel="noopener">hexo-tag-aplayer</a><br>    <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></pre></td><td class="code"><pre><span class="line">     npm install --save hexo-tag-aplayer</span><br><span class="line">     <span class="comment">//在站点的_config.yml中配置</span></span><br><span class="line">      aplayer:</span><br><span class="line">        meting: <span class="literal">true</span></span><br><span class="line">     <span class="comment">//使用</span></span><br><span class="line">     &#123;% aplayer title author url [picture_url, narrow, autoplay, <span class="attr">width</span>:xxx, <span class="attr">lrc</span>:xxx] %&#125;</span><br><span class="line">&#123;% meting <span class="string">"25718007"</span> <span class="string">"netease"</span> <span class="string">"song"</span> <span class="string">"theme:#FF4081"</span> <span class="string">"mode:circulation"</span> <span class="string">"mutex:true"</span> <span class="string">"listmaxheight:340px"</span> <span class="string">"preload:auto"</span> %&#125;</span><br></pre></td></tr></table></figure></p>    <div id="aplayer-FRBvgtTR" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="25718007" data-server="netease" data-type="song" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#FF4081"></div><p>[^这里说一句，meting和aplayer标签不可以同时使用]</p><p>[^更多官方配置请上官网查看]</p><h2 id="花里胡哨，一通乱搞法"><a href="#花里胡哨，一通乱搞法" class="headerlink" title="花里胡哨，一通乱搞法"></a>花里胡哨，一通乱搞法</h2><ol><li>当然，我把meting文件，aplayer文件，引入的是全局的，就是在主题的layou.ejs中引入</li><li>然后在那里加<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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span></span></span><br><span class="line"><span class="tag">     <span class="attr">class</span>=<span class="string">"aplayer"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-fixed</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-id</span>=<span class="string">"490697747"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-server</span>=<span class="string">"netease"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-type</span>=<span class="string">"playlist"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-order</span>=<span class="string">"random"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-autoplay</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-mutex</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-loop</span>=<span class="string">"all"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-list-folded</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-volume</span>=<span class="string">"0.7"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">fixed</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-listmaxheight</span>=<span class="string">"240px"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">data-theme</span>=<span class="string">"#FF4081"</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></li></ol><p>然后，你以为能出来吗，不是的！我这么胡搞，他可能听话吗，<br>3.试验后发现，只要在一篇文章中加入meting标签或者是aplayer标签就可以出现了</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;解决方案&quot;&gt;&lt;a href=&quot;#解决方案&quot; class=&quot;headerlink&quot; title=&quot;解决方案&quot;&gt;&lt;/a&gt;解决方案&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;1.使用音乐平台自己的插件&lt;/li&gt;
&lt;li&gt;2.结合 MetingJS 使用 APlayer&lt;/li&gt;
&lt;li&gt;3.使用 hexo-tag-aplayer&lt;/li&gt;
&lt;li&gt;花里胡哨，一通乱搞法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;使用音乐平台自己的插件&quot;&gt;&lt;a href=&quot;#使用音乐平台自己的插件&quot; class=&quot;headerlink&quot; title=&quot;使用音乐平台自己的插件&quot;&gt;&lt;/a&gt;使用音乐平台自己的插件&lt;/h3&gt;&lt;p&gt;  这里就以网易云做例子，登录网易云网页版&lt;br&gt;    - 生成单曲的那种直接点进一首歌，可以在音乐封面下，看见生成外链的蓝色字，点击进入看提示操作&lt;br&gt;    &lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=&quot;330&quot; height=&quot;86&quot; src=&quot;//music.163.com/outchain/player?type=2&amp;id=420400344&amp;auto=1&amp;height=66&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="音乐播放器" scheme="https://zhan1025.github.io/tags/%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/"/>
    
      <category term="diy" scheme="https://zhan1025.github.io/tags/diy/"/>
    
  </entry>
  
  <entry>
    <title>跨域解决-vue</title>
    <link href="https://zhan1025.github.io/2019/06/10/%E8%B7%A8%E5%9F%9F%E8%A7%A3%E5%86%B3-vue/"/>
    <id>https://zhan1025.github.io/2019/06/10/跨域解决-vue/</id>
    <published>2019-06-10T08:51:23.000Z</published>
    <updated>2019-06-30T14:47:34.607Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="待更新…"><a href="#待更新…" class="headerlink" title="待更新…"></a>待更新…</h2>    <div id="aplayer-usXMyOpy" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="undefined" data-server="undefined" data-type="undefined" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"></div><h3 id="devServer-proxy"><a href="#devServer-proxy" class="headerlink" title="devServer.proxy"></a>devServer.proxy</h3><ul><li><p>Type: <code>string | Object</code></p><p>如果你的前端应用和后端 API 服务器没有运行在同一个主机上，你需要在开发环境下将 API 请求代理到 API 服务器。这个问题可以通过 <code>vue.config.js</code> 中的 <code>devServer.proxy</code> 选项来配置。</p><p><code>devServer.proxy</code> 可以是一个指向开发环境 API 服务器的字符串：</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  devServer: &#123;</span><br><span class="line">    proxy: <span class="string">'http://localhost:4000'</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这会告诉开发服务器将任何未知请求 (没有匹配到静态文件的请求) 代理到<code>http://localhost:4000</code>。</p><p>如果你想要更多的代理控制行为，也可以使用一个 <code>path: options</code> 成对的对象。完整的选项可以查阅 <a href="https://github.com/chimurai/http-proxy-middleware#proxycontext-config" target="_blank" rel="noopener">http-proxy-middleware</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  devServer: &#123;</span><br><span class="line">    proxy: &#123;</span><br><span class="line">      <span class="string">'/api'</span>: &#123;</span><br><span class="line">        target: <span class="string">'&lt;url&gt;'</span>,</span><br><span class="line">        ws: <span class="literal">true</span>,</span><br><span class="line">        changeOrigin: <span class="literal">true</span></span><br><span class="line">      &#125;,</span><br><span class="line">      <span class="string">'/foo'</span>: &#123;</span><br><span class="line">        target: <span class="string">'&lt;other_url&gt;'</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></pre></td></tr></table></figure></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="vue" scheme="https://zhan1025.github.io/tags/vue/"/>
    
      <category term="跨域请求" scheme="https://zhan1025.github.io/tags/%E8%B7%A8%E5%9F%9F%E8%AF%B7%E6%B1%82/"/>
    
  </entry>
  
  <entry>
    <title>Deep&amp;Shallow cloning</title>
    <link href="https://zhan1025.github.io/2019/06/09/Deep-Shallow-cloning/"/>
    <id>https://zhan1025.github.io/2019/06/09/Deep-Shallow-cloning/</id>
    <published>2019-06-09T13:11:43.000Z</published>
    <updated>2019-06-09T13:55:11.862Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><blockquote><p>首先在js中数据类型分为两种，基础数据类型和引用数据类型<br>JavaScript原始类型:Undefined、Null、Boolean、Number、String、Symbol<br>JavaScript引用类型:Object</p></blockquote><h2 id="1-浅克隆"><a href="#1-浅克隆" class="headerlink" title="1.浅克隆"></a>1.浅克隆</h2><pre><code>浅克隆之所以叫浅克隆，是因为对象只会被克隆最外面一层，至于对象内的对象还是通过引用指向同一块内存</code></pre><h2 id="2-个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存"><a href="#2-个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存" class="headerlink" title="2.个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存"></a>2.个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存</h2><a id="more"></a><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><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//基本类型的复制，传的是值，</span></span><br><span class="line"><span class="keyword">var</span> obj=&#123;<span class="attr">a</span>:<span class="number">1</span>,<span class="attr">b</span>:<span class="number">2</span>,<span class="attr">c</span>:<span class="number">3</span>,<span class="attr">d</span>:&#123;<span class="attr">e</span>:<span class="number">5</span>&#125;&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// var obj1=obj;</span></span><br><span class="line"><span class="comment">// obj.a=2;</span></span><br><span class="line"><span class="comment">// console.log(obj==obj1);</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//浅拷贝</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// function qian(obj)&#123;</span></span><br><span class="line"><span class="comment">//      var newobj=&#123;&#125;;</span></span><br><span class="line"><span class="comment">//      for( k in obj)&#123;</span></span><br><span class="line"><span class="comment">//           newobj[k]=obj[k];</span></span><br><span class="line"><span class="comment">//      &#125;</span></span><br><span class="line"><span class="comment">//      return newobj;</span></span><br><span class="line"><span class="comment">// &#125;</span></span><br><span class="line"><span class="comment">// var obj1=qian(obj);</span></span><br><span class="line"><span class="comment">// obj1.d.e=6;</span></span><br><span class="line"><span class="comment">// console.log(obj);</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//深拷贝</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">deep</span>(<span class="params">obj</span>)</span>&#123;</span><br><span class="line">     <span class="keyword">var</span> newobj=&#123;&#125;;</span><br><span class="line">     <span class="keyword">for</span>( k <span class="keyword">in</span> obj)&#123;</span><br><span class="line">     <span class="comment">//对遍历到的元素，进行类型判断</span></span><br><span class="line">         <span class="keyword">if</span>(<span class="keyword">typeof</span> obj[k]==<span class="string">"object"</span>)&#123;</span><br><span class="line">         <span class="comment">//对object类型的原素再次遍历判断</span></span><br><span class="line">         newobj[k]=deep(obj[k]);</span><br><span class="line">         &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">         <span class="comment">//基本类型直接拷贝</span></span><br><span class="line">         newobj[k]=obj[k];</span><br><span class="line">         &#125;</span><br><span class="line">     &#125;</span><br><span class="line">     <span class="keyword">return</span> newobj;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> obj1=deep(obj);</span><br><span class="line">obj1.d.e=<span class="number">6</span>;</span><br><span class="line"><span class="built_in">console</span>.log(obj1==obj);<span class="comment">//false</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// jquery 有提供一个$.extend可以用来做 Deep Copy。</span></span><br><span class="line">        <span class="keyword">var</span> $ = <span class="built_in">require</span>(<span class="string">'jquery'</span>);</span><br><span class="line">        <span class="keyword">var</span> obj1 = &#123;</span><br><span class="line">            a: <span class="number">1</span>,</span><br><span class="line">            b: &#123; <span class="attr">f</span>: &#123; <span class="attr">g</span>: <span class="number">1</span> &#125; &#125;,</span><br><span class="line">            c: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">var</span> obj2 = $.extend(<span class="literal">true</span>, &#123;&#125;, obj1);</span><br><span class="line">        <span class="built_in">console</span>.log(obj1.b.f === obj2.b.f);</span><br><span class="line">        <span class="comment">// false</span></span><br><span class="line">        </span><br><span class="line"> <span class="comment">// 函数库lodash，有提供_.cloneDeep用来做 Deep Copy。</span></span><br><span class="line">        <span class="keyword">var</span> _ = <span class="built_in">require</span>(<span class="string">'lodash'</span>);</span><br><span class="line">        <span class="keyword">var</span> obj1 = &#123;</span><br><span class="line">            a: <span class="number">1</span>,</span><br><span class="line">            b: &#123; <span class="attr">f</span>: &#123; <span class="attr">g</span>: <span class="number">1</span> &#125; &#125;,</span><br><span class="line">            c: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">var</span> obj2 = _.cloneDeep(obj1);</span><br><span class="line">        <span class="built_in">console</span>.log(obj1.b.f === obj2.b.f);</span><br><span class="line">        <span class="comment">// false</span></span><br></pre></td></tr></table></figure><h2 id="下面的文字，鉴于掘金"><a href="#下面的文字，鉴于掘金" class="headerlink" title="下面的文字，鉴于掘金"></a>下面的文字，鉴于掘金</h2><p>当然也有传闻中的，序列/反序列（JSON对象parse方法可以将JSON字符串反序列化成JS对象，stringify方法可以将JS对象序列化成JSON字符串,这两个方法结合起来就能产生一个便捷的深克隆.）<br>要想实现一个靠谱的深克隆方法,上一节提到的序列/反序列是不可能的</p><blockquote><p>它存在这些坑<br>1.他无法实现对函数 、RegExp等特殊对象的克隆<br>2.会抛弃对象的constructor,所有的构造函数会指向Object<br>3.对象有循环引用,会报错</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 构造函数</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">person</span>(<span class="params">pname</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">this</span>.name = pname;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> Messi = <span class="keyword">new</span> person(<span class="string">'Messi'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 函数</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">say</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="built_in">console</span>.log(<span class="string">'hi'</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> oldObj = &#123;</span><br><span class="line">  a: say,</span><br><span class="line">  b: <span class="keyword">new</span> <span class="built_in">Array</span>(<span class="number">1</span>),</span><br><span class="line">  c: <span class="keyword">new</span> <span class="built_in">RegExp</span>(<span class="string">'ab+c'</span>, <span class="string">'i'</span>),</span><br><span class="line">  d: Messi</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> newObj = <span class="built_in">JSON</span>.parse(<span class="built_in">JSON</span>.stringify(oldObj));</span><br><span class="line"></span><br><span class="line"><span class="comment">// 无法复制函数</span></span><br><span class="line"><span class="built_in">console</span>.log(newObj.a, oldObj.a); <span class="comment">// undefined [Function: say]</span></span><br><span class="line"><span class="comment">// 稀疏数组复制错误</span></span><br><span class="line"><span class="built_in">console</span>.log(newObj.b[<span class="number">0</span>], oldObj.b[<span class="number">0</span>]); <span class="comment">// null undefined</span></span><br><span class="line"><span class="comment">// 无法复制正则对象</span></span><br><span class="line"><span class="built_in">console</span>.log(newObj.c, oldObj.c); <span class="comment">// &#123;&#125; /ab+c/i</span></span><br><span class="line"><span class="comment">// 构造函数指向错误</span></span><br><span class="line"><span class="built_in">console</span>.log(newObj.d.constructor, oldObj.d.constructor); <span class="comment">// [Function: Object] [Function: person]</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> oldObj = &#123;&#125;;</span><br><span class="line"></span><br><span class="line">oldObj.a = oldObj;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> newObj = <span class="built_in">JSON</span>.parse(<span class="built_in">JSON</span>.stringify(oldObj));</span><br><span class="line"><span class="built_in">console</span>.log(newObj.a, oldObj.a); <span class="comment">// TypeError: Converting circular structure to JSON</span></span><br></pre></td></tr></table></figure><blockquote><p>如果，第一段代码都无法看懂，那推荐看更高深的解读<br>掘金大佬：寻找海蓝96 <a href="https://juejin.im/post/5abb55ee6fb9a028e33b7e0a" target="_blank" rel="noopener">https://juejin.im/post/5abb55ee6fb9a028e33b7e0a</a></p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;首先在js中数据类型分为两种，基础数据类型和引用数据类型&lt;br&gt;JavaScript原始类型:Undefined、Null、Boolean、Number、String、Symbol&lt;br&gt;JavaScript引用类型:Object&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-浅克隆&quot;&gt;&lt;a href=&quot;#1-浅克隆&quot; class=&quot;headerlink&quot; title=&quot;1.浅克隆&quot;&gt;&lt;/a&gt;1.浅克隆&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;浅克隆之所以叫浅克隆，是因为对象只会被克隆最外面一层，至于对象内的对象还是通过引用指向同一块内存&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;2-个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存&quot;&gt;&lt;a href=&quot;#2-个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存&quot; class=&quot;headerlink&quot; title=&quot;2.个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存&quot;&gt;&lt;/a&gt;2.个人理解：深拷贝，为解决对象（引用类型），复制时新旧对象使用同一块内存&lt;/h2&gt;
    
    </summary>
    
    
      <category term="javascript" scheme="https://zhan1025.github.io/tags/javascript/"/>
    
      <category term="深浅克隆" scheme="https://zhan1025.github.io/tags/%E6%B7%B1%E6%B5%85%E5%85%8B%E9%9A%86/"/>
    
      <category term="深浅拷贝" scheme="https://zhan1025.github.io/tags/%E6%B7%B1%E6%B5%85%E6%8B%B7%E8%B4%9D/"/>
    
  </entry>
  
  <entry>
    <title>vuex</title>
    <link href="https://zhan1025.github.io/2019/06/05/vue%E8%BF%9B%E9%98%B6vuex/"/>
    <id>https://zhan1025.github.io/2019/06/05/vue进阶vuex/</id>
    <published>2019-06-05T12:20:01.000Z</published>
    <updated>2019-06-07T12:32:16.825Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="vuex-状态管理器"><a href="#vuex-状态管理器" class="headerlink" title="vuex ?   状态管理器"></a>vuex ?   状态管理器</h2><a id="more"></a><blockquote><p>Fulx 架构就像眼睛： 您自会知道什么时候用它</p></blockquote><ul><li>核心  store(仓库)<ul><li>state ： 状态  （类似组件中的data）</li><li>getters ：对 state的派生，可以理解为store的 <strong>*计算属性 *</strong></li><li>mutations ：修改state的<strong><em>唯一</em></strong>操作就是提交mutation</li><li>actions ： 类似于mutation  ；主要用来处理异步操作</li><li>modules ： 对仓库分割成模块</li></ul></li><li>辅助函数， 组件从仓库那东西的时候，使用辅助函数更方便<ul><li>mapState（） ： state的辅助函数</li><li>mapGetters（）：getters的辅助函数</li><li>mapMutations（） ：mutations的辅助函数</li><li>mapActions（） ：actions的辅助函数</li></ul></li></ul><h3 id="什么时候需要使用-vuex"><a href="#什么时候需要使用-vuex" class="headerlink" title="什么时候需要使用 vuex"></a>什么时候需要使用 vuex</h3><ol><li><p>当你不知道该不该用的时候，那就是不该用。（你自会知道什么时候需要用到它）</p></li><li><p>组件之间通信很复杂的情况下</p></li><li><p>项目中使用了路由，并且路由页面组件中需要通信的时候，</p></li><li><p>项目写着写着头发一大把掉的时候。 </p></li></ol><h3 id="vuex的操作流程"><a href="#vuex的操作流程" class="headerlink" title="vuex的操作流程"></a>vuex的操作流程</h3><ol><li><p>先要有仓库，将我们项目中组件上需要共享的数据放置到我们 仓库中 state 的位置。</p></li><li><p>组件要使用 仓库 中 state 的数据，就从仓库里面拿出来用。</p></li><li><p>要修改仓库中 state 的数据，</p><ol><li><p>commit(提交) mutation</p></li><li><p>dispath(派发) action    -&gt; commit mutation</p></li></ol></li><li><p>然后仓库中 state 数据发生变化，组件就会得到更新</p></li></ol><p>![流程][‘images/a.jpg’]</p><h3 id="vuex-的使用"><a href="#vuex-的使用" class="headerlink" title="vuex 的使用"></a>vuex 的使用</h3><ol><li><p>安装 vuex <code>npm install --save vuex</code></p></li><li><p>项目中 src/store/index.js 文件中创建仓库的实例对象</p></li><li><p>要 main.js new Vue 的地方配置一个 store 的选项。选项的值就是 2 中 仓库实例对象</p></li></ol><h3 id="如何将仓库中的数据拿到组件中去使用"><a href="#如何将仓库中的数据拿到组件中去使用" class="headerlink" title="如何将仓库中的数据拿到组件中去使用"></a>如何将仓库中的数据拿到组件中去使用</h3><p>this.$store 就是仓库的实例对象(就像使用了vue-router，会在vue实例上会挂载$router $route)</p><ol><li>直接使用 this.$store 的方式在组件 template 模板中使用 （不推荐）</li></ol><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">​    computed: &#123;  title () &#123; <span class="keyword">return</span> <span class="keyword">this</span>.$store.state.title &#125;  &#125;</span><br><span class="line"><span class="comment">//也可以是</span></span><br><span class="line"><span class="keyword">import</span> &#123; mapState  &#125; <span class="keyword">from</span> ‘vuex’</span><br><span class="line">computed: mapState（[<span class="string">'title'</span>]）</span><br><span class="line"><span class="comment">//</span></span><br><span class="line">computed:</span><br><span class="line">mapState (&#123;  <span class="attr">pageTitle</span>: <span class="function"><span class="params">state</span> =&gt;</span> state.title </span><br><span class="line"><span class="comment">//pageTitle (state) &#123; return satte.title&#125;</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><ol start="3"><li>借助 vuex 提供的辅助函数 mapState</li></ol><p>mapState([])  - 组件的computed 的 key 必须要跟仓库中 state 里面某个key 相同</p><p>mapState({})  - 组件的computed 的 key 可以自定义。</p><ol start="4"><li>将 mapState 与 组件自身的 computed 结合 （推荐）</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><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><br><span class="line">computed: &#123;</span><br><span class="line"></span><br><span class="line">  ...mapState([<span class="string">'title'</span>]),</span><br><span class="line"></span><br><span class="line">  firstName () &#123;</span><br><span class="line"></span><br><span class="line">​    <span class="keyword">return</span> <span class="keyword">this</span>.name.split(<span class="string">''</span>)[<span class="number">0</span>]</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><h3 id="如何修改仓库中的数据"><a href="#如何修改仓库中的数据" class="headerlink" title="如何修改仓库中的数据"></a>如何修改仓库中的数据</h3><ol><li><p>先需要在仓库中定义我们的mutation</p></li><li><p>在组件中提交这个mutaion</p><ol><li><p>this.$store.commit(‘mutaion的名字’, 要传递的参数)</p></li><li><p>this.$store.commit({</p></li></ol></li></ol><p>​     type: mutaion的名字,</p><p>​     其余的参数</p><p>   })</p><ol start="3"><li>mapMutations 辅助函数</li></ol><p><strong><em>mutation不允许异步代码的</em></strong></p><h3 id="如何写异步代码在仓库中-actions"><a href="#如何写异步代码在仓库中-actions" class="headerlink" title="如何写异步代码在仓库中 actions"></a>如何写异步代码在仓库中 actions</h3><p>Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象，因此你可以调用 <code>context.commit</code> 提交一个 mutation，或者通过 <code>context.state</code> 和 <code>context.getters</code> 来获取 state 和 getters</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"><span class="keyword">const</span> store = <span class="keyword">new</span> Vuex.Store(&#123;</span><br><span class="line">  state: &#123;</span><br><span class="line">    count: <span class="number">0</span></span><br><span class="line">  &#125;,</span><br><span class="line">  mutations: &#123;</span><br><span class="line">    increment (state) &#123;</span><br><span class="line">      state.count++</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  actions: &#123;</span><br><span class="line">    increment (context) &#123;</span><br><span class="line">      context.commit(<span class="string">'increment'</span>)</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><ol><li><p>每一个action里面都可以写异步代码，但是action并不能修改state中的数据，真正修改数据的还是 mutaction</p></li><li><p>在组件中如何派发这个action</p><ol><li><p>this.$store.dispatch(‘action的名字’)</p></li><li><p>mapActions 辅助函数</p></li></ol></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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; mapActions &#125; <span class="keyword">from</span> <span class="string">'vuex'</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">  <span class="comment">// ...</span></span><br><span class="line">  methods: &#123;</span><br><span class="line">    ...mapActions([</span><br><span class="line">      <span class="string">'increment'</span>, <span class="comment">// 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`</span></span><br><span class="line"></span><br><span class="line">      <span class="comment">// `mapActions` 也支持载荷：</span></span><br><span class="line">      <span class="string">'incrementBy'</span> <span class="comment">// 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`</span></span><br><span class="line">    ]),</span><br><span class="line">    ...mapActions(&#123;</span><br><span class="line">      add: <span class="string">'increment'</span> <span class="comment">// 将 `this.add()` 映射为 `this.$store.dispatch('increment')`</span></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>6.6</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;vuex-状态管理器&quot;&gt;&lt;a href=&quot;#vuex-状态管理器&quot; class=&quot;headerlink&quot; title=&quot;vuex ?   状态管理器&quot;&gt;&lt;/a&gt;vuex ?   状态管理器&lt;/h2&gt;
    
    </summary>
    
    
      <category term="vue" scheme="https://zhan1025.github.io/tags/vue/"/>
    
      <category term="核心" scheme="https://zhan1025.github.io/tags/%E6%A0%B8%E5%BF%83/"/>
    
      <category term="进阶" scheme="https://zhan1025.github.io/tags/%E8%BF%9B%E9%98%B6/"/>
    
  </entry>
  
  <entry>
    <title>路由懒加载与组件复用问题</title>
    <link href="https://zhan1025.github.io/2019/06/05/%E8%B7%AF%E7%94%B1%E6%87%92%E5%8A%A0%E8%BD%BD%E4%B8%8E%E7%BB%84%E4%BB%B6%E5%A4%8D%E7%94%A8%E9%97%AE%E9%A2%98/"/>
    <id>https://zhan1025.github.io/2019/06/05/路由懒加载与组件复用问题/</id>
    <published>2019-06-05T04:04:50.000Z</published>
    <updated>2019-06-23T09:34:52.624Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="组件复用问题"><a href="#组件复用问题" class="headerlink" title="组件复用问题"></a>组件复用问题</h2><a id="more"></a><h2 id="路由懒加载"><a href="#路由懒加载" class="headerlink" title="路由懒加载"></a>路由懒加载</h2><blockquote><p>在你具体去哪个路由的时候，再加载对应组件</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">    &#123;</span><br><span class="line">      path: <span class="string">'/'</span>,</span><br><span class="line">      component: <span class="function"><span class="params">()</span> =&gt;</span> <span class="keyword">import</span>(<span class="string">'../views/Index/index.vue'</span>),</span><br><span class="line">      children: [</span><br><span class="line">        &#123;</span><br><span class="line">          path: <span class="string">'home'</span>,</span><br><span class="line">          component: <span class="function"><span class="params">()</span> =&gt;</span> <span class="keyword">import</span>(<span class="string">'../views/Index/home.vue'</span>)</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">          path: <span class="string">'about'</span>,</span><br><span class="line">          component: <span class="function"><span class="params">()</span> =&gt;</span> <span class="keyword">import</span>(<span class="string">'../views/Index/about.vue'</span>)</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">          path: <span class="string">'center'</span>,</span><br><span class="line">          component: <span class="function"><span class="params">()</span> =&gt;</span> <span class="keyword">import</span>(<span class="string">'../views/Index/center.vue'</span>)</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">          path: <span class="string">''</span>,</span><br><span class="line">          redirect: <span class="string">'/home'</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></pre></td></tr></table></figure>    <div id="aplayer-ACwHxVai" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="undefined" data-server="undefined" data-type="undefined" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"></div>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;组件复用问题&quot;&gt;&lt;a href=&quot;#组件复用问题&quot; class=&quot;headerlink&quot; title=&quot;组件复用问题&quot;&gt;&lt;/a&gt;组件复用问题&lt;/h2&gt;
    
    </summary>
    
    
      <category term="vue" scheme="https://zhan1025.github.io/tags/vue/"/>
    
      <category term="核心" scheme="https://zhan1025.github.io/tags/%E6%A0%B8%E5%BF%83/"/>
    
  </entry>
  
  <entry>
    <title>vue-router</title>
    <link href="https://zhan1025.github.io/2019/06/05/vue%E8%BF%9B%E9%98%B6vue-router/"/>
    <id>https://zhan1025.github.io/2019/06/05/vue进阶vue-router/</id>
    <published>2019-06-04T16:30:32.000Z</published>
    <updated>2019-06-06T10:36:34.192Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="前端路由-vue-router"><a href="#前端路由-vue-router" class="headerlink" title="前端路由  vue-router"></a>前端路由  vue-router</h2><a id="more"></a><blockquote><p>根据不同的请求地址，能够让页面上某个组件进行切换显示</p><p>1.安装vue-router          npm i  vue-router -D<br>2.项目中选择某个位置放入一个坑，router-view这个组件<br>3.项目中配置路由规则      ，最后要暴露出去路由器的实例对象<br>4.在main.js中也就是new vue的地方需要将第三步中暴露出来的 router  实例对象配置  根组件的 router  选项</p></blockquote><!--more--><blockquote><h3 id="router-view-路由组件要显示的地方"><a href="#router-view-路由组件要显示的地方" class="headerlink" title="router-view 路由组件要显示的地方"></a>router-view 路由组件要显示的地方</h3><h3 id="router-link-这是使用了路由之后，提供给我们的一个全局组件，他就是一个-a-标签，能帮我们实现路由的切换"><a href="#router-link-这是使用了路由之后，提供给我们的一个全局组件，他就是一个-a-标签，能帮我们实现路由的切换" class="headerlink" title="router-link    这是使用了路由之后，提供给我们的一个全局组件，他就是一个  a   标签，能帮我们实现路由的切换"></a>router-link    这是使用了路由之后，提供给我们的一个全局组件，他就是一个  a   标签，能帮我们实现路由的切换</h3><blockquote><p><router-link to="/page"></router-link><br>props：-to   ke<br>        -active-class   能够让我们修改高两类的名字<br>        <router-link to="/page" active-class="abc"></router-link><br>router-link 与  a标签的区别：<br>    1. 默认情况下，a标签的链接需要写  # 而router-link不需要<br>    2. router-link 可以帮助我们实现高亮的效果<br>页面渲染后<strong>被点击</strong>的标签会带有一个class类名</p></blockquote></blockquote><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">&lt;a href=<span class="string">"#/home"</span> <span class="class"><span class="keyword">class</span></span>=<span class="string">"router-link-exact-active router-link-active"</span>&gt;点我切换显示home&lt;<span class="regexp">/a&gt;</span></span><br></pre></td></tr></table></figure><blockquote><blockquote><p>在组件中里利用router-link-active这个类，来实现高亮效果</p></blockquote></blockquote><h2 id="动态路由匹配"><a href="#动态路由匹配" class="headerlink" title="动态路由匹配"></a>动态路由匹配</h2><blockquote><p>动态路径参数以冒号开头<br>当我们使用上路由后，会在Vue的原型上挂载 两个属性</p><ul><li>$routev  当前匹配的路由对象信息</li><li>$router  路由器的实例对象</li></ul></blockquote><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 通过 ：来指定后面的id是动态路由参数</span></span><br><span class="line">    path: <span class="string">'/detail/:id'</span>,</span><br><span class="line">    component: Detail</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure><blockquote><p>当匹配到一个路由时，参数值会被设置到 this.$route.params,可以在每个组件内使用(zai template中可以省略this)<br>this.$route.query可以拿到地址后面的参数，问号后面的参数不影响路由匹配</p></blockquote><h2 id="嵌套路由"><a href="#嵌套路由" class="headerlink" title="嵌套路由"></a>嵌套路由</h2><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> routes = [</span><br><span class="line">  &#123;</span><br><span class="line">    path: <span class="string">'/home'</span>,</span><br><span class="line">    component: Home,</span><br><span class="line">    children: [<span class="comment">//通过children 来写子集</span></span><br><span class="line">      &#123;</span><br><span class="line">        path: <span class="string">'page1'</span>,</span><br><span class="line">        component: page1</span><br><span class="line">      &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        path: <span class="string">'page2'</span>,</span><br><span class="line">        component: page2</span><br><span class="line">      &#125;</span><br><span class="line">    ]</span><br><span class="line">  &#125;]</span><br><span class="line">  <span class="comment">//子集路由地址前不用加斜杠/</span></span><br></pre></td></tr></table></figure><h2 id="编程式导航"><a href="#编程式导航" class="headerlink" title="编程式导航"></a>编程式导航</h2><blockquote><p>如何用 js 代码来控制路由的跳转<br>$router.push() 跳转页面，新增一个历史记录<br>$router.back()  后退<br>$router.forward<br>$router.go()  根据参数来看是前进还是后退<br>$router.replace() 重定向，跳转页面，不加历史记录</p><p>router-link 上也可以加 replace等</p></blockquote><h2 id="命名路由"><a href="#命名路由" class="headerlink" title="命名路由"></a>命名路由</h2><p>通过一个名称来标识一个路由显得更方便一些，特别是在链接一个路由，或者是执行一些跳转的时候。你可以在创建 Router 实例的时候，在 routes 配置中给某个路由设置名称。</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="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">    &#123;</span><br><span class="line">      path: <span class="string">'/user/:userId'</span>,</span><br><span class="line">      name: <span class="string">'user'</span>,</span><br><span class="line">      component: User</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>要链接到一个命名路由，可以给 router-link 的 to 属性传一个对象：</p><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">&lt;router-link :to=<span class="string">"&#123; name: 'user', params: &#123; userId: 123 &#125;&#125;"</span>&gt;User&lt;<span class="regexp">/router-link&gt;</span></span><br></pre></td></tr></table></figure><p>这跟代码调用 router.push() 是一回事：</p><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">router.push(&#123; <span class="attr">name</span>: <span class="string">'user'</span>, <span class="attr">params</span>: &#123; <span class="attr">userId</span>: <span class="number">123</span> &#125;&#125;)</span><br></pre></td></tr></table></figure><p>这两种方式都会把路由导航到 /user/123 路径。</p><h2 id="命名视图"><a href="#命名视图" class="headerlink" title="命名视图"></a>命名视图</h2><p>有时候想同时 (同级) 展示多个视图，而不是嵌套展示，例如创建一个布局，有 sidebar (侧导航) 和 main (主内容) 两个视图，这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图，而不是只有一个单独的出口。如果 router-view 没有设置名字，那么默认为 default。</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">&lt;router-view <span class="class"><span class="keyword">class</span></span>=<span class="string">"view one"</span>&gt;<span class="xml"><span class="tag">&lt;/<span class="name">router-view</span>&gt;</span></span></span><br><span class="line">&lt;router-view class="view two" name="a"&gt;&lt;/router-view&gt;</span><br><span class="line">&lt;router-view class="view three" name="b"&gt;&lt;/router-view&gt;</span><br></pre></td></tr></table></figure><p>一个视图使用一个组件渲染，因此对于同个路由，多个视图就需要多个组件。确保正确使用 components 配置 (带上 s)：</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="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">    &#123;</span><br><span class="line">      path: <span class="string">'/'</span>,</span><br><span class="line">      components: &#123;</span><br><span class="line">        <span class="keyword">default</span>: Foo,<span class="comment">//default会将Foo组件渲染在没有命名的视图里</span></span><br><span class="line">        a: Bar,</span><br><span class="line">        b: Baz</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><h2 id="重定向与别名"><a href="#重定向与别名" class="headerlink" title="重定向与别名"></a>重定向与别名</h2><!--more--><ul><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><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"><span class="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">  &#123; <span class="attr">path</span>: <span class="string">'/page1'</span>, <span class="attr">component</span>: page1&#125;,</span><br><span class="line">    &#123; <span class="attr">path</span>: <span class="string">'*'</span>, <span class="attr">redirect</span>: <span class="string">'/home'</span> &#125;<span class="comment">//在路由规则中，地址在这条规则之前都没匹配上，那么这条规则就将地址重定向到/home页面</span></span><br><span class="line">  ]</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li><li><p>别名 alias</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></pre></td><td class="code"><pre><span class="line"> <span class="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">    &#123; <span class="attr">path</span>: <span class="string">'/a'</span>, <span class="attr">component</span>: A, <span class="attr">alias</span>: <span class="string">'/b'</span> &#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li></ul><p>“别名”的功能让你可以自由地将 UI 结构映射到任意的 URL，而不是受限于配置的嵌套路由结构。</p><h2 id="路由组件传参"><a href="#路由组件传参" class="headerlink" title="路由组件传参"></a>路由组件传参</h2><p>在组件中使用 $route 会使之与其对应路由形成高度耦合，从而使组件只能在某些特定的 URL 上使用，限制了其灵活性。</p><p>使用 props 将组件和路由解耦：</p><ul><li>布尔模式</li><li><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> User = &#123;</span><br><span class="line">  props: [<span class="string">'id'</span>],</span><br><span class="line">  template: <span class="string">'&lt;div&gt;User &#123;&#123; id &#125;&#125;&lt;/div&gt;'</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">    &#123; <span class="attr">path</span>: <span class="string">'/user/:id'</span>, <span class="attr">component</span>: User, <span class="attr">props</span>: <span class="literal">true</span> &#125;,</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 对于包含命名视图的路由，你必须分别为每个命名视图添加 `props` 选项：</span></span><br><span class="line">    &#123;</span><br><span class="line">      path: <span class="string">'/user/:id'</span>,</span><br><span class="line">      components: &#123; <span class="attr">default</span>: User, <span class="attr">sidebar</span>: Sidebar &#125;,</span><br><span class="line">      props: &#123; <span class="attr">default</span>: <span class="literal">true</span>, <span class="attr">sidebar</span>: <span class="literal">false</span> &#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></li></ul><p>就是在组件路由上配置props选项为true，这个就是布尔模式，如果 props 被设置为 true，route.params 将会被设置为组件属性，在组件中通过props：[,]来接收相应的参数，就可以在组件标签上使用该参数，不会受到url地址的约束</p><ul><li><p>对象模式</p></li><li><p>如果 props 是一个对象，它会被按原样设置为组件属性。当 props 是静态的时候有用。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">    &#123; <span class="attr">path</span>: <span class="string">'/promotion/from-newsletter'</span>, <span class="attr">component</span>: Promotion, <span class="attr">props</span>: &#123; <span class="attr">abc</span>: <span class="number">123</span> &#125; &#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;)</span><br><span class="line"><span class="comment">//</span></span><br></pre></td></tr></table></figure></li><li><p>函数模式</p></li><li><p>你可以创建一个函数返回 props。这样你便可以将参数转换成另一种类型，将静态值与基于路由的值结合等等。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> router = <span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">  routes: [</span><br><span class="line">    &#123; <span class="attr">path</span>: <span class="string">'/search'</span>, <span class="attr">component</span>: SearchUser, <span class="attr">props</span>: <span class="function">(<span class="params">route</span>) =&gt;</span> (&#123; <span class="attr">query</span>: route.query.q</span><br><span class="line">id: route.params.id&#125;) &#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li></ul><p>URL /search?q=vue 会将 {query: ‘vue’} 作为属性传递给 SearchUser 组件。</p><h2 id="HTML5-History-模式"><a href="#HTML5-History-模式" class="headerlink" title="HTML5  History 模式"></a>HTML5  History 模式</h2><p>vue路由的两种模式</p><ul><li><p>hash（默认）在url上存在#号</p></li><li><p>history</p><blockquote><p>要修改当前路由模式可以在  实例化  路由器对象的时候设置  mode 选项</p></blockquote><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"><span class="keyword">new</span> VueRouter(&#123;</span><br><span class="line">mode: <span class="string">'history'</span>,</span><br><span class="line">router</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li><li><p>这两种模式的区别</p></li></ul><p>1.从外观上说，hash模式会在url地址上面有一个#号，而history没有，<br>更像url地址</p><ol start="2"><li>从原理上来说，hash模式是通过 window.onHashChange 这个事件来处理的，<br>而history模式 是基于html5中history 新增的一些api， historty.pushState()\history.replaceState() \window.onpopstate 来实现的</li><li>history 模式需要后台的配合</li></ol><p>window.onpopstate  ：监听浏览器前进后退按钮，能触发这个事件<br>新属性使用：<img src="%5Cimages%5C1559727741.jpg" alt="代码示例"></p><h3 id="你上家公司使用的是什么模式？"><a href="#你上家公司使用的是什么模式？" class="headerlink" title="你上家公司使用的是什么模式？"></a>你上家公司使用的是什么模式？</h3><h2 id="vue导航守卫-路由拦截"><a href="#vue导航守卫-路由拦截" class="headerlink" title="vue导航守卫 ( 路由拦截  )"></a>vue导航守卫 ( 路由拦截  )</h2><p>主要分三大块</p><ul><li><p>全局</p><ul><li>全局前置  beforeEach</li><li>router.beforeEach((to,from,next) =&gt;{})</li><li>全局解析守卫 beforeResolve</li><li>全局后置守卫 beforeEach</li><li>router.beforeEach((to,from）=&gt;{})</li></ul></li><li><p>路由独享 </p><ul><li>beforeEnter        进入当前路由时</li></ul></li><li><p>组件级别的</p><ul><li>beforeRouteEnter (to, from, next) {}      进入当前组件时</li><li>beforeRouteUpdate (to, from, next) {}    进入当前组件时</li><li>beforeRouteLeave  (to, from, next) {}     退出当前组件时</li></ul></li></ul><h2 id="导航守卫的钩子函数"><a href="#导航守卫的钩子函数" class="headerlink" title="导航守卫的钩子函数"></a>导航守卫的钩子函数</h2><blockquote><p>在路由发生变化的时候会主动触发的一些函数</p></blockquote><h2 id="作用场景"><a href="#作用场景" class="headerlink" title="作用场景"></a>作用场景</h2><ol><li>beforeEach 与 afterEach 能实现页面进度条的效果</li><li>登录拦截<ol><li>先排除 组件级别</li><li>afterEach 排除</li><li>正常情况下，如果是后台管理系统的话，因为处理登录与注册页面之外其他的都需要做登录的拦截，那么就可以再 全局前置 里面去做。如果项目中只有那么一个到两个需要做拦截的页面，那么就可以再他们自己的路由独享里面去做。</li></ol></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;前端路由-vue-router&quot;&gt;&lt;a href=&quot;#前端路由-vue-router&quot; class=&quot;headerlink&quot; title=&quot;前端路由  vue-router&quot;&gt;&lt;/a&gt;前端路由  vue-router&lt;/h2&gt;
    
    </summary>
    
    
      <category term="vue" scheme="https://zhan1025.github.io/tags/vue/"/>
    
      <category term="核心" scheme="https://zhan1025.github.io/tags/%E6%A0%B8%E5%BF%83/"/>
    
      <category term="router" scheme="https://zhan1025.github.io/tags/router/"/>
    
  </entry>
  
  <entry>
    <title>vue基础3</title>
    <link href="https://zhan1025.github.io/2019/05/29/vue%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%803/"/>
    <id>https://zhan1025.github.io/2019/05/29/vue入门基础3/</id>
    <published>2019-05-29T14:29:46.000Z</published>
    <updated>2019-06-23T10:19:11.564Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h3 id="计算属性（computed）和侦听（watch）"><a href="#计算属性（computed）和侦听（watch）" class="headerlink" title="计算属性（computed）和侦听（watch）"></a>计算属性（computed）和侦听（watch）</h3><a id="more"></a><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">&lt;!-- <span class="comment">//计算属性 --&gt;</span></span><br><span class="line">&lt;div id=<span class="string">"app"</span>&gt;</span><br><span class="line">&lt;p @click=<span class="string">'deal("你好")'</span>&gt;&#123;&#123;fullName&#125;&#125;&lt;<span class="regexp">/p&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">&lt;!-- /</span><span class="regexp">/wacth侦听 --&gt;</span></span><br><span class="line"><span class="regexp">&lt;p&gt;&#123;&#123;trans&#125;&#125;&lt;/</span>p&gt;</span><br><span class="line"> &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">&lt;/</span>body&gt;</span><br><span class="line">&lt;script&gt;</span><br><span class="line">  <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'#app'</span>,</span><br><span class="line">    data:&#123;</span><br><span class="line">      msg:<span class="string">"计算属性与watch侦听的学习"</span>,</span><br><span class="line">      firstName:<span class="string">'anni'</span>,</span><br><span class="line">      lastName:<span class="string">'veter'</span>,</span><br><span class="line">      trans:<span class="string">''</span></span><br><span class="line">    &#125;,</span><br><span class="line">    methods:&#123;</span><br><span class="line">      deal(str)&#123;</span><br><span class="line">        <span class="keyword">this</span>.fullName=str;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    computed:&#123;</span><br><span class="line">      fullName:&#123;</span><br><span class="line">        <span class="keyword">get</span>()&#123;</span><br><span class="line">          <span class="keyword">return</span> <span class="keyword">this</span>.firstName+<span class="string">" "</span>+<span class="keyword">this</span>.lastName;</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="keyword">set</span>(str)&#123;</span><br><span class="line">          <span class="built_in">console</span>.log();</span><br><span class="line">          <span class="keyword">this</span>.firstName=str;</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">    watch:&#123;</span><br><span class="line">      fullName(newVal,oldVal)&#123;</span><br><span class="line">        <span class="built_in">console</span>.log(newVal);</span><br><span class="line">        <span class="built_in">console</span>.log(oldVal);</span><br><span class="line">        <span class="keyword">this</span>.trans=<span class="string">"旧数据："</span>+oldVal+<span class="string">"新数据："</span>+newVal;</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><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br></pre></td></tr></table></figure><!--more--><blockquote><p>watch执行异步请求示例，音乐搜索</p></blockquote><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></pre></td><td class="code"><pre><span class="line">&lt;div id=<span class="string">"music"</span>&gt;</span><br><span class="line">    &lt;h1&gt;音乐搜索&lt;<span class="regexp">/h1&gt;</span></span><br><span class="line"><span class="regexp">    &lt;input type="text" placeholder="请输入要搜索的音乐" v-model="searchVal" ref="input"&gt;</span></span><br><span class="line"><span class="regexp">    &lt;ul&gt;</span></span><br><span class="line"><span class="regexp">      &lt;li</span></span><br><span class="line"><span class="regexp">      v-for='item in musicList'</span></span><br><span class="line"><span class="regexp">      :key='item._id'</span></span><br><span class="line"><span class="regexp">      &gt;&#123;&#123; item.title &#125;&#125;&lt;/</span>li&gt;</span><br><span class="line">      &lt;p v-<span class="keyword">if</span>=<span class="string">"musicList.length===0"</span>&gt;未找到匹配歌曲&lt;<span class="regexp">/p&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/u</span>l&gt;</span><br><span class="line">  &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">  &lt;script src="https:/</span><span class="regexp">/cdn.bootcss.com/</span>jquery/<span class="number">3.4</span><span class="number">.1</span>/jquery.min.js<span class="string">"&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="string">&lt;script src="</span>https:<span class="comment">//cdn.jsdelivr.net/npm/vue"&gt;&lt;/script&gt;</span></span><br><span class="line">&lt;script&gt;</span><br><span class="line">  <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'#music'</span>,</span><br><span class="line">    data:&#123;</span><br><span class="line">      searchVal:<span class="string">''</span>,<span class="comment">//存放搜索的数据</span></span><br><span class="line">      musicList:[]<span class="comment">//放后台返回的数据</span></span><br><span class="line">    &#125;,</span><br><span class="line">    watch:&#123;</span><br><span class="line">      </span><br><span class="line">      searchVal:&#123;</span><br><span class="line"></span><br><span class="line">      <span class="comment">//watch可以进行异步操作（一下这么写是为了，自动自行一次异步请求，不需要自请求一次，还是按原来的写）</span></span><br><span class="line">      handler(newVal,oldVal)&#123;</span><br><span class="line">        clearTimeout(<span class="keyword">this</span>.timer);</span><br><span class="line">        <span class="comment">// console.log(this);</span></span><br><span class="line"><span class="comment">//延时是为了防抖节流</span></span><br><span class="line">        <span class="keyword">this</span>.timer = setTimeout(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">          $.<span class="keyword">get</span>('http://58.87.126.209:7001/api/v1/music',</span><br><span class="line">          &#123;title:newVal&#125;,</span><br><span class="line">          (res)=&gt;&#123;</span><br><span class="line">            <span class="built_in">console</span>.log(res);</span><br><span class="line">            <span class="keyword">if</span>(res.code === <span class="number">0</span>)&#123;</span><br><span class="line">              <span class="keyword">this</span>.musicList=res.data.list;</span><br><span class="line">              <span class="comment">// this.$refs.input.focus();</span></span><br><span class="line">            &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">              alert(<span class="string">'网络异常'</span>);</span><br><span class="line">            &#125;</span><br><span class="line">          &#125;)</span><br><span class="line">        &#125;,<span class="number">300</span>)</span><br><span class="line">      &#125;,</span><br><span class="line">        immediate:<span class="literal">true</span><span class="comment">//通过这个属性，以当前值，执行回调和函数</span></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><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>总结一下：computed和watch的区别：</p><p>1.computed根据现有数据，计算出新的结果</p><p>2.watch没有返回值，watch可以进行异步操作，computed不能！！！</p><p>3.watch可以侦听现有的data和computed的数据改变，进而执行相应的函数</p></blockquote><h3 id="mixin混入"><a href="#mixin混入" class="headerlink" title="mixin混入"></a>mixin混入</h3><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//通过定义一个对象来存储mixin的选项（除了el，propsData）</span></span><br><span class="line"><span class="keyword">var</span> common=&#123;</span><br><span class="line">    data()&#123;</span><br><span class="line">      <span class="keyword">return</span> &#123;<span class="attr">msg</span>:<span class="string">'你好'</span>&#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    methods:&#123;</span><br><span class="line">      fn1()&#123;</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="string">'common fn1'</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    mounted()&#123;</span><br><span class="line">      <span class="built_in">console</span>.log(<span class="string">'生命周期函数'</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">var</span> vm1 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'#app'</span>,</span><br><span class="line">    mixins:[common],<span class="comment">//混入</span></span><br><span class="line">    methods:&#123;</span><br><span class="line">      fn1()&#123;</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="string">'你好'</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    data:&#123;</span><br><span class="line">      msg:<span class="string">'11111'</span>,</span><br><span class="line">      text:<span class="string">'123'</span></span><br><span class="line">    &#125;,</span><br><span class="line">    mounted()&#123;</span><br><span class="line">      <span class="built_in">console</span>.log(<span class="string">'生命'</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;)</span><br><span class="line">  <span class="keyword">var</span> vm2 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'#app1'</span>,</span><br><span class="line">    mixins:[common]<span class="comment">//通过mixins挂载到vue实例身上</span></span><br><span class="line">  &#125;)</span><br></pre></td></tr></table></figure><blockquote><p>总结一下：<br>1.方法以自身的为主<br>2.data与自身data相同的，以自身为主<br>3.生命周期函数，会先执混入的，在执行自身的</p><p>4.除了 el 与 propsData 这两个选项之外其他的选项都可以，混入。<br>5.data如果是一个混入对象的选项，那么data需要使用工厂模式<br>弄成一个方法，方法里面返回对象</p></blockquote><!--more--><h3 id="组件、vue实例的template"><a href="#组件、vue实例的template" class="headerlink" title="组件、vue实例的template"></a>组件、vue实例的template</h3><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span> @<span class="attr">click</span>=<span class="string">'fn1'</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">world</span>/&gt;</span></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">div</span> <span class="attr">id</span>=<span class="string">'app2'</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">world</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><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></pre></td><td class="code"><pre><span class="line">Vue.component(<span class="string">'world'</span>,&#123;</span><br><span class="line">      <span class="comment">// 这里写法跟 mixin 很像，都是能够使用 new Vue 时传递的哪些选项。</span></span><br><span class="line">      <span class="comment">// 1. el 与 propsData 不能用</span></span><br><span class="line">      <span class="comment">// 2. data 必须是一个函数返回对象的形式。</span></span><br><span class="line">      <span class="comment">// 3. 组件必须要有一个选项是，template 选项，这个选项指定我们组件的内容。(标签可以使用自闭和)</span></span><br><span class="line">      <span class="comment">//4.当全局组件和局部组件同名时，以局部组件为主</span></span><br><span class="line">      template:<span class="string">`&lt;div&gt;你好&lt;/div&gt;`</span>,</span><br><span class="line">      mounted()&#123;</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="number">1</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="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'#app'</span>,</span><br><span class="line">    data:&#123;</span><br><span class="line">      msg:<span class="string">'123'</span></span><br><span class="line">    &#125;,</span><br><span class="line">    components:&#123;<span class="comment">//局部注册，通过components:</span></span><br><span class="line">      <span class="string">'world'</span>:&#123;<span class="comment">//组件名：&#123;组件选项对象&#125;</span></span><br><span class="line">        data()&#123;</span><br><span class="line">          <span class="keyword">return</span> &#123;<span class="attr">msg</span>:<span class="string">'world'</span>&#125;</span><br><span class="line">        &#125;,</span><br><span class="line">      template: <span class="string">`</span></span><br><span class="line"><span class="string">        &lt;div&gt;</span></span><br><span class="line"><span class="string">          &lt;h1 @click='fn1'&gt;我是 &#123;&#123;msg&#125;&#125; 组件&lt;/h1&gt;</span></span><br><span class="line"><span class="string">        &lt;/div&gt;</span></span><br><span class="line"><span class="string">      `</span>,</span><br><span class="line">      methods:&#123;</span><br><span class="line">        fn1()&#123;</span><br><span class="line">          <span class="built_in">console</span>.log(<span class="number">123</span>);</span><br><span class="line">      &#125;&#125;</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    &#125;,</span><br><span class="line">    methods:&#123;</span><br><span class="line">      fn1()&#123;</span><br><span class="line">        <span class="built_in">console</span>.log(<span class="number">121</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><br><span class="line">    <span class="comment">// vue 实例也可以设置 template 选项，当有tempalte选项的时候，挂载点会整个被tempalte模板内容给替换。</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'#app2'</span>,</span><br><span class="line">    template:<span class="string">`</span></span><br><span class="line"><span class="string">    &lt;input&gt;`</span></span><br><span class="line">  &#125;)</span><br></pre></td></tr></table></figure><blockquote><p>组件组件本质上是一个拥有预定义选项的一个 Vue 实例</p></blockquote><h3 id="组件template的优化写法"><a href="#组件template的优化写法" class="headerlink" title="组件template的优化写法"></a>组件template的优化写法</h3><blockquote><ol><li>直接使用 模板字符串的方式</li><li>使用单文件组件   （推荐）</li><li>使用 script 标签的方式(这里暂时用这种)</li></ol></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">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">hi</span>/&gt;</span><span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;msg&#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">div</span>&gt;</span></span><br></pre></td></tr></table></figure><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">&lt;script id=<span class="string">'h'</span> type=<span class="string">"text/x-template"</span>&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;p&gt;我是一个组件，使用script标签写法实现的组件&lt;<span class="regexp">/p&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">  &lt;/</span>div&gt;</span><br><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"> &lt;script&gt;</span></span><br><span class="line"><span class="regexp">   Vue.component('hi',&#123;</span></span><br><span class="line"><span class="regexp">     template:"#h"</span></span><br><span class="line"><span class="regexp">   &#125;)</span></span><br><span class="line"><span class="regexp">   new Vue(&#123;</span></span><br><span class="line"><span class="regexp">     el:'#app',</span></span><br><span class="line"><span class="regexp">     data:&#123;</span></span><br><span class="line"><span class="regexp">      msg:'123456'</span></span><br><span class="line"><span class="regexp">     &#125;</span></span><br><span class="line"><span class="regexp">   &#125;)</span></span><br><span class="line"><span class="regexp"> &lt;/</span>script&gt;</span><br></pre></td></tr></table></figure><h3 id="组件通信"><a href="#组件通信" class="headerlink" title="组件通信"></a>组件通信</h3><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">father</span>/&gt;</span></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> <span class="attr">src</span>=<span class="string">"./lib/vue.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">  <span class="comment">&lt;!-- 父组件 --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span> <span class="attr">id</span>=<span class="string">"father"</span> <span class="attr">type</span>=<span class="string">"text/x-template"</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="handlebars"><span class="xml">    <span class="tag">&lt;<span class="name">div</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="tag">&lt;<span class="name">h1</span>&gt;</span>我是父组件<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="tag">&lt;<span class="name">son</span> <span class="attr">:name</span>=<span class="string">'sonName'</span> <span class="attr">:sex</span>=<span class="string">'sonSex'</span> @<span class="attr">msg</span>=<span class="string">'fn'</span>/&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span></span><br><span class="line"><span class="undefined">  </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">  <span class="comment">&lt;!-- 子组件 --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span> <span class="attr">id</span>=<span class="string">"child"</span> <span class="attr">type</span>=<span class="string">"text/x-template"</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="handlebars"><span class="xml">    <span class="tag">&lt;<span class="name">div</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="tag">&lt;<span class="name">h2</span>&gt;</span>我是子组件，受父组件调控<span class="tag">&lt;/<span class="name">h2</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="tag">&lt;<span class="name">p</span>&gt;</span>我叫：</span><span class="template-variable">&#123;&#123;name&#125;&#125;</span><span class="xml"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="tag">&lt;<span class="name">p</span>&gt;</span>性别：</span><span class="template-variable">&#123;&#123;sex&#125;&#125;</span><span class="xml"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="tag">&lt;<span class="name">button</span> @<span class="attr">click</span>=<span class="string">'tran("event")'</span>&gt;</span>18岁了，我想改名<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="comment">&lt;!-- 这里是直接改的props里的值，相当于改data中的数据，但是这里会报错 --&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">      <span class="tag">&lt;<span class="name">button</span> @<span class="attr">click</span>=<span class="string">'tran2(&#123;name:"李立其",sex:"女"&#125;)'</span>&gt;</span>25岁，我想改变一下，我和父亲说<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span></span><br><span class="line"><span class="handlebars"><span class="xml">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span></span><br><span class="line"><span class="undefined">  </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure>  <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></pre></td><td class="code"><pre><span class="line">  &lt;script&gt;</span><br><span class="line"><span class="comment">// 父组件</span></span><br><span class="line">Vue.component(<span class="string">'father'</span>,&#123;</span><br><span class="line">  template:<span class="string">'#father'</span>,</span><br><span class="line">  data()&#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      sonName:<span class="string">'李四'</span>,</span><br><span class="line">      sonSex:<span class="string">'男'</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  methods:&#123;</span><br><span class="line">    <span class="comment">// 与子通信方法</span></span><br><span class="line">    <span class="comment">//接收子传递的信息</span></span><br><span class="line">    fn(payload)&#123;</span><br><span class="line">      <span class="keyword">this</span>.sonName=payload.name;</span><br><span class="line">      <span class="keyword">this</span>.sonSex=payload.sex;</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="comment">//子组件</span></span><br><span class="line">Vue.component(<span class="string">'son'</span>,&#123;</span><br><span class="line">  template:<span class="string">'#child'</span>,</span><br><span class="line">  props:[<span class="string">'name'</span>,<span class="string">'sex'</span>],</span><br><span class="line">  methods:&#123;</span><br><span class="line">    tran(str)&#123;</span><br><span class="line">      <span class="built_in">console</span>.log(<span class="keyword">this</span>.name);</span><br><span class="line">      <span class="keyword">this</span>.name=<span class="string">'李云海'</span>;</span><br><span class="line">    &#125;,</span><br><span class="line">    tran2(obj)&#123;</span><br><span class="line">      <span class="comment">// 子于父通信，触发父给的自定义事件msg，this.$emit('事件名'，参数)</span></span><br><span class="line">      <span class="keyword">this</span>.$emit(<span class="string">'msg'</span>,obj);</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">new</span> Vue(&#123;</span><br><span class="line">      el:<span class="string">'#app'</span></span><br><span class="line"></span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="comment">// 子要与父通信，通过，父给设的自定义事件this.$emit()触发自定义方法</span></span><br><span class="line">  &lt;<span class="regexp">/script&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;计算属性（computed）和侦听（watch）&quot;&gt;&lt;a href=&quot;#计算属性（computed）和侦听（watch）&quot; class=&quot;headerlink&quot; title=&quot;计算属性（computed）和侦听（watch）&quot;&gt;&lt;/a&gt;计算属性（computed）和侦听（watch）&lt;/h3&gt;
    
    </summary>
    
    
      <category term="vue" scheme="https://zhan1025.github.io/tags/vue/"/>
    
      <category term="基础" scheme="https://zhan1025.github.io/tags/%E5%9F%BA%E7%A1%80/"/>
    
  </entry>
  
  <entry>
    <title>vue入门基础1，助解原码</title>
    <link href="https://zhan1025.github.io/2019/05/28/vue%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%801%EF%BC%8C%E5%8A%A9%E8%A7%A3%E5%8E%9F%E7%A0%81/"/>
    <id>https://zhan1025.github.io/2019/05/28/vue入门基础1，助解原码/</id>
    <published>2019-05-28T13:27:41.000Z</published>
    <updated>2019-05-28T13:41:12.250Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><blockquote><p>从html开始看–&gt;js</p></blockquote><a id="more"></a><figure class="highlight css"><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><br><span class="line"><span class="selector-tag">li</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">200px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">border-bottom</span>: <span class="number">1px</span> solid <span class="number">#333</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* .item--color&#123;</span></span><br><span class="line"><span class="comment">    background:green;</span></span><br><span class="line"><span class="comment">&#125; */</span></span><br><span class="line"><span class="selector-class">.tab</span>&#123;</span><br><span class="line">    <span class="attribute">color</span>: red;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.list--item</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">50px</span>;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> auto;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.p--color</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>: orange;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"list"</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">class</span>=<span class="string">"item"</span> </span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">            <span class="attr">:class</span>=<span class="string">"&#123; 'item--color' : curItem === index&#125;"</span></span></span><br><span class="line"><span class="tag">            </span></span><br><span class="line"><span class="tag">            <span class="attr">v-for</span>=<span class="string">"(item,index) in 5"</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">            @<span class="attr">click</span>=<span class="string">"color(index)"</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">            <span class="attr">:key</span>=<span class="string">'item'</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">            <span class="attr">:style</span>=<span class="string">"styleObj"</span></span></span><br><span class="line"><span class="tag">            &gt;</span>&#123;&#123; item &#125;&#125;<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">hr</span>&gt;</span></span><br><span class="line">//首页列表也跳转</span><br><span class="line">        <span class="tag">&lt;<span class="name">button</span></span></span><br><span class="line"><span class="tag">        <span class="attr">:class</span>=<span class="string">"&#123;'tab': curTab ===item.id&#125;"</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">        <span class="attr">v-for</span>=<span class="string">"item in tabs"</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">        <span class="attr">:key</span>=<span class="string">'item.id'</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">        @<span class="attr">click</span>=<span class="string">"turn(item.id)"</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">        &gt;</span>&#123;&#123;item.name&#125;&#125;<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-if</span>=<span class="string">" curTab === 'home' "</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">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-if</span>=<span class="string">"curTab === 'list'"</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">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">hr</span>&gt;</span></span><br><span class="line">//enter变色</span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"list--item"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">p</span></span></span><br><span class="line"><span class="tag">            <span class="attr">:class</span>=<span class="string">"&#123;'p--color':curItem === p.id&#125;"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">v-for</span>=<span class="string">"p in listItem"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">:key</span>=<span class="string">"p.id"</span></span></span><br><span class="line"><span class="tag">            @<span class="attr">mouseenter</span>=<span class="string">"over(p.id)"</span></span></span><br><span class="line"><span class="tag">            &gt;</span>&#123;&#123;p.name&#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">div</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><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></pre></td><td class="code"><pre><span class="line">&lt;script src=<span class="string">"https://cdn.jsdelivr.net/npm/vue"</span>&gt;<span class="xml"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span><br><span class="line">&lt;script&gt;</span><br><span class="line">    <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">        el:<span class="string">'#list'</span>,</span><br><span class="line">        data:&#123;</span><br><span class="line">            curItem:<span class="number">0</span>,</span><br><span class="line">            styleObj:&#123;</span><br><span class="line">                color:<span class="string">'red'</span>,</span><br><span class="line">                background: <span class="string">'rgba(120,150,255)'</span>,</span><br><span class="line">                fontSize:<span class="string">"20px"</span></span><br><span class="line">            &#125;,</span><br><span class="line">            style:&#123;</span><br><span class="line">                background:<span class="string">'origin'</span></span><br><span class="line">            &#125;,</span><br><span class="line">            curTab:<span class="string">"home"</span>,</span><br><span class="line">            tabs:[</span><br><span class="line">                &#123;<span class="attr">id</span>:<span class="string">'home'</span>,<span class="attr">name</span>:<span class="string">'首页'</span>&#125;,</span><br><span class="line">                &#123;<span class="attr">id</span>:<span class="string">'list'</span>,<span class="attr">name</span>:<span class="string">'列表页'</span>&#125;</span><br><span class="line">            ],</span><br><span class="line">            listItem:[</span><br><span class="line">                &#123;<span class="attr">id</span>:<span class="number">1</span>,<span class="attr">name</span>:<span class="string">'李蕾'</span>&#125;,</span><br><span class="line">                &#123;<span class="attr">id</span>:<span class="number">2</span>,<span class="attr">name</span>:<span class="string">'李明'</span>&#125;,</span><br><span class="line">                &#123;<span class="attr">id</span>:<span class="number">3</span>,<span class="attr">name</span>:<span class="string">'李良'</span>&#125;,</span><br><span class="line">                &#123;<span class="attr">id</span>:<span class="number">4</span>,<span class="attr">name</span>:<span class="string">'李华'</span>&#125;</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">        methods:&#123;</span><br><span class="line">            color(index)&#123;</span><br><span class="line">                <span class="keyword">this</span>.curItem=index;</span><br><span class="line">            &#125;,</span><br><span class="line">            turn(id)&#123;</span><br><span class="line">                <span class="keyword">this</span>.curTab=id;</span><br><span class="line">            &#125;,</span><br><span class="line">            over(index)&#123;</span><br><span class="line">                <span class="keyword">this</span>.curItem=index;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;从html开始看–&amp;gt;js&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>vue入门基础2</title>
    <link href="https://zhan1025.github.io/2019/05/28/vue%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%802/"/>
    <id>https://zhan1025.github.io/2019/05/28/vue入门基础2/</id>
    <published>2019-05-28T02:57:14.000Z</published>
    <updated>2019-05-30T04:57:03.883Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="条件渲染分组，v-if和v-for一起使用"><a href="#条件渲染分组，v-if和v-for一起使用" class="headerlink" title="条件渲染分组，v-if和v-for一起使用"></a>条件渲染分组，v-if和v-for一起使用</h2><blockquote><p>对上一篇中v-if系列的一个补充拓展<br>1.分组渲染</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><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"><span class="tag">&lt;<span class="name">template</span> <span class="attr">v-if</span>=<span class="string">"ok"</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--最后的渲染效果不会渲染temlate标签，该标签方便我们进行分组渲染，而不会然css样式出现无效--&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>Title<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span>&gt;</span>Paragraph 1<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>Paragraph 2<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><a id="more"></a><p>2.v-if 和 v-for 的混合使用</p><blockquote><p>当 v-if 与 v-for 一起使用时，v-for 具有比 v-if 更高的优先;在大型数据遍历判断时，会造成性能的浪费，现阶段建议使用如下方法</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><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"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"test"</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="comment">&lt;!-- 将有手机的学生信息列出，在v-for='item in msg' v-if='havephone'会造成性能的浪费--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">"item in msg.filter((value,index)=&gt;&#123;value.havephoe&#125;)"</span> <span class="attr">key</span>=<span class="string">"item.id"</span>&gt;</span>&#123;&#123;item.name&#125;&#125;<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">div</span>&gt;</span></span><br></pre></td></tr></table></figure><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="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'.test'</span>,</span><br><span class="line">    data:&#123;</span><br><span class="line">        msg:[</span><br><span class="line">            &#123;<span class="attr">id</span>:<span class="number">1</span>,<span class="attr">name</span>:<span class="string">'lisi'</span>,<span class="attr">age</span>:<span class="number">15</span>,<span class="attr">havephoe</span>:<span class="literal">false</span>&#125;</span><br><span class="line">            &#123;<span class="attr">id</span>:<span class="number">2</span>,<span class="attr">name</span>:<span class="string">'lii'</span>,<span class="attr">age</span>:<span class="number">12</span>,<span class="attr">havephoe</span>:<span class="literal">false</span>&#125;</span><br><span class="line">            &#123;<span class="attr">id</span>:<span class="number">3</span>,<span class="attr">name</span>:<span class="string">'lsi'</span>,<span class="attr">age</span>:<span class="number">12</span>,<span class="attr">havephoe</span>:<span class="literal">true</span>&#125;</span><br><span class="line">            &#123;<span class="attr">id</span>:<span class="number">4</span>,<span class="attr">name</span>:<span class="string">'li'</span>,<span class="attr">age</span>:<span class="number">5</span>,<span class="attr">havephoe</span>:<span class="literal">false</span>&#125;</span><br><span class="line">            &#123;<span class="attr">id</span>:<span class="number">5</span>,<span class="attr">name</span>:<span class="string">'lis'</span>,<span class="attr">age</span>:<span class="number">13</span>,<span class="attr">havephoe</span>:<span class="literal">false</span>&#125;</span><br><span class="line">            &#123;<span class="attr">id</span>:<span class="number">6</span>,<span class="attr">name</span>:<span class="string">'lise'</span>,<span class="attr">age</span>:<span class="number">14</span>,<span class="attr">havephoe</span>:ture&#125;</span><br><span class="line">        ]</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h2 id="事件处理"><a href="#事件处理" class="headerlink" title="事件处理"></a>事件处理</h2><blockquote><p>就是对v-on监听dom事件<br>事件的修饰符</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><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">&lt;!-- 阻止单击事件继续传播(冒泡) --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-on:click.stop</span>=<span class="string">"doThis"</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&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">form</span> <span class="attr">v-on:submit.prevent</span>=<span class="string">"onSubmit"</span>&gt;</span><span class="tag">&lt;/<span class="name">form</span>&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">a</span> <span class="attr">v-on:click.stop.prevent</span>=<span class="string">"doThat"</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&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">form</span> <span class="attr">v-on:submit.prevent</span>&gt;</span><span class="tag">&lt;/<span class="name">form</span>&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="comment">&lt;!-- 即元素自身触发的事件先在此处理，然后才交由内部元素进行处理 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-on:click.capture</span>=<span class="string">"doThis"</span>&gt;</span>...<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 只当在 event.target 是当前元素自身时触发处理函数 --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 即事件不是从内部元素触发的 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-on:click.self</span>=<span class="string">"doThat"</span>&gt;</span>...<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 点击事件将只会触发一次 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-on:click.once</span>=<span class="string">"doThis"</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>按键修饰符</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><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">v-on:keyup.enter</span>=<span class="string">"submit"</span> &gt;</span></span><br><span class="line"><span class="comment">&lt;!-- pagedown --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">v-on:keyup.page-down</span>=<span class="string">"onPageDown"</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><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"> <span class="comment">// 可以使用 `v-on:keyup.f1`</span></span><br><span class="line">Vue.config.keyCodes.f1 = <span class="number">112</span></span><br></pre></td></tr></table></figure><blockquote><p>更多修饰符见官网（<a href="https://cn.vuejs.org/v2/guide/events.html#%E4%BA%8B%E4%BB%B6%E4%BF%AE%E9%A5%B0%E7%AC%A6）" target="_blank" rel="noopener">https://cn.vuejs.org/v2/guide/events.html#%E4%BA%8B%E4%BB%B6%E4%BF%AE%E9%A5%B0%E7%AC%A6）</a></p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;条件渲染分组，v-if和v-for一起使用&quot;&gt;&lt;a href=&quot;#条件渲染分组，v-if和v-for一起使用&quot; class=&quot;headerlink&quot; title=&quot;条件渲染分组，v-if和v-for一起使用&quot;&gt;&lt;/a&gt;条件渲染分组，v-if和v-for一起使用&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;对上一篇中v-if系列的一个补充拓展&lt;br&gt;1.分组渲染&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;highlight html&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;name&quot;&gt;template&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;v-if&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&quot;ok&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;&amp;lt;!--最后的渲染效果不会渲染temlate标签，该标签方便我们进行分组渲染，而不会然css样式出现无效--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;name&quot;&gt;h1&lt;/span&gt;&amp;gt;&lt;/span&gt;Title&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;name&quot;&gt;h1&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;name&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;Paragraph 1&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;name&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;name&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;Paragraph 2&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;name&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;name&quot;&gt;template&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
    
      <category term="vue" scheme="https://zhan1025.github.io/tags/vue/"/>
    
      <category term="基础" scheme="https://zhan1025.github.io/tags/%E5%9F%BA%E7%A1%80/"/>
    
  </entry>
  
  <entry>
    <title>vue入门基础1</title>
    <link href="https://zhan1025.github.io/2019/05/27/vue%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%801/"/>
    <id>https://zhan1025.github.io/2019/05/27/vue入门基础1/</id>
    <published>2019-05-27T06:51:29.000Z</published>
    <updated>2019-06-04T16:37:58.015Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><blockquote><p>vue使用是MVVM模式</p></blockquote><h3 id="基本指令-（前提是已安装vue或以将vue-js文件引入，详细操作见官方文档-https-cn-vuejs-org-v2-guide-E8-B5-B7-E6-AD-A5-）"><a href="#基本指令-（前提是已安装vue或以将vue-js文件引入，详细操作见官方文档-https-cn-vuejs-org-v2-guide-E8-B5-B7-E6-AD-A5-）" class="headerlink" title="基本指令 （前提是已安装vue或以将vue.js文件引入，详细操作见官方文档:(https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5)）"></a>基本指令 （前提是已安装vue或以将vue.js文件引入，详细操作见官方文档:(<a href="https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5)）" target="_blank" rel="noopener">https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5)）</a></h3><ul><li>插值(在文本域插值只能用v-model)<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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- （可先跳过这段文字）这里只是给vue提供的挂载点，也就是vue.js将会通过el: '.app' （如果是id，就是el :'#类名'） --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span> &#123;&#123;message&#125;&#125;&#123;&#123;tip&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- 通过双花括号将数据带入，也可以带入一个单表达式 （这是一种模板语法）--&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></li></ul><a id="more"></a><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><br><span class="line"><span class="keyword">var</span> app = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    el : <span class="string">'.app'</span>,<span class="comment">//vue只会操作或管理该节点内的节点（el===element）</span></span><br><span class="line">    data :&#123;<span class="comment">//需要渲染的数据</span></span><br><span class="line">        message : <span class="string">'hello vue'</span>,</span><br><span class="line">        tip: <span class="string">'名字随便写'</span></span><br><span class="line">    &#125;,</span><br><span class="line"></span><br><span class="line">    <span class="comment">// method: &#123;&#125;,</span></span><br><span class="line">    <span class="comment">// computed:&#123;&#125;</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">//可以通过app.$mount('.app')添加挂载</span></span><br></pre></td></tr></table></figure><blockquote><p><strong><em>下面的演示会解释的简单些，请理解以上插值的过程，再阅读一下文字</em></strong></p></blockquote><!--more--><ul><li><p>v-if &amp; v-else &amp; v-else-if &amp; v-show</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">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-if</span>=<span class="string">'height&gt;200'</span>&gt;</span>&#123;&#123;message&#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> <span class="attr">v-else</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">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>v-if和v-else要相邻使用，如果中间有其他原素是达不到想要的效果的</p></blockquote><pre><code><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></pre></td><td class="code"><pre><span class="line">&lt;script&gt;</span><br><span class="line">    <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">        el:<span class="string">'#app'</span>,</span><br><span class="line">        data:&#123;</span><br><span class="line">            message:<span class="string">'hello'</span>,</span><br><span class="line">            height:<span class="number">155</span></span><br><span class="line">        &#125;</span><br><span class="line">    </span><br><span class="line">    &#125;)</span><br><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br></pre></td></tr></table></figure></code></pre><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">    &lt;div id=<span class="string">"app"</span>&gt;</span><br><span class="line">        &lt;p v-<span class="keyword">if</span>=<span class="string">'height&gt;100'</span>&gt;&#123;&#123;message&#125;&#125;&lt;<span class="regexp">/p&gt;</span></span><br><span class="line"><span class="regexp">        &lt;p v-else-if='height&gt;160'&gt;你好&lt;/</span>p&gt;</span><br><span class="line">        &lt;p v-<span class="keyword">else</span>&gt;简单理解一下&lt;<span class="regexp">/p&gt;</span></span><br><span class="line"><span class="regexp">        &lt;p v-show='height&gt;=155'&gt;在控制台查看通过v-if被隐藏的标签和v-show的区别&lt;/</span>p&gt;</span><br><span class="line">        &lt;p v-show=<span class="string">'height&lt;155'</span>&gt;隐藏&lt;<span class="regexp">/p&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>div&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment">//js代码</span></span><br><span class="line">    <span class="keyword">var</span> app= <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">            data: &#123;</span><br><span class="line">                message: <span class="string">'hello'</span>,</span><br><span class="line">                height: <span class="number">155</span></span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        &#125;)</span><br><span class="line">        app.$mount(<span class="string">'#app'</span>);<span class="comment">//通过vm.$mount('类名'),可以给vue添加挂载</span></span><br></pre></td></tr></table></figure></li></ul><p>v-if 与 v-show 的区别<br>v-if判断结果为false会让原素变为html注释，而v-show则是给原素添加display属性<br>      1. 他们都能实现元素的显示隐藏<br>      2. v-show只是简单控制元素的display属性（不管条件为真还是为假，这个元素都会被渲染出来），而v-if才是条件渲染（条件为真，元素将会被渲染，条件为假，元素会被销毁）<br>      3. v-show有更高的首次渲染开销。v-if的首次渲染开销要小得多。<br>      4. v-if有更高的切换开销，v-show切换开销小<br>      5. v-if有配套的 v-else-if 和 v-else，而v-show没有</p><blockquote><p>v-once数据渲染一次，数据改变时，加了v-once的原素数据，保持第一次渲染的数据</p></blockquote><ul><li><p>v-text；v-html向html页面输出html元素(不推荐使用该方法，会带来xss攻击隐患)</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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;button&#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> <span class="attr">v-html</span>=<span class="string">'button'</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">p</span> <span class="attr">v-text</span>=<span class="string">'msg'</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">div</span>&gt;</span></span><br></pre></td></tr></table></figure>  <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="keyword">new</span> Vue(&#123;</span><br><span class="line">    el:<span class="string">'#app'</span>,</span><br><span class="line">    data:&#123;</span><br><span class="line">        msg: <span class="string">'v-text注入信息，会将原标签内的数据给覆盖显示，使用了v-text/v-html，再在标签内写直接书写数据是不显示的'</span></span><br><span class="line">        button:<span class="string">'&lt;button&gt;按钮&lt;/button&gt;'</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li><li><p>v-bind属性、样式、类的绑定…,v-on绑定事件</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">v-bind简写 ‘：’</span><br><span class="line">v-on简写‘@’</span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">v-bind:title</span>=<span class="string">'msg'</span>&gt;</span>&#123;&#123;msg&#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> <span class="attr">v-bind:style</span>=<span class="string">"&#123; color: activeColor&#125;"</span>&gt;</span>121212<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> <span class="attr">:class</span>=<span class="string">"&#123; box1 : isOk &#125;"</span>&gt;</span>11111<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> <span class="attr">v-bind:</span>[<span class="attr">attrname</span>]=<span class="string">'msg'</span>&gt;</span><span class="tag">&lt;<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 动态属性绑定 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">:class</span>=<span class="string">'active'</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">div</span> @<span class="attr">click</span>=<span class="string">'reverse()'</span>&gt;</span>&#123;&#123;msg&#125;&#125;<span class="tag">&lt;/<span class="name">div</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>  <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"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">        el:<span class="string">'#app'</span>,</span><br><span class="line">        data:&#123;</span><br><span class="line">            isOk:<span class="literal">true</span>,</span><br><span class="line">            msg:<span class="string">'按钮'</span>,</span><br><span class="line">            activeColor:<span class="string">'red'</span>,</span><br><span class="line">            attrname:<span class="string">'title'</span></span><br><span class="line">        &#125;,</span><br><span class="line">        method:&#123;</span><br><span class="line">            reverse()&#123;</span><br><span class="line">                <span class="keyword">this</span>.msg=<span class="keyword">this</span>.msg.split(<span class="string">''</span>).reverse().join(<span class="string">''</span>)</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></li><li><p>v-model双向绑定</p><blockquote><p>v-model绑定的数据改变，会实时刷新</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">div</span> <span class="attr">id</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">v-bind:title</span>=<span class="string">'msg'</span>&gt;</span>&#123;&#123;msg&#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">input</span> <span class="attr">type</span>=<span class="string">'text'</span> <span class="attr">v-model.number</span>=<span class="string">'msg'</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">'text'</span> <span class="attr">v-model.trim</span>=<span class="string">'msg'</span>&gt;</span><span class="comment">&lt;!--去除用户输入的前后的空格--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">'text'</span> <span class="attr">v-model.lazy</span>=<span class="string">'msg'</span>&gt;</span><span class="comment">&lt;!--model是实时更新数据的，加了lazy修饰符，就会在失去焦点时才写入数据--&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 如果输入的值类型与修饰符的类型不同v-model.number这个number，vue会使用第一次输入值的类型，后续输入的会住哪换成该类型显示，转换不了就会抛弃 --&gt;</span></span><br></pre></td></tr></table></figure></blockquote>  <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="keyword">new</span> Vue(&#123;</span><br><span class="line">        el:<span class="string">'#app'</span>,</span><br><span class="line">        data:&#123;</span><br><span class="line">            msg:<span class="string">'按钮'</span>,</span><br><span class="line">            activeColor:<span class="string">'red'</span></span><br><span class="line">        &#125;,</span><br><span class="line">        method:&#123;</span><br><span class="line">            reverse()&#123;</span><br><span class="line">                <span class="keyword">this</span>.msg=<span class="keyword">this</span>.msg.split(<span class="string">''</span>).reverse().join(<span class="string">''</span>)</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></li><li><p>v-for循环</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></pre></td><td class="code"><pre><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"app"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-for</span>=<span class="string">'(item,index) in num'</span> <span class="attr">:key</span>=<span class="string">'index'</span>&gt;</span> &#123;&#123;item&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">      <span class="comment">&lt;!-- 1. 如果在v-for的时候没有给循环的每一项设置一个唯一的标识符的话，那么后续这个数据发生变化，页面重新渲染，是完全的将之前的列表项给删掉然后重新渲染的。</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">2. 如果给了唯一的标识的话，那么没有变化的，可以直接复用上。让性能更高效。</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">每次 v-for 循环都需要给每一个循环项目加上唯一的标识，使用 v-bind:key=""</span></span><br><span class="line"><span class="comment">最好不要使用下标来做唯一标示。使用数据中的唯一的属性。 --&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-for</span>=<span class="string">'(value,key,index) in obj'</span>&gt;</span> &#123;&#123;value&#125;&#125;&#123;&#123;key&#125;&#125;&#123;&#123;index&#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> <span class="attr">v-for</span>=<span class="string">'i in 10'</span>&gt;</span> &#123;&#123;i&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">      <span class="comment">&lt;!-- 十次循环 --&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>  <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="comment">//可循环遍历对象，数组，字符串...</span></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">        el:<span class="string">'.app'</span>,</span><br><span class="line">        data:&#123;</span><br><span class="line">            msg:<span class="string">'一段文字'</span>,</span><br><span class="line">            num:[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>],</span><br><span class="line">            obj:&#123;<span class="attr">name</span>:<span class="string">'lili'</span>,<span class="attr">age</span>:<span class="number">15</span>,<span class="attr">sex</span>:<span class="string">'男'</span>&#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>其实vue中的数据绑定原理是这样的   <strong><em>⬇</em></strong></p></blockquote><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"box"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> boxEl = <span class="built_in">document</span>.getElementById(<span class="string">'box'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用es5 </span></span><br><span class="line"><span class="built_in">Object</span>.defineProperty(boxEl, <span class="string">'name'</span>, &#123;</span><br><span class="line">  <span class="keyword">get</span>: function () &#123;</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">'你要取值了'</span>);</span><br><span class="line">    <span class="keyword">return</span> boxEl.innerHTML;</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="keyword">set</span>: function (value) &#123;</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">'你要设置内容了'</span>);</span><br><span class="line">    boxEl.innerHTML = value;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;)</span><br><span class="line"><span class="comment">// boxEl.name//获取数据，进入的是get方法</span></span><br><span class="line"><span class="comment">// boxEl.name = '123123'//设置数据，进入set方法</span></span><br></pre></td></tr></table></figure><blockquote><p>解决浏览器渲染的跳动：给元素添加 v-cloak属性，再添加样式[v-cloak]{display:none},这样在浏览器渲染完成前，原始的在html中的数据是不会显示的</p></blockquote><h2 id="数据监测"><a href="#数据监测" class="headerlink" title="数据监测"></a>数据监测</h2><p>####<br>    数组：<br>    使用一些变异方法或者直接替换数组都能引起页面的更新。</p><pre><code>但是以下两个操作不会：  1. 直接根据数据下标来修改     vm.list[0] = 9;  2. 直接修改数据的长度         vm.list.length = 10;解决方式：  1. 使用 Vue.set 原型方法  2. 使用 vm.$set 实例方法  Vue.set(target, index, value);  vm.$set(target, index, value);对象Vue 不能检测对象属性的添加或删除：Vue.set(target, key, value);vm.$set(target, key, value);</code></pre><blockquote><p>如看完这些还不是很了解，请看 (<a href="https://zhan1025.github.io/2019/05/28/vue入门基础1，助解原码/">https://zhan1025.github.io/2019/05/28/vue入门基础1，助解原码/</a>)</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;vue使用是MVVM模式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;基本指令-（前提是已安装vue或以将vue-js文件引入，详细操作见官方文档-https-cn-vuejs-org-v2-guide-E8-B5-B7-E6-AD-A5-）&quot;&gt;&lt;a href=&quot;#基本指令-（前提是已安装vue或以将vue-js文件引入，详细操作见官方文档-https-cn-vuejs-org-v2-guide-E8-B5-B7-E6-AD-A5-）&quot; class=&quot;headerlink&quot; title=&quot;基本指令 （前提是已安装vue或以将vue.js文件引入，详细操作见官方文档:(https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5)）&quot;&gt;&lt;/a&gt;基本指令 （前提是已安装vue或以将vue.js文件引入，详细操作见官方文档:(&lt;a href=&quot;https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5)）&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5)）&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;插值(在文本域插值只能用v-model)&lt;figure class=&quot;highlight html&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;name&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&quot;app&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;&amp;lt;!-- （可先跳过这段文字）这里只是给vue提供的挂载点，也就是vue.js将会通过el: &#39;.app&#39; （如果是id，就是el :&#39;#类名&#39;） --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;name&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt; &amp;#123;&amp;#123;message&amp;#125;&amp;#125;&amp;#123;&amp;#123;tip&amp;#125;&amp;#125;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;name&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;&amp;lt;!-- 通过双花括号将数据带入，也可以带入一个单表达式 （这是一种模板语法）--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;name&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
    
      <category term="vue" scheme="https://zhan1025.github.io/tags/vue/"/>
    
      <category term="基础" scheme="https://zhan1025.github.io/tags/%E5%9F%BA%E7%A1%80/"/>
    
  </entry>
  
  <entry>
    <title>gallery</title>
    <link href="https://zhan1025.github.io/2019/05/17/gallery/"/>
    <id>https://zhan1025.github.io/2019/05/17/gallery/</id>
    <published>2019-05-17T13:00:38.000Z</published>
    <updated>2019-06-15T14:22:45.743Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>H5动画API--requestAnimationFrame</title>
    <link href="https://zhan1025.github.io/2019/05/15/H5%E5%8A%A8%E7%94%BBAPI--requestAnimationFrame/"/>
    <id>https://zhan1025.github.io/2019/05/15/H5动画API--requestAnimationFrame/</id>
    <published>2019-05-14T16:51:03.000Z</published>
    <updated>2019-05-28T05:48:28.285Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>在Web应用中，实现动画效果的方法比较多，Javascript 中可以通过定时器 setTimeout 来实现，css3 可以使用 transition 和 animation 来实现，html5 中的 canvas 也可以实现。除此之外，html5 还提供一个专门用于请求动画的API，那就是 requestAnimationFrame，顾名思义就是请求动画帧。 为了深入理解 requestAnimationFrame 背后的原理，我们首先需要了解一下与之相关的几个概念：</p><a id="more"></a><h2 id="1、屏幕刷新频率"><a href="#1、屏幕刷新频率" class="headerlink" title="1、屏幕刷新频率"></a>1、屏幕刷新频率</h2><p>即图像在屏幕上更新的速度，也即屏幕上的图像每秒钟出现的次数，它的单位是赫兹(Hz)。 对于一般笔记本电脑，这个频率大概是60Hz， 可以在桌面上右键-&gt;屏幕分辨率-&gt;高级设置-&gt;监视器 中查看和设置。这个值的设定受屏幕分辨率、屏幕尺寸和显卡的影响，原则上设置成让眼睛看着舒适的值都行。</p><p>市面上常见的显示器有两种，即CRT和LCD， CRT就是传统显示器，LCD就是我们常说的液晶显示器。</p><p>CRT是一种使用阴极射线管的显示器，屏幕上的图形图像是由一个个因电子束击打而发光的荧光点组成，由于显像管内荧光粉受到电子束击打后发光的时间很短，所以电子束必须不断击打荧光粉使其持续发光。电子束每秒击打荧光粉的次数就是屏幕刷新频率。</p><p>而对于LCD来说，则不存在刷新频率的问题，它根本就不需要刷新。因为LCD中每个像素都在持续不断地发光，直到不发光的电压改变并被送到控制器中，所以LCD不会有电子束击打荧光粉而引起的闪烁现象。</p><p>因此，当你对着电脑屏幕什么也不做的情况下，显示器也会以每秒60次的频率正在不断的更新屏幕上的图像。为什么你感觉不到这个变化？ 那是因为人的眼睛有视觉停留效应，即前一副画面留在大脑的印象还没消失，紧接着后一副画面就跟上来了，这中间只间隔了16.7ms(1000/60≈16.7)， 所以会让你误以为屏幕上的图像是静止不动的。而屏幕给你的这种感觉是对的，试想一下，如果刷新频率变成1次/秒，屏幕上的图像就会出现严重的闪烁，这样就很容易引起眼睛疲劳、酸痛和头晕目眩等症状。</p><h2 id="2、动画原理"><a href="#2、动画原理" class="headerlink" title="2、动画原理"></a>2、动画原理</h2><p>根据上面的原理我们知道，你眼前所看到图像正在以每秒60次的频率刷新，由于刷新频率很高，因此你感觉不到它在刷新。而动画本质就是要让人眼看到图像被刷新而引起变化的视觉效果，这个变化要以连贯的、平滑的方式进行过渡。 那怎么样才能做到这种效果呢？</p><p>刷新频率为60Hz的屏幕每16.7ms刷新一次，我们在屏幕每次刷新前，将图像的位置向左移动一个像素，即1px。这样一来，屏幕每次刷出来的图像位置都比前一个要差1px，因此你会看到图像在移动；由于我们人眼的视觉停留效应，当前位置的图像停留在大脑的印象还没消失，紧接着图像又被移到了下一个位置，因此你才会看到图像在流畅的移动，这就是视觉效果上形成的动画。</p><h2 id="3、setTimeout"><a href="#3、setTimeout" class="headerlink" title="3、setTimeout"></a>3、setTimeout</h2><p>理解了上面的概念以后，我们不难发现，setTimeout 其实就是通过设置一个间隔时间来不断的改变图像的位置，从而达到动画效果的。但我们会发现，利用seTimeout实现的动画在某些低端机上会出现卡顿、抖动的现象。 这种现象的产生有两个原因：</p><p>setTimeout的执行时间并不是确定的。在Javascript中， setTimeout 任务被放进了异步队列中，只有当主线程上的任务执行完以后，才会去检查该队列里的任务是否需要开始执行，因此 setTimeout 的实际执行时间一般要比其设定的时间晚一些。</p><p>刷新频率受屏幕分辨率和屏幕尺寸的影响，因此不同设备的屏幕刷新频率可能会不同，而 setTimeout只能设置一个固定的时间间隔，这个时间不一定和屏幕的刷新时间相同。</p><p>以上两种情况都会导致setTimeout的执行步调和屏幕的刷新步调不一致，从而引起丢帧现象。 那为什么步调不一致就会引起丢帧呢？</p><p>首先要明白，setTimeout的执行只是在内存中对图像属性进行改变，这个变化必须要等到屏幕下次刷新时才会被更新到屏幕上。如果两者的步调不一致，就可能会导致中间某一帧的操作被跨越过去，而直接更新下一帧的图像。假设屏幕每隔16.7ms刷新一次，而setTimeout每隔10ms设置图像向左移动1px， 就会出现如下绘制过程：</p><p>第0ms: 屏幕未刷新，等待中，setTimeout也未执行，等待中；</p><p>第10ms: 屏幕未刷新，等待中，setTimeout开始执行并设置图像属性left=1px；</p><p>第16.7ms: 屏幕开始刷新，屏幕上的图像向左移动了1px， setTimeout 未执行，继续等待中；</p><p>第20ms: 屏幕未刷新，等待中，setTimeout开始执行并设置left=2px;</p><p>第30ms: 屏幕未刷新，等待中，setTimeout开始执行并设置left=3px;</p><p>第33.4ms:屏幕开始刷新，屏幕上的图像向左移动了3px， setTimeout未执行，继续等待中；</p><p>…</p><p>从上面的绘制过程中可以看出，屏幕没有更新left=2px的那一帧画面，图像直接从1px的位置跳到了3px的的位置，这就是丢帧现象，这种现象就会引起动画卡顿。</p><h2 id="4、requestAnimationFrame"><a href="#4、requestAnimationFrame" class="headerlink" title="4、requestAnimationFrame"></a>4、requestAnimationFrame</h2><p>与setTimeout相比，requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。具体一点讲，如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次，如果刷新率是75Hz，那么这个时间间隔就变成了1000/75=13.3ms，换句话说就是，requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次，这样就不会引起丢帧现象，也不会导致动画出现卡顿的问题。</p><p>这个API的调用很简单，如下所示：</p><figure class="highlight javascript"><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><br><span class="line"><span class="keyword">var</span> progress = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//回调函数</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">render</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line"></span><br><span class="line">    progress += <span class="number">1</span>; <span class="comment">//修改图像的位置</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (progress &lt; <span class="number">100</span>) &#123;</span><br><span class="line"></span><br><span class="line">           <span class="comment">//在动画没有结束前，递归渲染</span></span><br><span class="line"></span><br><span class="line">           <span class="built_in">window</span>.requestAnimationFrame(render);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//第一帧渲染</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">window</span>.requestAnimationFrame(render);</span><br></pre></td></tr></table></figure><p>除此之外，requestAnimationFrame还有以下两个优势：</p><p>CPU节能：使用setTimeout实现的动画，当页面被隐藏或最小化时，setTimeout 仍然在后台执行动画任务，由于此时页面处于不可见或不可用状态，刷新动画是没有意义的，完全是浪费CPU资源。而requestAnimationFrame则完全不同，当页面处理未激活的状态下，该页面的屏幕刷新任务也会被系统暂停，因此跟着系统步伐走的requestAnimationFrame也会停止渲染，当页面被激活时，动画就从上次停留的地方继续执行，有效节省了CPU开销。</p><p>函数节流：在高频率事件(resize,scroll等)中，为了防止在一个刷新间隔内发生多次函数执行，使用requestAnimationFrame可保证每个刷新间隔内，函数只被执行一次，这样既能保证流畅性，也能更好的节省函数执行的开销。一个刷新间隔内函数执行多次时没有意义的，因为显示器每16.7ms刷新一次，多次绘制并不会在屏幕上体现出来。</p><h2 id="5、优雅降级"><a href="#5、优雅降级" class="headerlink" title="5、优雅降级"></a>5、优雅降级</h2><p>由于requestAnimationFrame目前还存在兼容性问题，而且不同的浏览器还需要带不同的前缀。因此需要通过优雅降级的方式对requestAnimationFrame进行封装，优先使用高级特性，然后再根据不同浏览器的情况进行回退，直止只能使用setTimeout的情况。下面的代码就是有人在github上提供的polyfill，详细介绍请参考github代码 requestAnimationFrame（<a href="https://github.com/darius/requestAnimationFrame）" target="_blank" rel="noopener">https://github.com/darius/requestAnimationFrame）</a></p><figure class="highlight javascript"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (!<span class="built_in">Date</span>.now)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Date</span>.now = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123; <span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Date</span>().getTime(); &#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="meta">    'use strict'</span>;</span><br><span class="line"></span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> vendors = [<span class="string">'webkit'</span>, <span class="string">'moz'</span>];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; vendors.length &amp;&amp; !<span class="built_in">window</span>.requestAnimationFrame; ++i) &#123;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> vp = vendors[i];</span><br><span class="line"></span><br><span class="line">        <span class="built_in">window</span>.requestAnimationFrame = <span class="built_in">window</span>[vp+<span class="string">'RequestAnimationFrame'</span>];</span><br><span class="line"></span><br><span class="line">        <span class="built_in">window</span>.cancelAnimationFrame = (<span class="built_in">window</span>[vp+<span class="string">'CancelAnimationFrame'</span>]</span><br><span class="line"></span><br><span class="line">                                   || <span class="built_in">window</span>[vp+<span class="string">'CancelRequestAnimationFrame'</span>]);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (<span class="regexp">/iP(ad|hone|od).*OS 6/</span>.test(<span class="built_in">window</span>.navigator.userAgent) <span class="comment">// iOS6 is buggy</span></span><br><span class="line"></span><br><span class="line">        || !<span class="built_in">window</span>.requestAnimationFrame || !<span class="built_in">window</span>.cancelAnimationFrame) &#123;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> lastTime = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">window</span>.requestAnimationFrame = <span class="function"><span class="keyword">function</span>(<span class="params">callback</span>) </span>&#123;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">var</span> now = <span class="built_in">Date</span>.now();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">var</span> nextTime = <span class="built_in">Math</span>.max(lastTime + <span class="number">16</span>, now);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">return</span> setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123; callback(lastTime = nextTime); &#125;,</span><br><span class="line"></span><br><span class="line">                              nextTime - now);</span><br><span class="line"></span><br><span class="line">        &#125;;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">window</span>.cancelAnimationFrame = clearTimeout;</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><h3 id="原文来自-：一像素"><a href="#原文来自-：一像素" class="headerlink" title="====原文来自====：一像素"></a>====原文来自====：一像素</h3><pre><code>www.cnblogs.com/onepixel/p/7078617.html</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;在Web应用中，实现动画效果的方法比较多，Javascript 中可以通过定时器 setTimeout 来实现，css3 可以使用 transition 和 animation 来实现，html5 中的 canvas 也可以实现。除此之外，html5 还提供一个专门用于请求动画的API，那就是 requestAnimationFrame，顾名思义就是请求动画帧。 为了深入理解 requestAnimationFrame 背后的原理，我们首先需要了解一下与之相关的几个概念：&lt;/p&gt;
    
    </summary>
    
    
      <category term="js" scheme="https://zhan1025.github.io/tags/js/"/>
    
      <category term="canvas" scheme="https://zhan1025.github.io/tags/canvas/"/>
    
  </entry>
  
  <entry>
    <title>react-saga</title>
    <link href="https://zhan1025.github.io/2018/06/26/react-saga/"/>
    <id>https://zhan1025.github.io/2018/06/26/react-saga/</id>
    <published>2018-06-26T07:39:08.000Z</published>
    <updated>2019-06-26T08:13:11.707Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><blockquote><p>​    首先中间件有很多，你可以把他当作一个函数，或者是说是一个模块，<br>想必你用过 react-thunk ，react-logger…,那么thunk也可以完成saga的工作，只能说有的人喜欢挑战，就是要用saga<br>主要是想让saga来处理异步请求操作</p></blockquote><h2 id="saga"><a href="#saga" class="headerlink" title="saga"></a>saga</h2><p><a href="https://redux-saga-in-chinese.js.org/index.html" target="_blank" rel="noopener">saga自述</a></p><ol><li><p>安装saga    yarn add react-saga</p></li><li><p>在你的redux主仓库中添加，</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">// 2. 引入saga 引入saga的主要处理文件</span></span><br><span class="line"><span class="keyword">import</span> createSagaMiddleware <span class="keyword">from</span> <span class="string">'redux-saga'</span>;</span><br><span class="line"><span class="comment">// @是配了别名的，写的路径就是你saga文件的路径</span></span><br><span class="line"><span class="keyword">import</span> todoSaga <span class="keyword">from</span> <span class="string">'@/views/TodoList/store/todoSaga'</span>;</span><br><span class="line"><span class="comment">//  3.创建saga中间件</span></span><br><span class="line"><span class="keyword">const</span> sagaMiddleware = createSagaMiddleware();</span><br><span class="line">.</span><br><span class="line">.</span><br><span class="line">.</span><br><span class="line"><span class="comment">//仓库暴露出去的东西</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> createStore(</span><br><span class="line">  combineReducers(&#123;</span><br><span class="line">    todo: todoReducer</span><br><span class="line">  &#125;),</span><br><span class="line">  composeEnhancers(</span><br><span class="line">    <span class="comment">//  使用上中间件</span></span><br><span class="line">    applyMiddleware(sagaMiddleware))</span><br><span class="line"></span><br><span class="line">);</span><br><span class="line"><span class="comment">//  run todoSaga</span></span><br><span class="line">sagaMiddleware.run(todoSaga)</span><br></pre></td></tr></table></figure></li><li><p>在仓库中（我这边是组件的小仓库）创建saga文件</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">// 注意这个，这里是saga提供的一些方法</span></span><br><span class="line"><span class="keyword">import</span> &#123; takeEvery, put &#125; <span class="keyword">from</span> <span class="string">'redux-saga/effects'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> &#123; FETCH_TODO_LIST &#125; <span class="keyword">from</span> <span class="string">'./actionTypes'</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; initTodoListAction &#125; <span class="keyword">from</span> <span class="string">'./actionCreates'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//  处理一个异步请求</span></span><br><span class="line"><span class="function"><span class="keyword">function</span>* <span class="title">init</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> response = <span class="keyword">yield</span> fetch(<span class="string">'http://localhost:3001/todoList'</span>);</span><br><span class="line">  <span class="keyword">let</span> res = <span class="keyword">yield</span> response.json();</span><br><span class="line">  <span class="keyword">yield</span> put (initTodoListAction(res));</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"><span class="keyword">const</span> todoSaga = <span class="function"><span class="keyword">function</span> *(<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="comment">//  takeEvery('action type',要做的事情)</span></span><br><span class="line">  <span class="comment">//  监听/拦截到这个动作，进行操作</span></span><br><span class="line">  <span class="keyword">yield</span> takeEvery(FETCH_TODO_LIST, init);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> todoSaga;</span><br><span class="line"><span class="comment">/** </span></span><br><span class="line"><span class="comment"> *这边的saga作为中间件利用takeEvery拦截到组件（ui组件发出的action），</span></span><br><span class="line"><span class="comment"> *对action.type做拦截，然后在这个文件里，做异步请求。在请求完成后再将数据通过</span></span><br><span class="line"><span class="comment"> *saga提供的方法put===store.dispatch</span></span><br><span class="line"><span class="comment"> *派发了以后，会进入到reducer中，对仓库里的数据进行一些操作</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure></li></ol><p>熟能生巧！</p>    <div id="aplayer-CxAGXQKf" class="aplayer aplayer-tag-marker meting-tag-marker" data-id="293948" data-server="song" data-type="mode:circulation" data-mode="circulation" data-autoplay="false" data-mutex="true" data-listmaxheight="340px" data-preload="auto" data-theme="#ad7a86"></div>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="react" scheme="https://zhan1025.github.io/tags/react/"/>
    
      <category term="saga" scheme="https://zhan1025.github.io/tags/saga/"/>
    
      <category term="redux" scheme="https://zhan1025.github.io/tags/redux/"/>
    
      <category term="中间件" scheme="https://zhan1025.github.io/tags/%E4%B8%AD%E9%97%B4%E4%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>MVC、MVP、MVVM</title>
    <link href="https://zhan1025.github.io/2018/06/23/MVC%E3%80%81MVP%E3%80%81MVVM/"/>
    <id>https://zhan1025.github.io/2018/06/23/MVC、MVP、MVVM/</id>
    <published>2018-06-23T02:41:46.000Z</published>
    <updated>2019-06-23T09:32:42.166Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h2 id="MVC-Model-View-Controller"><a href="#MVC-Model-View-Controller" class="headerlink" title="MVC(Model View Controller):"></a>MVC(Model View Controller):</h2><pre><code>视图（view）： 用户界面</code></pre>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="MVVM" scheme="https://zhan1025.github.io/tags/MVVM/"/>
    
      <category term="MVC" scheme="https://zhan1025.github.io/tags/MVC/"/>
    
      <category term="MVP" scheme="https://zhan1025.github.io/tags/MVP/"/>
    
  </entry>
  
  <entry>
    <title>js经典问题汇总（持续更新...）</title>
    <link href="https://zhan1025.github.io/2017/06/22/js%E7%BB%8F%E5%85%B8%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB/"/>
    <id>https://zhan1025.github.io/2017/06/22/js经典问题汇总/</id>
    <published>2017-06-22T02:00:32.000Z</published>
    <updated>2019-06-22T10:11:40.489Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>捡空余时间，写点笔记</p><p>1.描述一下cookies、sessionStorage和loaclStorage区别<br>    - sessionStorage用于本地存储一个会话的数据，会话结束就会清除（当你关闭浏览器，会话就结束了）<br>    - loaclStorage用于持久性的本地存储数据，除非自动清除，不然有就不会过期<br>    - cookie 大小限制4k左右，每次请求新页面，cookie都会被发送出去<br>总结：<br>    - 相同：<br>        1.都有大小限制（cookie在4k左右，其他的在几兆左右）<br>        2.都用于存储少量的数据，用户信息<br>    - 差异：<br>        1.sessionStorage在会话结束后，自动清除，<br>        2.localStorage需要自动清除<br>        3.cookie可以设置有效期，有效期之后会自动清除<br>2.Sass、Scss、Less是什么？大家为什么要使用他们？<br>    &gt; 都是css的预处理器，都含有变量，方法、继承、嵌套等概念，<br>    - sass与less使用{}来区分层级嵌套<br>    - scss没有全局变量的概念<br>    特点：结构清晰，便于扩展，可以轻松的实现多层继承<br>3.闭包是什么，有什么特性，对页面有什么影响<br>    闭包能读取其他函数内部的变量的函数<br>    缺点：滥用闭包会造成内存泄露，因为闭包会把引用的变量存储起来，永远不会被释放（不会被辣鸡回收机制回收）<br>4.事件委托是什么<br>    利用事件冒泡原理，让本来有自己触发的事件，让他的父级元素代替执行</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="js" scheme="https://zhan1025.github.io/tags/js/"/>
    
      <category term="面试" scheme="https://zhan1025.github.io/tags/%E9%9D%A2%E8%AF%95/"/>
    
  </entry>
  
</feed>
