<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>XHalso&#39;s Blog</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://blog.ivanweb.cn/"/>
  <updated>2019-05-15T07:41:15.933Z</updated>
  <id>http://blog.ivanweb.cn/</id>
  
  <author>
    <name>XHalso</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>使用nuxtjs实现word、excel、ppt 和 pdf 文件在线预览</title>
    <link href="http://blog.ivanweb.cn/2019/05/15/%E4%BD%BF%E7%94%A8nuxtjs%E5%AE%9E%E7%8E%B0word%E3%80%81excel%E3%80%81ppt-%E5%92%8C-pdf-%E6%96%87%E4%BB%B6%E5%9C%A8%E7%BA%BF%E9%A2%84%E8%A7%88/"/>
    <id>http://blog.ivanweb.cn/2019/05/15/使用nuxtjs实现word、excel、ppt-和-pdf-文件在线预览/</id>
    <published>2019-05-15T07:40:08.000Z</published>
    <updated>2019-05-15T07:41:15.933Z</updated>
    
    <content type="html"><![CDATA[<h1 id="file-preview"><a href="#file-preview" class="headerlink" title="file-preview"></a>file-preview</h1><blockquote><p>word、excel、ppt 和 pdf 文件在线预览。<a href="https://view.ivanweb.cn/" target="_blank" rel="noopener">查看</a></p></blockquote><h2 id="使用的技术"><a href="#使用的技术" class="headerlink" title="使用的技术"></a>使用的技术</h2><ul><li>nuxtjs</li><li>express</li><li>element-ui</li><li>typeorm</li><li><a href="https://mozilla.github.io/pdf.js/" target="_blank" rel="noopener">pdfjs</a></li><li>word、excel、ppt在线预览<a href="https://www.microsoft.com/en-us/microsoft-365/blog/2013/04/10/office-web-viewer-view-office-documents-in-a-browser/?eu=true" target="_blank" rel="noopener">微软接口文档</a></li><li>node-schedule</li></ul><h2 id="实现的功能"><a href="#实现的功能" class="headerlink" title="实现的功能"></a>实现的功能</h2><ul><li>单文件上传</li><li>根据文件类型实现word、excel、ppt 和 pdf 文件的在线预览</li><li>定时任务进行文件删除</li><li>使用log4js打印上传、预览、定时任务删除文件的日志</li></ul><h2 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h2><figure class="highlight bash"><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="comment"># 下载项目</span></span><br><span class="line">$ git <span class="built_in">clone</span> https://github.com/XHalso/file-preview.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用的mysql数据库，在根目录创建mysql的配置文件.env</span></span><br><span class="line">DB_HOST=localhost</span><br><span class="line">DB_PORT=3306</span><br><span class="line">DB_USETNAME=root</span><br><span class="line">DB_PASSWORD=123456</span><br><span class="line">DB_DATABASE=file_preview</span><br><span class="line">DB_SYNC=<span class="literal">true</span></span><br><span class="line">EXPIREDATE=3000000000</span><br><span class="line">BASEURL=http://localhost:3001/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 本地启动项目,访问地址是 http://localhost:3001</span></span><br><span class="line">$ npm install</span><br><span class="line">$ npm run dev</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;file-preview&quot;&gt;&lt;a href=&quot;#file-preview&quot; class=&quot;headerlink&quot; title=&quot;file-preview&quot;&gt;&lt;/a&gt;file-preview&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;word、excel、ppt 和 
      
    
    </summary>
    
      <category term="javascript" scheme="http://blog.ivanweb.cn/categories/javascript/"/>
    
    
      <category term="node" scheme="http://blog.ivanweb.cn/tags/node/"/>
    
      <category term="vue" scheme="http://blog.ivanweb.cn/tags/vue/"/>
    
  </entry>
  
  <entry>
    <title>客户端使用七牛云上传文件</title>
    <link href="http://blog.ivanweb.cn/2019/05/08/%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E4%B8%83%E7%89%9B%E4%BA%91%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/"/>
    <id>http://blog.ivanweb.cn/2019/05/08/客户端使用七牛云上传文件/</id>
    <published>2019-05-08T09:34:47.000Z</published>
    <updated>2019-05-08T09:43:52.814Z</updated>
    
    <content type="html"><![CDATA[<h2 id="客户端上传文件"><a href="#客户端上传文件" class="headerlink" title="客户端上传文件"></a>客户端上传文件</h2><p>首先从后台后去七牛云的token,这里使用node来获取token</p><figure class="highlight ts"><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> getUploadToken = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> accessKey = <span class="string">'accessKey'</span>;</span><br><span class="line">  <span class="keyword">const</span> secretKey = <span class="string">'secretKey'</span>;</span><br><span class="line">  <span class="keyword">const</span> bucket = <span class="string">"bucket"</span>;  <span class="comment">//存储空间名称</span></span><br><span class="line">  <span class="keyword">const</span> mac = <span class="keyword">new</span> qiniu.auth.digest.Mac(accessKey, secretKey);</span><br><span class="line">  <span class="keyword">const</span> options = &#123;</span><br><span class="line">    scope: bucket</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">const</span> putPolicy = <span class="keyword">new</span> qiniu.rs.PutPolicy(options);</span><br><span class="line">  <span class="keyword">const</span> uploadToken = putPolicy.uploadToken(mac);</span><br><span class="line">  <span class="keyword">return</span> uploadToken;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接着再浏览器请求接口获取七牛云token，进行文件上传<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><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></pre></td><td class="code"><pre><span class="line">&lt;!--使用的vue+elementUI--&gt;</span><br><span class="line">qiniuUpload() &#123;</span><br><span class="line">  <span class="keyword">this</span>.axios.get(<span class="string">"/api/work/getQiniuToken"</span>).then(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> token = res.token;</span><br><span class="line">    <span class="keyword">let</span> config = &#123;</span><br><span class="line">      useCdnDomain: <span class="literal">true</span>,</span><br><span class="line">      region: qiniu.region.z1</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">let</span> putExtra = &#123;</span><br><span class="line">      fname: <span class="string">""</span>,</span><br><span class="line">      params: &#123;&#125;,</span><br><span class="line">      mimeType: <span class="literal">null</span></span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">let</span> file = <span class="keyword">this</span>.form.audio[<span class="number">0</span>].raw;</span><br><span class="line">    <span class="keyword">let</span> key = dayjs().format(<span class="string">"YYYYMMDDHHmmssSSS"</span>) + <span class="string">".mp3"</span>;</span><br><span class="line">    <span class="keyword">let</span> observable = qiniu.upload(file, key, token, putExtra, config);</span><br><span class="line">    <span class="keyword">let</span> that = <span class="keyword">this</span>;</span><br><span class="line">    <span class="keyword">let</span> observer = &#123;</span><br><span class="line">      next: <span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="built_in">console</span>.log(res);</span><br><span class="line">      &#125;,</span><br><span class="line">      error: <span class="function"><span class="params">err</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="built_in">console</span>.log(err);</span><br><span class="line">      &#125;,</span><br><span class="line">      complete: <span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">        that.submitForm(res.key);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">let</span> subscription = observable.subscribe(observer);</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;,</span><br></pre></td></tr></table></figure></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;p&gt;首先从后台后去七牛云的token,这里使用node来获取token&lt;/p&gt;
&lt;figure clas
      
    
    </summary>
    
      <category term="node" scheme="http://blog.ivanweb.cn/categories/node/"/>
    
    
      <category term="node" scheme="http://blog.ivanweb.cn/tags/node/"/>
    
      <category term="nestjs" scheme="http://blog.ivanweb.cn/tags/nestjs/"/>
    
      <category term="typescript" scheme="http://blog.ivanweb.cn/tags/typescript/"/>
    
  </entry>
  
  <entry>
    <title>nestjs使用配置文件连接数据库</title>
    <link href="http://blog.ivanweb.cn/2019/05/08/nestjs%E4%BD%BF%E7%94%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%BF%9E%E6%8E%A5%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    <id>http://blog.ivanweb.cn/2019/05/08/nestjs使用配置文件连接数据库/</id>
    <published>2019-05-08T09:19:03.000Z</published>
    <updated>2019-05-08T09:32:56.302Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ npm i --save dotenv</span><br><span class="line">$ npm i --save-dev @types/dotenv</span><br></pre></td></tr></table></figure><h2 id="创建一个-env文件"><a href="#创建一个-env文件" class="headerlink" title="创建一个.env文件"></a>创建一个.env文件</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">DB_HOST=localhost</span><br><span class="line">DB_PORT=3306</span><br><span class="line">DB_USETNAME=root</span><br><span class="line">DB_PASSWORD=123456</span><br><span class="line">DB_DATABASE=test</span><br><span class="line">DB_SYNC=true</span><br></pre></td></tr></table></figure><h2 id="全局引入"><a href="#全局引入" class="headerlink" title="全局引入"></a>全局引入</h2><figure class="highlight ts"><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;!--main.ts--&gt;</span><br><span class="line"><span class="keyword">import</span> <span class="string">'dotenv/config'</span></span><br></pre></td></tr></table></figure><h2 id="连接数据库"><a href="#连接数据库" class="headerlink" title="连接数据库"></a>连接数据库</h2><figure class="highlight ts"><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;!--app.moudle.ts--&gt;</span><br><span class="line"><span class="meta">@Module</span>(&#123;</span><br><span class="line">  imports: [</span><br><span class="line">    TypeOrmModule.forRoot(&#123;</span><br><span class="line">      <span class="keyword">type</span>: <span class="string">'mysql'</span>,</span><br><span class="line">      host: process.env.DB_HOST,</span><br><span class="line">      port: <span class="built_in">parseInt</span>(process.env.DB_PORT),</span><br><span class="line">      username: process.env.DB_USETNAME,</span><br><span class="line">      password: process.env.DB_PASSWORD,</span><br><span class="line">      database: process.env.DB_DATABASE,</span><br><span class="line">      entities: [__dirname + <span class="string">'/**/*.entity&#123;.ts,.js&#125;'</span>],</span><br><span class="line">      synchronize: process.env.DB_SYNC==<span class="string">'true'</span>?<span class="literal">true</span>:<span class="literal">false</span>,</span><br><span class="line">      logging: <span class="literal">true</span></span><br><span class="line">    &#125;),</span><br><span class="line">  ],</span><br><span class="line">  ...</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure>]]></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;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span 
      
    
    </summary>
    
      <category term="node" scheme="http://blog.ivanweb.cn/categories/node/"/>
    
    
      <category term="node" scheme="http://blog.ivanweb.cn/tags/node/"/>
    
      <category term="nestjs" scheme="http://blog.ivanweb.cn/tags/nestjs/"/>
    
      <category term="typescript" scheme="http://blog.ivanweb.cn/tags/typescript/"/>
    
  </entry>
  
  <entry>
    <title>微信小程序 音频和背景音频的无缝切换播放</title>
    <link href="http://blog.ivanweb.cn/2019/05/08/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E9%9F%B3%E9%A2%91%E5%92%8C%E8%83%8C%E6%99%AF%E9%9F%B3%E9%A2%91%E7%9A%84%E6%97%A0%E7%BC%9D%E5%88%87%E6%8D%A2%E6%92%AD%E6%94%BE/"/>
    <id>http://blog.ivanweb.cn/2019/05/08/微信小程序-音频和背景音频的无缝切换播放/</id>
    <published>2019-05-08T08:46:27.000Z</published>
    <updated>2019-05-08T09:25:40.666Z</updated>
    
    <content type="html"><![CDATA[<h2 id="音频播放"><a href="#音频播放" class="headerlink" title="音频播放"></a>音频播放</h2><p>微信小程序目前建议要使用音频的功能，推荐使用通过wx.createInnerAudioContext()创建内部 audio 上下文 InnerAudioContext 对象。</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">&lt;!--seek：跳转的位置，auto: 是否自动播放--&gt;</span><br><span class="line">handleAudio(seek=<span class="number">0</span>,auto=<span class="literal">true</span>)&#123;</span><br><span class="line">    <span class="keyword">const</span> that=<span class="keyword">this</span></span><br><span class="line">    <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">      innerAudioContext: wx.createInnerAudioContext()</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.seek(seek)</span><br><span class="line">    &lt;!--这里的url指的是音频的地址--&gt;</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.src = url</span><br><span class="line">    <span class="keyword">if</span>(auto)&#123;</span><br><span class="line">      <span class="keyword">this</span>.data.innerAudioContext.autoplay = <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.onPlay(<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">'开始播放'</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.onTimeUpdate(<span class="function"><span class="params">()</span>=&gt;</span>&#123;</span><br><span class="line">      &lt;!--持续更新已播放的进度--&gt;</span><br><span class="line">      that.setData(&#123;</span><br><span class="line">        currentTime: that.formatTime(that.data.innerAudioContext.currentTime)</span><br><span class="line">      &#125;)</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.onError(<span class="function">(<span class="params">res</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="built_in">console</span>.log(res.errMsg)</span><br><span class="line">      <span class="built_in">console</span>.log(res.errCode)</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><p>接着在页面生命周期onReady里使用wx.request的success里去调用handleAudio函数。<br><a id="more"></a></p><h2 id="背景音频播放"><a href="#背景音频播放" class="headerlink" title="背景音频播放"></a>背景音频播放</h2><p>如果用户离开音频播放页面，如何是音频接着播放，这里就是用到了背景音频。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">playBackground()&#123;</span><br><span class="line">    wx.setStorageSync(<span class="string">'work_id'</span>, <span class="keyword">this</span>.data.work_id)</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.data.innerAudioContext.paused == <span class="literal">false</span>) &#123;</span><br><span class="line">      &lt;!--销毁音频实例--&gt;</span><br><span class="line">      <span class="keyword">this</span>.data.innerAudioContext.destroy()</span><br><span class="line">      <span class="keyword">const</span> backgroundAudioManager = wx.getBackgroundAudioManager()</span><br><span class="line"></span><br><span class="line">      &lt;!--<span class="keyword">this</span>.data.work:从API获取的数据--&gt;</span><br><span class="line">      backgroundAudioManager.title = <span class="keyword">this</span>.data.work.title</span><br><span class="line">      backgroundAudioManager.epname = <span class="keyword">this</span>.data.work.title</span><br><span class="line">      backgroundAudioManager.singer = <span class="keyword">this</span>.data.work.author.name</span><br><span class="line">      backgroundAudioManager.startTime = <span class="keyword">this</span>.data.innerAudioContext.currentTime</span><br><span class="line">      backgroundAudioManager.coverImgUrl = <span class="keyword">this</span>.data.work.author.avatar[<span class="number">0</span>].url</span><br><span class="line">      <span class="comment">// 设置了 src 之后会自动播放</span></span><br><span class="line">      backgroundAudioManager.src = <span class="keyword">this</span>.data.work.audio[<span class="number">0</span>].url</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><p>接着在页面生命周期onHide和onUnload里调用playBackground函数。</p><h2 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</h2><h3 id="wxml"><a href="#wxml" class="headerlink" title="wxml"></a>wxml</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><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></pre></td><td class="code"><pre><span class="line">    &lt;!--pages/work/index.wxml--&gt;</span><br><span class="line">&lt;view class=&apos;container&apos;&gt;</span><br><span class="line">  &lt;i-message id=&quot;message&quot; /&gt;</span><br><span class="line">  &lt;!-- &lt;image class=&apos;poster&apos; src=&quot;&#123;&#123;work.poster[0].url&#125;&#125;&quot; mode=&apos;widthFix&apos;&gt;&lt;/image&gt; --&gt;</span><br><span class="line">  &lt;image-loader  </span><br><span class="line">    style=&quot;width:100%&quot;</span><br><span class="line">    default-image=&apos;/assets/images/def_poster.jpg&apos; </span><br><span class="line">    mode=&apos;widthFix&apos;     </span><br><span class="line">    original-image=&apos;&#123;&#123;work.poster[0].url&#125;&#125;&apos;</span><br><span class="line">    width=&quot;100%&quot; /&gt;</span><br><span class="line">  &lt;view class=&apos;active-audio&apos;&gt;</span><br><span class="line">    &lt;view class=&apos;audio-left&apos;&gt;</span><br><span class="line">      &lt;!-- &lt;image src=&apos;&#123;&#123;work.author.avatar[0].url&#125;&#125;&apos; mode=&apos;widthFix&apos;&gt;&lt;/image&gt; --&gt;</span><br><span class="line">      &lt;image-loader  </span><br><span class="line">        style=&quot;width:100%&quot;</span><br><span class="line">        default-image=&apos;/assets/images/def_avatar.jpg&apos; </span><br><span class="line">        mode=&apos;widthFix&apos;     </span><br><span class="line">        original-image=&apos;&#123;&#123;work.author.avatar[0].url&#125;&#125;&apos;</span><br><span class="line">        width=&quot;100%&quot; /&gt;</span><br><span class="line">      &lt;view class=&apos;play&apos; wx:if=&quot;&#123;&#123;!paly_status&#125;&#125;&quot; bindtap=&apos;play&apos;&gt;</span><br><span class="line">        &lt;text class=&apos;play-btn&apos;&gt;&lt;/text&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">      &lt;view class=&quot;stop&quot;  wx:if=&quot;&#123;&#123;paly_status&#125;&#125;&quot; bindtap=&apos;stop&apos;&gt;</span><br><span class="line">        &lt;text class=&apos;stop-left&apos;&gt;&lt;/text&gt;</span><br><span class="line">        &lt;text class=&apos;stop-right&apos;&gt;&lt;/text&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line">    &lt;view class=&apos;audio-right&apos;&gt;</span><br><span class="line">      &lt;text class=&apos;top&apos;&gt;&#123;&#123;work.title&#125;&#125;&lt;/text&gt;</span><br><span class="line">      &lt;view class=&apos;bottom&apos;&gt;</span><br><span class="line">        &lt;text&gt;&#123;&#123;work.author.name&#125;&#125;&lt;/text&gt;</span><br><span class="line">        &lt;view class=&apos;time&apos; wx:if=&quot;&#123;&#123;duration!=&apos;00:00&apos;&#125;&#125;&quot;&gt;</span><br><span class="line">          &lt;text&gt;&#123;&#123;currentTime&#125;&#125;/&lt;/text&gt;</span><br><span class="line">          &lt;text&gt;&#123;&#123;duration&#125;&#125;&lt;/text&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line">  &lt;/view&gt;</span><br><span class="line">  &lt;view class=&apos;youtube&apos;&gt;</span><br><span class="line">    &lt;text&gt;YouTube:&lt;/text&gt;</span><br><span class="line">    &lt;text class=&apos;url&apos;&gt;&#123;&#123;work.video_src&#125;&#125;&lt;/text&gt;</span><br><span class="line">  &lt;/view&gt;</span><br><span class="line">  &lt;view class=&quot;action&quot;&gt;</span><br><span class="line">    &lt;view class=&apos;action-item&apos; open-type=&quot;share&quot;&gt;</span><br><span class="line">      &lt;button </span><br><span class="line">        bindtap=&quot;handleTapShareButton&quot; </span><br><span class="line">        open-type=&quot;share&quot; </span><br><span class="line">        class=&quot;button-share&quot; </span><br><span class="line">        id=&quot;share-button&quot;&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">      &lt;label for=&quot;share-button&quot;&gt;&lt;i-icon size=&apos;24&apos; type=&quot;send&quot; /&gt;</span><br><span class="line">      &lt;text&gt;分享&lt;/text&gt;&lt;/label&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line">    &lt;view class=&apos;action-item&apos; bindtap=&apos;handleCollect&apos;&gt;</span><br><span class="line">      &lt;i-icon size=&apos;24&apos; type=&quot;&#123;&#123;collect_status?&apos;collection_fill&apos;:&apos;collection&apos;&#125;&#125;&quot; /&gt;</span><br><span class="line">      &lt;text&gt;&#123;&#123;collect_status?&apos;已收藏&apos;:&apos;收藏&apos;&#125;&#125;&lt;/text&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line">  &lt;/view&gt;</span><br><span class="line">&lt;/view&gt;</span><br></pre></td></tr></table></figure><h3 id="wxss"><a href="#wxss" class="headerlink" title="wxss"></a>wxss</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br></pre></td><td class="code"><pre><span class="line">/* pages/work/index.wxss */</span><br><span class="line"></span><br><span class="line">.container &#123;</span><br><span class="line">  text-align: center;</span><br><span class="line">  padding: 0 20rpx;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.poster &#123;</span><br><span class="line">  width: 100%;</span><br><span class="line">  border-radius: 5px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.action &#123;</span><br><span class="line">  display: flex;</span><br><span class="line">  justify-content: center;</span><br><span class="line">  margin: 10px 0;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">image&#123;</span><br><span class="line">  border-radius: 5px;</span><br><span class="line">&#125;</span><br><span class="line">.action-item &#123;</span><br><span class="line">  margin: 0 20px;</span><br><span class="line">  display: flex;</span><br><span class="line">  align-items: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.action-item label &#123;</span><br><span class="line">  display: flex;</span><br><span class="line">  align-items: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.action text &#123;</span><br><span class="line">  font-size: 18px;</span><br><span class="line">  color: #515151;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.button-share &#123;</span><br><span class="line">  display: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.youtube &#123;</span><br><span class="line">  margin-top: 20px;</span><br><span class="line">  text-align: left;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.youtube .url &#123;</span><br><span class="line">  word-wrap: break-word;</span><br><span class="line">  color: rgb(0, 0, 238);</span><br><span class="line">  text-decoration: underline;</span><br><span class="line">  margin: 5px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.active-audio &#123;</span><br><span class="line">  margin-top: 10px;</span><br><span class="line">  width: 100%;</span><br><span class="line">  display: flex;</span><br><span class="line">  border: 1px solid #e0e0e0;</span><br><span class="line">  border-radius: 2px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.audio-left &#123;</span><br><span class="line">  position: relative;</span><br><span class="line">  width: 80px;</span><br><span class="line">  height: 80px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.audio-left image &#123;</span><br><span class="line">  border-radius: 0;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.play &#123;</span><br><span class="line">  position: absolute;</span><br><span class="line">  top: 25px;</span><br><span class="line">  left: 25px;</span><br><span class="line">  border: 1px solid #fff;</span><br><span class="line">  display: inline-block;</span><br><span class="line">  height: 30px;</span><br><span class="line">  width: 30px;</span><br><span class="line">  border-radius: 50%;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.play-btn &#123;</span><br><span class="line">  position: absolute;</span><br><span class="line">  top: 7px;</span><br><span class="line">  left: 10px;</span><br><span class="line">  display: inline-block;</span><br><span class="line">  width: 0;</span><br><span class="line">  height: 0;</span><br><span class="line">  border-top: 8px solid transparent;</span><br><span class="line">  border-left: 12px solid rgba(255, 255, 255, 0.9);</span><br><span class="line">  border-bottom: 8px solid transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.stop &#123;</span><br><span class="line">  position: absolute;</span><br><span class="line">  top: 25px;</span><br><span class="line">  left: 25px;</span><br><span class="line">  border: 1px solid #fff;</span><br><span class="line">  display: inline-block;</span><br><span class="line">  height: 30px;</span><br><span class="line">  width: 30px;</span><br><span class="line">  border-radius: 50%;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.stop-left, .stop-right &#123;</span><br><span class="line">  position: absolute;</span><br><span class="line">  top: 9px;</span><br><span class="line">  display: inline-block;</span><br><span class="line">  width: 0;</span><br><span class="line">  height: 0;</span><br><span class="line">  border-color: rgba(255, 255, 255, 0.9);</span><br><span class="line">  border-style: solid;</span><br><span class="line">  border-width: 6px 2px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.stop-left &#123;</span><br><span class="line">  left: 9px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.stop-right &#123;</span><br><span class="line">  right: 9px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.audio-right &#123;</span><br><span class="line">  position: relative;</span><br><span class="line">  width: calc(100% - 104px);</span><br><span class="line">  margin: 0 12px;</span><br><span class="line">  text-align: left;</span><br><span class="line">  height: 80px;</span><br><span class="line">&#125;</span><br><span class="line">.audio-right .top &#123;</span><br><span class="line">  padding-top: 5px;</span><br><span class="line">  display: -webkit-box;</span><br><span class="line">  overflow: hidden;</span><br><span class="line">  text-overflow: ellipsis;</span><br><span class="line">  word-break: break-all;</span><br><span class="line">  -webkit-box-orient: vertical;</span><br><span class="line">  -webkit-line-clamp: 2;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">.bottom &#123;</span><br><span class="line">  width: 100%;</span><br><span class="line">  display: flex;</span><br><span class="line">  justify-content: space-between;</span><br><span class="line">  font-size: 14px;</span><br><span class="line">  color: #8b8b8b;</span><br><span class="line">  position: absolute;</span><br><span class="line">  bottom: 5px;</span><br><span class="line">&#125;</span><br><span class="line">.time&#123;</span><br><span class="line">  font-size: 14px;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="js"><a href="#js" class="headerlink" title="js"></a>js</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> utils = <span class="built_in">require</span>(<span class="string">'../../utils/util.js'</span>)</span><br><span class="line"><span class="keyword">const</span> &#123; $Message &#125; = <span class="built_in">require</span>(<span class="string">'../../utils/iview/base/index'</span>);</span><br><span class="line"><span class="keyword">const</span> app = getApp()</span><br><span class="line"><span class="comment">// pages/work/index.js</span></span><br><span class="line">Page(&#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">/**</span></span><br><span class="line"><span class="comment">   * 页面的初始数据</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  data: &#123;</span><br><span class="line">    work:&#123;&#125;,</span><br><span class="line">    work_id:<span class="literal">null</span>,</span><br><span class="line">    collect_status: <span class="literal">false</span>,</span><br><span class="line">    innerAudioContext:<span class="literal">null</span>,</span><br><span class="line">    time:<span class="number">0</span>,</span><br><span class="line">    duration:<span class="string">"00:00"</span>,</span><br><span class="line">    currentTime:<span class="string">'00:00'</span>,</span><br><span class="line">    paly_status:<span class="literal">false</span></span><br><span class="line">  &#125;,</span><br><span class="line">  </span><br><span class="line">  <span class="comment">/**</span></span><br><span class="line"><span class="comment">   * 根据id获取作品</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  getWork(id=<span class="number">3</span>,seek=<span class="number">0</span>,auto=<span class="literal">true</span>)&#123;</span><br><span class="line">    utils.wxRequest(<span class="string">`/work/<span class="subst">$&#123;id&#125;</span>`</span>,&#123;</span><br><span class="line">      query: &#123;</span><br><span class="line">        qiniu:<span class="literal">true</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">      .then(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">          work:res.data</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">          time: res.data.time,</span><br><span class="line">          duration: res.data.formatTime</span><br><span class="line">        &#125;)</span><br><span class="line">        <span class="comment">// const audioCtx = wx.createAudioContext('myAudio')</span></span><br><span class="line">        <span class="comment">// audioCtx.play()</span></span><br><span class="line">        <span class="keyword">this</span>.handleAudio(seek,auto)</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">/**</span></span><br><span class="line"><span class="comment">   * 格式化事件</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  formatTime(cellValue)&#123;</span><br><span class="line">    <span class="keyword">if</span> (cellValue)&#123;</span><br><span class="line">      <span class="keyword">let</span> hour = <span class="built_in">parseInt</span>(cellValue / <span class="number">3600</span>)</span><br><span class="line">      <span class="keyword">let</span> min = <span class="built_in">parseInt</span>((cellValue - hour * <span class="number">3600</span>) / <span class="number">60</span>)</span><br><span class="line">      min = min &lt; <span class="number">10</span> ? <span class="string">'0'</span> + min : min</span><br><span class="line">      <span class="keyword">let</span> sec = <span class="built_in">parseInt</span>(cellValue % <span class="number">60</span>)</span><br><span class="line">      sec = sec &lt; <span class="number">10</span> ? <span class="string">'0'</span> + sec : sec</span><br><span class="line">      <span class="keyword">if</span> (hour &gt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> hour + <span class="string">':'</span> + min + <span class="string">':'</span> + sec</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">return</span> min + <span class="string">':'</span> + sec</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">/**</span></span><br><span class="line"><span class="comment">   * 播放音频</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  handleAudio(seek=<span class="number">0</span>,auto=<span class="literal">true</span>)&#123;</span><br><span class="line">    <span class="keyword">const</span> that=<span class="keyword">this</span></span><br><span class="line">    <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">      innerAudioContext: wx.createInnerAudioContext()</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.seek(seek)</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.src = <span class="keyword">this</span>.data.work.audio[<span class="number">0</span>].url</span><br><span class="line">    <span class="keyword">if</span>(auto)&#123;</span><br><span class="line">      <span class="keyword">this</span>.data.innerAudioContext.autoplay = <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.onPlay(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">      that.setData(&#123;</span><br><span class="line">        paly_status:<span class="literal">true</span></span><br><span class="line">      &#125;)</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 class="keyword">this</span>.data.innerAudioContext.onTimeUpdate(<span class="function"><span class="params">()</span>=&gt;</span>&#123;</span><br><span class="line">      that.setData(&#123;</span><br><span class="line">        currentTime: that.formatTime(that.data.innerAudioContext.currentTime)</span><br><span class="line">      &#125;)</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.onError(<span class="function">(<span class="params">res</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="built_in">console</span>.log(res.errMsg)</span><br><span class="line">      <span class="built_in">console</span>.log(res.errCode)</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">/**</span></span><br><span class="line"><span class="comment">   * 播放</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  play()&#123;</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.play()</span><br><span class="line">    <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">      paly_status: <span class="literal">true</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="comment">/**</span></span><br><span class="line"><span class="comment">   * 停止</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  stop()&#123;</span><br><span class="line">    <span class="keyword">this</span>.data.innerAudioContext.pause()</span><br><span class="line">    <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">      paly_status: <span class="literal">false</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="comment">/**</span></span><br><span class="line"><span class="comment">   * 获取收藏状态</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  getCollectByUser(id) &#123;</span><br><span class="line">    utils.wxRequest(<span class="string">`/user/collect/<span class="subst">$&#123;id&#125;</span>`</span>, &#123;</span><br><span class="line">      method: <span class="string">'GET'</span>,</span><br><span class="line">      header: &#123;</span><br><span class="line">        Authorization: <span class="string">'Bearer '</span> + app.globalData.token</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;).then(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> (res.collect == <span class="literal">true</span>) &#123;</span><br><span class="line">        <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">          collect_status: <span class="literal">true</span></span><br><span class="line">        &#125;)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;).catch(<span class="function"><span class="params">err</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="built_in">console</span>.log(err)</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">/**</span></span><br><span class="line"><span class="comment">   * 收藏操作</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  handleCollect()&#123;</span><br><span class="line">    utils.wxRequest(<span class="string">'/user/collect'</span>, &#123;</span><br><span class="line">      method: <span class="string">'POST'</span>,</span><br><span class="line">      query: &#123;</span><br><span class="line">        work_id: <span class="keyword">this</span>.data.work.id,</span><br><span class="line">        collect: <span class="keyword">this</span>.data.collect_status</span><br><span class="line">      &#125;,</span><br><span class="line">      header: &#123;</span><br><span class="line">        Authorization: <span class="string">'Bearer '</span> + app.globalData.token</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;).then(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">        collect_status: !<span class="keyword">this</span>.data.collect_status</span><br><span class="line">      &#125;)</span><br><span class="line">      $Message(&#123;</span><br><span class="line">        content: res.message,</span><br><span class="line">        duration: <span class="number">1</span>,</span><br><span class="line">        type: <span class="string">'success'</span></span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;).catch(<span class="function"><span class="params">err</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="built_in">console</span>.log(err)</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">/**</span></span><br><span class="line"><span class="comment">   * 后台播放</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  playBackground()&#123;</span><br><span class="line">    wx.setStorageSync(<span class="string">'work_id'</span>, <span class="keyword">this</span>.data.work_id)</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.data.innerAudioContext.paused == <span class="literal">false</span>) &#123;</span><br><span class="line">      <span class="keyword">this</span>.data.innerAudioContext.destroy()</span><br><span class="line">      <span class="keyword">const</span> backgroundAudioManager = wx.getBackgroundAudioManager()</span><br><span class="line"></span><br><span class="line">      backgroundAudioManager.title = <span class="keyword">this</span>.data.work.title</span><br><span class="line">      backgroundAudioManager.epname = <span class="keyword">this</span>.data.work.title</span><br><span class="line">      backgroundAudioManager.singer = <span class="keyword">this</span>.data.work.author.name</span><br><span class="line">      backgroundAudioManager.startTime = <span class="keyword">this</span>.data.innerAudioContext.currentTime</span><br><span class="line">      backgroundAudioManager.coverImgUrl = <span class="keyword">this</span>.data.work.author.avatar[<span class="number">0</span>].url</span><br><span class="line">      <span class="comment">// 设置了 src 之后会自动播放</span></span><br><span class="line">      backgroundAudioManager.src = <span class="keyword">this</span>.data.work.audio[<span class="number">0</span>].url</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">/**</span></span><br><span class="line"><span class="comment">   * 生命周期函数--监听页面加载</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onLoad: <span class="function"><span class="keyword">function</span> (<span class="params">options</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.setData(&#123;</span><br><span class="line">      work_id: options.id</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">/**</span></span><br><span class="line"><span class="comment">   * 生命周期函数--监听页面初次渲染完成</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onReady: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.getCollectByUser(<span class="keyword">this</span>.data.work_id)</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="comment">   * 生命周期函数--监听页面显示</span></span><br><span class="line"><span class="comment">   * 根据storge判断work_id是否相同,再根据后台播放状态判断</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onShow: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> work_id = wx.getStorageSync(<span class="string">'work_id'</span>)||<span class="literal">null</span></span><br><span class="line">    <span class="keyword">if</span>(work_id!=<span class="literal">null</span> &amp;&amp; work_id==<span class="keyword">this</span>.data.work_id)&#123;</span><br><span class="line">      <span class="keyword">const</span> backgroundAudioManager = wx.getBackgroundAudioManager()</span><br><span class="line">      <span class="keyword">if</span> (backgroundAudioManager.paused==<span class="literal">false</span>)&#123;</span><br><span class="line">        backgroundAudioManager.pause()</span><br><span class="line">        <span class="keyword">this</span>.getWork(<span class="keyword">this</span>.data.work_id, backgroundAudioManager.currentTime)</span><br><span class="line">      &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.getWork(<span class="keyword">this</span>.data.work_id)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">      wx.pauseBackgroundAudio()</span><br><span class="line">      <span class="keyword">this</span>.getWork(<span class="keyword">this</span>.data.work_id)</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">/**</span></span><br><span class="line"><span class="comment">   * 生命周期函数--监听页面隐藏</span></span><br><span class="line"><span class="comment">   * 根据audio播放状态去启动后台播放</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onHide: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.playBackground()</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="comment">   * 根据audio播放状态去启动后台播放</span></span><br><span class="line"><span class="comment">   * 生命周期函数--监听页面卸载</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onUnload: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.playBackground()</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="comment">   * 页面相关事件处理函数--监听用户下拉动作</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onPullDownRefresh: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line"></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="comment">   * 页面上拉触底事件的处理函数</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onReachBottom: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line"></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="comment">   * 用户点击右上角分享</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  onShareAppMessage: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line"></span><br><span class="line">  &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="实际效果"><a href="#实际效果" class="headerlink" title="实际效果"></a>实际效果</h3><p><img src="/images/1421557306396_.pic_hd.jpg" width="50%" hegiht="50%" align="center"></p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ol><li><a href="https://developers.weixin.qq.com/miniprogram/dev/api/" target="_blank" rel="noopener">微信小程序</a></li><li><a href="http://es6.ruanyifeng.com/#docs/promise" target="_blank" rel="noopener">ECMAScript 6 入门</a></li></ol>]]></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;p&gt;微信小程序目前建议要使用音频的功能，推荐使用通过wx.createInnerAudioContext()创建内部 audio 上下文 InnerAudioContext 对象。&lt;/p&gt;
&lt;figure class=&quot;highlight js&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;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&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;&amp;lt;!--seek：跳转的位置，auto: 是否自动播放--&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;handleAudio(seek=&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;,auto=&lt;span class=&quot;literal&quot;&gt;true&lt;/span&gt;)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; that=&lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.setData(&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      innerAudioContext: wx.createInnerAudioContext()&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.data.innerAudioContext.seek(seek)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;lt;!--这里的url指的是音频的地址--&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.data.innerAudioContext.src = url&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;(auto)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.data.innerAudioContext.autoplay = &lt;span class=&quot;literal&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.data.innerAudioContext.onPlay(&lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;params&quot;&gt;()&lt;/span&gt; =&amp;gt;&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(&lt;span class=&quot;string&quot;&gt;&#39;开始播放&#39;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.data.innerAudioContext.onTimeUpdate(&lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;params&quot;&gt;()&lt;/span&gt;=&amp;gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &amp;lt;!--持续更新已播放的进度--&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      that.setData(&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        currentTime: that.formatTime(that.data.innerAudioContext.currentTime)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.data.innerAudioContext.onError(&lt;span class=&quot;function&quot;&gt;(&lt;span class=&quot;params&quot;&gt;res&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(res.errMsg)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(res.errCode)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;接着在页面生命周期onReady里使用wx.request的success里去调用handleAudio函数。&lt;br&gt;
    
    </summary>
    
      <category term="微信小程序" scheme="http://blog.ivanweb.cn/categories/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    
      <category term="微信小程序" scheme="http://blog.ivanweb.cn/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
  </entry>
  
  <entry>
    <title>javascript中浅拷贝和深拷贝</title>
    <link href="http://blog.ivanweb.cn/2018/08/02/javascript%E4%B8%AD%E6%B5%85%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B7%B1%E6%8B%B7%E8%B4%9D/"/>
    <id>http://blog.ivanweb.cn/2018/08/02/javascript中浅拷贝和深拷贝/</id>
    <published>2018-08-02T03:50:16.000Z</published>
    <updated>2018-08-16T05:59:09.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="javascript的变量类型"><a href="#javascript的变量类型" class="headerlink" title="javascript的变量类型"></a>javascript的变量类型</h4><ol><li><p><strong>基本类型</strong>：存放在栈内存中的简单数据段，数据大小确定，内存空间大小可以分配。<br> 5种基本数据类型有Undefined、Null、Boolean、Number 和 String，它们是直接按值存放的，所以可以直接访问。</p></li><li><p><strong>引用类型</strong>：存放在堆内存中的对象，变量实际保存的是一个内存地址，这个内存地址指向另一个内存空间。每个空间大小不一样，要根据情况开进行特定的分配。<br> 当我们需要访问引用类型（如对象，数组，函数等）的值时，首先从栈中获得该对象的内存地址，然后再从堆内存中取得所需的数据。</p></li></ol><blockquote><p>javascript存储对象都是存地址的，所以浅拷贝会导致 arr1 和arr2 指向同一块内存地址。改变了其中一方的内容，都是在原来的内存上做修改会导致拷贝对象和源对象都发生改变，而深拷贝是开辟一块新的内存地址，将原对象的各个属性逐个复制进去。对拷贝对象和源对象各自的操作互不影响。</p></blockquote><p>例如：数组拷贝</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//浅拷贝，双向改变,指向同一片内存空间</span><br><span class="line">var arr1 = [1, 2, 3];</span><br><span class="line">var arr2 = arr1;</span><br><span class="line">arr1[0] = &apos;2&apos;;</span><br><span class="line">console.log(arr1); //2,2,3</span><br><span class="line">console.log(arr2); //2,2,3</span><br></pre></td></tr></table></figure><a id="more"></a><h4 id="浅拷贝"><a href="#浅拷贝" class="headerlink" title="浅拷贝"></a>浅拷贝</h4><h5 id="简单的引用复制"><a href="#简单的引用复制" class="headerlink" title="简单的引用复制"></a>简单的引用复制</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">var a = &#123;</span><br><span class="line">  key1: &quot;11111&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function Copy(p) &#123;</span><br><span class="line">  var c = &#123;&#125;;</span><br><span class="line">  for (var i in p) &#123;　</span><br><span class="line">    c[i] = p[i];</span><br><span class="line">  &#125;</span><br><span class="line">  return c;</span><br><span class="line">&#125;</span><br><span class="line">a.key2 = [&apos;小辉&apos;, &apos;小辉&apos;];</span><br><span class="line">var b = Copy(a);</span><br><span class="line">b.key2.push(&quot;大辉&quot;);</span><br><span class="line">console.log(b.key2); //小辉，小辉，大辉</span><br><span class="line">console.log(a.key2); //小辉，小辉，大辉</span><br></pre></td></tr></table></figure><p>a对象中key1属性是字符串，key2属性是数组。a拷贝到b，key1、key2属性均顺利拷贝。给b对象的key2属性进行修改时，a对象的key2属性也会随之改变。说明a，b对象上的key2属性指向的是同一个内存地址（x1），当对b对象的key2属性进行修改时，实际上是修改的x1指向的内存空间。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">b.key1 = 1;</span><br><span class="line">console.log(b.key1);    //1</span><br><span class="line">console.log(1.key1);    //11111</span><br></pre></td></tr></table></figure><p>给b对象的key1属性进行修改时，a对象的key1属性不会改变。这是由于a，b对象的key1属性都是基本数据类型，会直接存储在内存中，b对象的key1的修改不会对a对象的key1产生影响。其在内存的状态，可以用下图来表示。<br><img src="/images/707050-20151016111840835-246542666-min.png" alt=""></p><h4 id="深拷贝"><a href="#深拷贝" class="headerlink" title="深拷贝"></a>深拷贝</h4><h5 id="递归遍历"><a href="#递归遍历" class="headerlink" title="递归遍历"></a>递归遍历</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">function deepCopy(p, c) &#123;</span><br><span class="line">  var c = c || &#123;&#125;;</span><br><span class="line">  for (var i in p) &#123;</span><br><span class="line">    if (typeof p[i] === &apos;object&apos;) &#123;　　</span><br><span class="line">      c[i] = (p[i].constructor === Array) ? [] : &#123;&#125;;</span><br><span class="line">      deepCopy(p[i], c[i]);　　</span><br><span class="line">    &#125; else &#123;　　　　　</span><br><span class="line">      c[i] = p[i];　　</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  return c;　　</span><br><span class="line">&#125;</span><br><span class="line">a.key2 = [&apos;小辉&apos;, &apos;小辉&apos;];</span><br><span class="line">var b = &#123;&#125;;</span><br><span class="line">b = deepCopy(a, b);</span><br><span class="line">b.key2.push(&quot;大辉&quot;);</span><br><span class="line">alert(b.key2); //小辉，小辉，大辉</span><br><span class="line">alert(a.key2); //小辉，小辉</span><br></pre></td></tr></table></figure><p>由上可知，修改b的key2数组时，没有使a父对象中的key2数组新增一个值，即子对象没有影响到父对象a中的key2。其存储模式大致如下：<br><img src="/images/707050-20151016111841382-832700870-min.png" alt=""></p><h5 id="Array的slice和concat方法"><a href="#Array的slice和concat方法" class="headerlink" title="Array的slice和concat方法"></a>Array的slice和concat方法</h5><p>Array的slice和concat方法不修改原数组，只会返回一个浅复制了原数组中的元素的一个新数组。之所以把它放在深拷贝里，是因为它看起来像是深拷贝。而实际上它是浅拷贝。原数组的元素会按照下述规则拷贝：</p><ul><li>如果该元素是个对象引用 （不是实际的对象），slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变，则新的和原来的数组中的这个元素也会发生改变。</li><li>对于字符串、数字及布尔值来说（不是 String、Number 或者 Boolean 对象），slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值，将不会影响另一个数组。</li></ul><p>例子如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">var array = [1,2,3]; </span><br><span class="line">var array_shallow = array; </span><br><span class="line">var array_concat = array.concat(); </span><br><span class="line">var array_slice = array.slice(0); </span><br><span class="line">console.log(array === array_shallow); //true </span><br><span class="line">console.log(array === array_slice); //false，“看起来”像深拷贝</span><br><span class="line">console.log(array === array_concat); //false，“看起来”像深拷贝</span><br></pre></td></tr></table></figure><p>可以看出，concat和slice返回的不同的数组实例，这与直接的引用复制是不同的。而从另一个例子可以看出Array的concat和slice并不是真正的深复制，数组中的对象元素(Object,Array等)只是复制了引用。如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">var array = [1, [1,2,3], &#123;name:&quot;array&quot;&#125;]; </span><br><span class="line">var array_concat = array.concat();</span><br><span class="line">var array_slice = array.slice(0);</span><br><span class="line">array_concat[1][0] = 5;  //改变array_concat中数组元素的值 </span><br><span class="line">console.log(array[1]); //[5,2,3] </span><br><span class="line">console.log(array_slice[1]); //[5,2,3] </span><br><span class="line">array_slice[2].name = &quot;array_slice&quot;; //改变array_slice中对象元素的值 </span><br><span class="line">console.log(array[2].name); //array_slice</span><br><span class="line">console.log(array_concat[2].name); //array_slice</span><br></pre></td></tr></table></figure><h5 id="JSON对象的parse和stringify"><a href="#JSON对象的parse和stringify" class="headerlink" title="JSON对象的parse和stringify"></a>JSON对象的parse和stringify</h5><p>JSON对象是ES5中引入的新的类型（支持的浏览器为IE8+），JSON对象parse方法可以将JSON字符串反序列化成JS对象，stringify方法可以将JS对象序列化成JSON字符串，借助这两个方法，也可以实现对象的深拷贝。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">//例1</span><br><span class="line">var source = &#123; name:&quot;source&quot;, child:&#123; name:&quot;child&quot; &#125; &#125; </span><br><span class="line">var target = JSON.parse(JSON.stringify(source));</span><br><span class="line">target.name = &quot;target&quot;;  //改变target的name属性</span><br><span class="line">console.log(source.name); //source </span><br><span class="line">console.log(target.name); //target</span><br><span class="line">target.child.name = &quot;target child&quot;; //改变target的child </span><br><span class="line">console.log(source.child.name); //child </span><br><span class="line">console.log(target.child.name); //target child</span><br><span class="line"></span><br><span class="line">//例2</span><br><span class="line">var source = &#123; name:function()&#123;console.log(1);&#125;, child:&#123; name:&quot;child&quot; &#125; &#125; </span><br><span class="line">var target = JSON.parse(JSON.stringify(source));</span><br><span class="line">console.log(target.name); //undefined</span><br><span class="line"></span><br><span class="line">//例3</span><br><span class="line">var source = &#123; name:function()&#123;console.log(1);&#125;, child:new RegExp(&quot;e&quot;) &#125;</span><br><span class="line">var target = JSON.parse(JSON.stringify(source));</span><br><span class="line">console.log(target.name); //undefined</span><br><span class="line">console.log(target.child); //Object &#123;&#125;</span><br></pre></td></tr></table></figure><p>这种方法使用较为简单，可以满足基本的深拷贝需求，而且能够处理JSON格式能表示的所有数据类型，但是对于正则表达式类型、函数类型等无法进行深拷贝(而且会直接丢失相应的值)。</p>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;javascript的变量类型&quot;&gt;&lt;a href=&quot;#javascript的变量类型&quot; class=&quot;headerlink&quot; title=&quot;javascript的变量类型&quot;&gt;&lt;/a&gt;javascript的变量类型&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;基本类型&lt;/strong&gt;：存放在栈内存中的简单数据段，数据大小确定，内存空间大小可以分配。&lt;br&gt; 5种基本数据类型有Undefined、Null、Boolean、Number 和 String，它们是直接按值存放的，所以可以直接访问。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;引用类型&lt;/strong&gt;：存放在堆内存中的对象，变量实际保存的是一个内存地址，这个内存地址指向另一个内存空间。每个空间大小不一样，要根据情况开进行特定的分配。&lt;br&gt; 当我们需要访问引用类型（如对象，数组，函数等）的值时，首先从栈中获得该对象的内存地址，然后再从堆内存中取得所需的数据。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;javascript存储对象都是存地址的，所以浅拷贝会导致 arr1 和arr2 指向同一块内存地址。改变了其中一方的内容，都是在原来的内存上做修改会导致拷贝对象和源对象都发生改变，而深拷贝是开辟一块新的内存地址，将原对象的各个属性逐个复制进去。对拷贝对象和源对象各自的操作互不影响。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例如：数组拷贝&lt;/p&gt;
&lt;figure class=&quot;highlight plain&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&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;var arr1 = [1, 2, 3];&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;var arr2 = arr1;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;arr1[0] = &amp;apos;2&amp;apos;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;console.log(arr1); //2,2,3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;console.log(arr2); //2,2,3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="javascript" scheme="http://blog.ivanweb.cn/categories/javascript/"/>
    
    
      <category term="javascript" scheme="http://blog.ivanweb.cn/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>浏览器的多个选项卡中共享sessionStorage</title>
    <link href="http://blog.ivanweb.cn/2018/06/22/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E5%A4%9A%E4%B8%AA%E9%80%89%E9%A1%B9%E5%8D%A1%E4%B8%AD%E5%85%B1%E4%BA%ABsessionStorage/"/>
    <id>http://blog.ivanweb.cn/2018/06/22/浏览器的多个选项卡中共享sessionStorage/</id>
    <published>2018-06-22T06:47:56.000Z</published>
    <updated>2018-08-02T04:02:52.000Z</updated>
    
    <content type="html"><![CDATA[<p>原文：<a href="https://blog.guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/" target="_blank" rel="noopener">Sharing sessionStorage between tabs for secure multi-tab authentication</a></p><h4 id="使用场景"><a href="#使用场景" class="headerlink" title="使用场景"></a>使用场景</h4><p>在web项目中，当用户重开一个标签页的时候，需要重新登录。造成这种情况的是登录的标识符存取在session中，标签页之间没有共享session数据。</p><h4 id="解决方式"><a href="#解决方式" class="headerlink" title="解决方式"></a>解决方式</h4><p>发现国外开发者解决的方式是监听storage事件，利用localStorage事件来跨标签页共享sessionStorage。<br><a href="https://blog.guya.net/security/browser_session/sessionStorage.html" target="_blank" rel="noopener">在线例子</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">// Removed IE support in this demo for the sake of simplicity</span><br><span class="line">// 移除对IE浏览器的支持</span><br><span class="line"></span><br><span class="line">(function () &#123;</span><br><span class="line"></span><br><span class="line">  if (!sessionStorage.length) &#123;</span><br><span class="line">    // Ask other tabs for session storage</span><br><span class="line">    // 新开的标签页触发这个事件</span><br><span class="line">    </span><br><span class="line">    localStorage.setItem(&apos;getSessionStorage&apos;, Date.now());</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  window.addEventListener(&apos;storage&apos;, function (event) &#123;</span><br><span class="line"></span><br><span class="line">    //console.log(&apos;storage event&apos;, event);</span><br><span class="line">    </span><br><span class="line">    if (event.key == &apos;getSessionStorage&apos;) &#123;</span><br><span class="line">      // Some tab asked for the sessionStorage -&gt; send it</span><br><span class="line">      // 已存在的标签页会接收到这个事件</span><br><span class="line">      </span><br><span class="line">      localStorage.setItem(&apos;sessionStorage&apos;, JSON.stringify(sessionStorage));</span><br><span class="line">      localStorage.removeItem(&apos;sessionStorage&apos;);</span><br><span class="line"></span><br><span class="line">    &#125; else if (event.key == &apos;sessionStorage&apos; &amp;&amp; !sessionStorage.length) &#123;</span><br><span class="line">      // sessionStorage is empty -&gt; fill it</span><br><span class="line">      // 新开启的标签页会收到这个事件</span><br><span class="line">      </span><br><span class="line">      var data = JSON.parse(event.newValue), value;</span><br><span class="line"></span><br><span class="line">      for (key in data) &#123;</span><br><span class="line">        sessionStorage.setItem(key, data[key]);</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      showSessionStorage();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;原文：&lt;a href=&quot;https://blog.guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/&quot; target=&quot;_blank&quot; re
      
    
    </summary>
    
      <category term="javascript" scheme="http://blog.ivanweb.cn/categories/javascript/"/>
    
    
      <category term="javascript" scheme="http://blog.ivanweb.cn/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>vue 提交表单后清空表单内的数据</title>
    <link href="http://blog.ivanweb.cn/2018/06/12/vue-%E6%8F%90%E4%BA%A4%E8%A1%A8%E5%8D%95%E5%90%8E%E6%B8%85%E7%A9%BA%E8%A1%A8%E5%8D%95%E5%86%85%E7%9A%84%E6%95%B0%E6%8D%AE/"/>
    <id>http://blog.ivanweb.cn/2018/06/12/vue-提交表单后清空表单内的数据/</id>
    <published>2018-06-12T07:48:18.000Z</published>
    <updated>2018-06-12T08:57:36.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h4><p>在使用vue的框架中，常常出现提交完表单之后，data对象中表单的字段的数据还是存在的，做重复表单提交的过程中不是很友好，如果两个表单中存在公用的组件（组件C），如果这个表单（表单A）的数据没有清空，再跳转到另外一个表单（表单B）的时候，表单A上的组件C上的数据会出现到表单B的组件C上。</p><h4 id="解决方式"><a href="#解决方式" class="headerlink" title="解决方式"></a>解决方式</h4><p>参考vue的API文档，<br><img src="/images/WX20180612-160019@2x-min.png" alt=""><br><a id="more"></a><br>发现我们可以通过$options获取初始化的data对象，在表单提交成功之后或者在vue生命周期的beforeDestroy、destroyed中可以通过</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">this.form=Object.assign(&#123;&#125;,this.$options.data().form)</span><br></pre></td></tr></table></figure><p>来初始化data对象的form字段。<br>具体代码如下：<br><iframe scrolling="no" width="100%" height="570" src="//jsfiddle.net/XHalso/Lhr0p5vt/embedded/js,html,css,result/dark" frameborder="0" allowfullscreen></iframe></p>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;应用场景&quot;&gt;&lt;a href=&quot;#应用场景&quot; class=&quot;headerlink&quot; title=&quot;应用场景&quot;&gt;&lt;/a&gt;应用场景&lt;/h4&gt;&lt;p&gt;在使用vue的框架中，常常出现提交完表单之后，data对象中表单的字段的数据还是存在的，做重复表单提交的过程中不是很友好，如果两个表单中存在公用的组件（组件C），如果这个表单（表单A）的数据没有清空，再跳转到另外一个表单（表单B）的时候，表单A上的组件C上的数据会出现到表单B的组件C上。&lt;/p&gt;
&lt;h4 id=&quot;解决方式&quot;&gt;&lt;a href=&quot;#解决方式&quot; class=&quot;headerlink&quot; title=&quot;解决方式&quot;&gt;&lt;/a&gt;解决方式&lt;/h4&gt;&lt;p&gt;参考vue的API文档，&lt;br&gt;&lt;img src=&quot;/images/WX20180612-160019@2x-min.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;
    
    </summary>
    
      <category term="vue" scheme="http://blog.ivanweb.cn/categories/vue/"/>
    
    
      <category term="vue" scheme="http://blog.ivanweb.cn/tags/vue/"/>
    
  </entry>
  
  <entry>
    <title>vue项目中常见的坑</title>
    <link href="http://blog.ivanweb.cn/2018/05/03/vue%E9%A1%B9%E7%9B%AE%E4%B8%AD%E5%B8%B8%E8%A7%81%E7%9A%84%E5%9D%91/"/>
    <id>http://blog.ivanweb.cn/2018/05/03/vue项目中常见的坑/</id>
    <published>2018-05-03T10:24:27.000Z</published>
    <updated>2018-05-07T08:44:52.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="本地运行跨域问题"><a href="#本地运行跨域问题" class="headerlink" title="本地运行跨域问题"></a>本地运行跨域问题</h4><p>通过webpack-dev-server的proxy来解决api接口请求跨域的问题，在dev的index.js文件中，设置proxy</p><figure class="highlight bash"><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">proxyTable: &#123;</span><br><span class="line">  <span class="string">'/api'</span>: &#123;</span><br><span class="line">    target: <span class="string">'http://baidu.com/'</span>,</span><br><span class="line">    changeOrigin: <span class="literal">true</span>,</span><br><span class="line">    pathRewrite: &#123;</span><br><span class="line">      <span class="string">'^/api'</span>: <span class="string">'/'</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>在axios的中设置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">axios.defaults.baseURL = <span class="string">"/api"</span>;</span><br></pre></td></tr></table></figure><a id="more"></a><h4 id="vue"><a href="#vue" class="headerlink" title="vue"></a>vue</h4><h6 id="操作DOM"><a href="#操作DOM" class="headerlink" title="操作DOM"></a>操作DOM</h6><p>在created()钩子函数执行的时候进行的DOM操作，发现并未进行任何渲染，在查看Vue官方文档中，发现可以在Vue生命周期的created()钩子函数中通过在Vue.nextTick()的回调函数中进行的DOM操作，或者在mounted钩子函数直接进行DOM操作</p><h4 id="element-ui"><a href="#element-ui" class="headerlink" title="element ui"></a>element ui</h4><h6 id="Table"><a href="#Table" class="headerlink" title="Table"></a>Table</h6><p>在element ui的table中，如果想去修改某一行的数据，如果直接将它复制给data对象里的一个属性，当修改某个字段时，会发现table里对应某行字段的数据也会发生改变，产生的原因时一个objec引用类型共享一个内存区域的，所以我们就不能直接连等复制，需要重新指向一个新的引用</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">//赋值对象是一个object</span><br><span class="line">this.objData=Object.assign(&#123;&#125;, row)</span><br><span class="line">或</span><br><span class="line">this.objData=&#123;...row&#125;</span><br><span class="line"></span><br><span class="line">//赋值对象是一个array</span><br><span class="line">newArray = oldArray.slice()</span><br><span class="line">或</span><br><span class="line">newArray = oldArray.concat()</span><br><span class="line">或</span><br><span class="line">newArray = [...oldArray]</span><br></pre></td></tr></table></figure><p>el-table-column中格式化数据，可以通过formatter属性来绑定一个方法去写格式化数据，或者vue的计算属性computed</p><p>在每个el-table-column中通过设置min-width来适应不同大小的屏幕</p><h6 id="input"><a href="#input" class="headerlink" title="input"></a>input</h6><p>在el-input中通过添加.native 修饰符来触发input的原生事件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;el-input @click.native=&quot;handlenClick&quot;&gt;Click Me&lt;/el-input&gt;</span><br></pre></td></tr></table></figure><h6 id="修改element样式"><a href="#修改element样式" class="headerlink" title="修改element样式"></a>修改element样式</h6><p>可以通过新建一个样式文件，在mian.js里引入</p><h4 id="mint-ui"><a href="#mint-ui" class="headerlink" title="mint ui"></a>mint ui</h4><h6 id="Message-box"><a href="#Message-box" class="headerlink" title="Message box"></a>Message box</h6><p>在用户的反馈中，ios8.1.2的微信浏览器中会出现提示框出现偏离的状况，修复问题中发现.mint-msgbox的样式中transform: translate3d(-50%,-50%,0);没有起作用，通过引入全局样式</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">.mint-msgbox&#123;</span><br><span class="line">  max-width: 84%;</span><br><span class="line">  top: 35%;</span><br><span class="line">  left: 8%;</span><br><span class="line">  -webkit-transform: translate3d(0, 0, 0);</span><br><span class="line">  transform: translate3d(0, 0, 0);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h6 id="微信JSSDK签名出错"><a href="#微信JSSDK签名出错" class="headerlink" title="微信JSSDK签名出错"></a>微信JSSDK签名出错</h6><p>在vue-router的对象实例中设置了mode: ‘history’，会在使用this.$router.push跳转需要调用微信JSSDK的页面中，会签名出错，解决的方式有</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//方案一</span><br><span class="line">通过location.href来跳转需要调用微信JSSDK的页面</span><br><span class="line">//方案二</span><br><span class="line">vue-router使用hash模式</span><br></pre></td></tr></table></figure><h6 id="在真机上进行调试"><a href="#在真机上进行调试" class="headerlink" title="在真机上进行调试"></a>在真机上进行调试</h6><p>通过在main.js引入vConsole.js来查看api接口请求的数据</p>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;本地运行跨域问题&quot;&gt;&lt;a href=&quot;#本地运行跨域问题&quot; class=&quot;headerlink&quot; title=&quot;本地运行跨域问题&quot;&gt;&lt;/a&gt;本地运行跨域问题&lt;/h4&gt;&lt;p&gt;通过webpack-dev-server的proxy来解决api接口请求跨域的问题，在dev的index.js文件中，设置proxy&lt;/p&gt;
&lt;figure class=&quot;highlight bash&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;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&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;proxyTable: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;string&quot;&gt;&#39;/api&#39;&lt;/span&gt;: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    target: &lt;span class=&quot;string&quot;&gt;&#39;http://baidu.com/&#39;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    changeOrigin: &lt;span class=&quot;literal&quot;&gt;true&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    pathRewrite: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;string&quot;&gt;&#39;^/api&#39;&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;&#39;/&#39;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;,&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;在axios的中设置&lt;/p&gt;
&lt;figure class=&quot;highlight bash&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;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;axios.defaults.baseURL = &lt;span class=&quot;string&quot;&gt;&quot;/api&quot;&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="http://blog.ivanweb.cn/categories/vue/"/>
    
    
      <category term="vue" scheme="http://blog.ivanweb.cn/tags/vue/"/>
    
  </entry>
  
  <entry>
    <title>安装NPM registry管理工具--nrm</title>
    <link href="http://blog.ivanweb.cn/2018/04/18/%E5%AE%89%E8%A3%85NPM-registry%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7-nrm/"/>
    <id>http://blog.ivanweb.cn/2018/04/18/安装NPM-registry管理工具-nrm/</id>
    <published>2018-04-18T14:52:06.000Z</published>
    <updated>2018-04-18T15:01:51.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装nrm"><a href="#安装nrm" class="headerlink" title="安装nrm"></a>安装<a href="https://github.com/Pana/nrm" target="_blank" rel="noopener">nrm</a></h2><p>开发的npm registry 管理工具 nrm,  能够查看和切换当前使用的registry。<a href="https://github.com/Pana/nrm" target="_blank" rel="noopener">github</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install -g nrm</span><br></pre></td></tr></table></figure><h2 id="查看当前使用的NPM-registry"><a href="#查看当前使用的NPM-registry" class="headerlink" title="查看当前使用的NPM registry"></a>查看当前使用的NPM registry</h2><figure class="highlight bash"><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">$ nrm ls</span><br><span class="line"></span><br><span class="line">* npm ---- https://registry.npmjs.org/</span><br><span class="line">  cnpm --- http://r.cnpmjs.org/</span><br><span class="line">  taobao - https://registry.npm.taobao.org/</span><br><span class="line">  nj ----- https://registry.nodejitsu.com/</span><br><span class="line">  rednpm - http://registry.mirror.cqupt.edu.cn/</span><br><span class="line">  npmMirror  https://skimdb.npmjs.com/registry/</span><br><span class="line">  edunpm - http://registry.enpmjs.org/</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="切换NPM-registry"><a href="#切换NPM-registry" class="headerlink" title="切换NPM registry"></a>切换NPM registry</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ nrm use cnpm</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;安装nrm&quot;&gt;&lt;a href=&quot;#安装nrm&quot; class=&quot;headerlink&quot; title=&quot;安装nrm&quot;&gt;&lt;/a&gt;安装&lt;a href=&quot;https://github.com/Pana/nrm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;nrm&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;开发的npm registry 管理工具 nrm,  能够查看和切换当前使用的registry。&lt;a href=&quot;https://github.com/Pana/nrm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github&lt;/a&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight bash&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;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;$ npm install -g nrm&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h2 id=&quot;查看当前使用的NPM-registry&quot;&gt;&lt;a href=&quot;#查看当前使用的NPM-registry&quot; class=&quot;headerlink&quot; title=&quot;查看当前使用的NPM registry&quot;&gt;&lt;/a&gt;查看当前使用的NPM registry&lt;/h2&gt;&lt;figure class=&quot;highlight bash&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;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&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;$ nrm ls&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;* npm ---- https://registry.npmjs.org/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  cnpm --- http://r.cnpmjs.org/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  taobao - https://registry.npm.taobao.org/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  nj ----- https://registry.nodejitsu.com/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  rednpm - http://registry.mirror.cqupt.edu.cn/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  npmMirror  https://skimdb.npmjs.com/registry/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  edunpm - http://registry.enpmjs.org/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Mac" scheme="http://blog.ivanweb.cn/categories/Mac/"/>
    
      <category term="node" scheme="http://blog.ivanweb.cn/categories/Mac/node/"/>
    
    
      <category term="Mac" scheme="http://blog.ivanweb.cn/tags/Mac/"/>
    
      <category term="node" scheme="http://blog.ivanweb.cn/tags/node/"/>
    
  </entry>
  
  <entry>
    <title>Mac 通过brew安装指定版本的node</title>
    <link href="http://blog.ivanweb.cn/2018/04/18/Mac-%E9%80%9A%E8%BF%87brew%E5%AE%89%E8%A3%85%E6%8C%87%E5%AE%9A%E7%89%88%E6%9C%AC%E7%9A%84node/"/>
    <id>http://blog.ivanweb.cn/2018/04/18/Mac-通过brew安装指定版本的node/</id>
    <published>2018-04-18T10:35:22.000Z</published>
    <updated>2018-04-18T15:01:51.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装NVM"><a href="#安装NVM" class="headerlink" title="安装NVM"></a>安装<a href="https://github.com/creationix/nvm" target="_blank" rel="noopener">NVM</a></h2><p>前提是安装了homebrew</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install nvm</span><br></pre></td></tr></table></figure><p>在终端中输入以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ vim ~/.zshrc</span><br></pre></td></tr></table></figure><p>然后添加以下命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">export NVM_DIR=&quot;$HOME/.nvm&quot;</span><br><span class="line">. &quot;/usr/local/opt/nvm/nvm.sh&quot;</span><br></pre></td></tr></table></figure><p>最后推出vim，输入以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="使用nvm安装指定版本的node"><a href="#使用nvm安装指定版本的node" class="headerlink" title="使用nvm安装指定版本的node"></a>使用nvm安装指定版本的node</h2><figure class="highlight bash"><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">$ nvm ls-remote 查看 所有的node可用版本</span><br><span class="line"></span><br><span class="line">$ nvm install 8.9.4 下载你想要的版本,这里的8.9.4指的是node的版本</span><br><span class="line"></span><br><span class="line">$ nvm use 8.9.4 使用指定版本的node </span><br><span class="line"></span><br><span class="line">$ nvm <span class="built_in">alias</span> default 8.9.4 每次启动终端都使用该版本的node</span><br></pre></td></tr></table></figure><h2 id="查看你的node和npm的版本"><a href="#查看你的node和npm的版本" class="headerlink" title="查看你的node和npm的版本"></a>查看你的node和npm的版本</h2><figure class="highlight bash"><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">$ node -v</span><br><span class="line"></span><br><span class="line">$ npm -v</span><br></pre></td></tr></table></figure><h2 id="查看npm全局安装的modules-模块"><a href="#查看npm全局安装的modules-模块" class="headerlink" title="查看npm全局安装的modules(模块)"></a>查看npm全局安装的modules(模块)</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm list --depth=0 -global</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;安装NVM&quot;&gt;&lt;a href=&quot;#安装NVM&quot; class=&quot;headerlink&quot; title=&quot;安装NVM&quot;&gt;&lt;/a&gt;安装&lt;a href=&quot;https://github.com/creationix/nvm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;NVM&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前提是安装了homebrew&lt;/p&gt;
&lt;figure class=&quot;highlight bash&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;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;$ brew install nvm&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;在终端中输入以下命令&lt;/p&gt;
&lt;figure class=&quot;highlight bash&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;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;$ vim ~/.zshrc&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;然后添加以下命令&lt;/p&gt;
&lt;figure class=&quot;highlight plain&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;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;export NVM_DIR=&amp;quot;$HOME/.nvm&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;. &amp;quot;/usr/local/opt/nvm/nvm.sh&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;最后推出vim，输入以下命令&lt;/p&gt;
&lt;figure class=&quot;highlight bash&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;/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;built_in&quot;&gt;source&lt;/span&gt; ~/.zshrc&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Mac" scheme="http://blog.ivanweb.cn/categories/Mac/"/>
    
      <category term="Homebrew" scheme="http://blog.ivanweb.cn/categories/Mac/Homebrew/"/>
    
      <category term="node" scheme="http://blog.ivanweb.cn/categories/Mac/Homebrew/node/"/>
    
    
      <category term="Mac" scheme="http://blog.ivanweb.cn/tags/Mac/"/>
    
      <category term="Homebrew" scheme="http://blog.ivanweb.cn/tags/Homebrew/"/>
    
      <category term="node" scheme="http://blog.ivanweb.cn/tags/node/"/>
    
  </entry>
  
  <entry>
    <title>Mac 程序猿软件推荐一波</title>
    <link href="http://blog.ivanweb.cn/2018/04/18/Mac-%E7%A8%8B%E5%BA%8F%E7%8C%BF%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90%E4%B8%80%E6%B3%A2/"/>
    <id>http://blog.ivanweb.cn/2018/04/18/Mac-程序猿软件推荐一波/</id>
    <published>2018-04-18T07:52:45.000Z</published>
    <updated>2018-04-18T15:01:51.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Web编程软件"><a href="#Web编程软件" class="headerlink" title="Web编程软件"></a>Web编程软件</h2><ol><li><a href="https://www.jetbrains.com/webstorm/" target="_blank" rel="noopener">WebStorm</a></li><li><a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VS Code</a></li><li><a href="https://www.sublimetext.com/" target="_blank" rel="noopener">Sublime Text</a></li></ol><p>使用过程中，我感觉WebStorm和VS Code所占用的内存差不多，但是个人认为还是WebStorm会更好一点，Sublime可以用来快速的查看代码,顺便安利一波使用命令开启VS Code和Sublime来打开项目</p><p>VS Code通过终端输入下面命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ vim ~/.zshrc</span><br></pre></td></tr></table></figure><p>在把下面命令加上</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">alias code=&apos;/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code&apos;</span><br><span class="line"></span><br><span class="line">alias subl=&quot;&apos;/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl&apos;&quot;</span><br><span class="line"></span><br><span class="line">alias nano=&quot;subl&quot;</span><br><span class="line"></span><br><span class="line">export EDITOR=&quot;subl&quot;</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="代码版本控制可视化工具"><a href="#代码版本控制可视化工具" class="headerlink" title="代码版本控制可视化工具"></a>代码版本控制可视化工具</h2><ol><li>svn: <a href="http://xclient.info/s/cornerstone.html?t=8bbf70cedb6cc547a5d1c8cfa878589cbdd51455" target="_blank" rel="noopener">Cornerstone</a></li><li>git: <a href="https://www.sourcetreeapp.com/" target="_blank" rel="noopener">Sourcetree</a></li></ol><h2 id="Homebrew"><a href="#Homebrew" class="headerlink" title="Homebrew"></a><a href="https://brew.sh/index_zh-cn" target="_blank" rel="noopener">Homebrew</a></h2><p>macOS 缺失的软件包管理器<br>打开终端输入以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ /usr/bin/ruby -e <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span></span><br></pre></td></tr></table></figure><h2 id="其他开发利器"><a href="#其他开发利器" class="headerlink" title="其他开发利器"></a>其他开发利器</h2><ol><li>终端: <a href="https://www.iterm2.com/" target="_blank" rel="noopener">iTerm</a></li><li><a href="https://www.docker.com/" target="_blank" rel="noopener">Docker</a></li><li>软件快速切换: <a href="https://www.alfredapp.com/" target="_blank" rel="noopener">Alfred</a></li><li>SSH: <a href="http://www.termius.com/" target="_blank" rel="noopener">Termius</a></li><li>视频播放器: <a href="https://lhc70000.github.io/iina/" target="_blank" rel="noopener">IINA</a></li><li>FTP: <a href="https://www.filezilla.cn/" target="_blank" rel="noopener">FileZilla</a></li><li>Mac清理软件: <a href="https://www.drcleaner.com/" target="_blank" rel="noopener">Dr. Cleaner</a></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;Web编程软件&quot;&gt;&lt;a href=&quot;#Web编程软件&quot; class=&quot;headerlink&quot; title=&quot;Web编程软件&quot;&gt;&lt;/a&gt;Web编程软件&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/webstorm/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WebStorm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sublimetext.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sublime Text&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用过程中，我感觉WebStorm和VS Code所占用的内存差不多，但是个人认为还是WebStorm会更好一点，Sublime可以用来快速的查看代码,顺便安利一波使用命令开启VS Code和Sublime来打开项目&lt;/p&gt;
&lt;p&gt;VS Code通过终端输入下面命令&lt;/p&gt;
&lt;figure class=&quot;highlight bash&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;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;$ vim ~/.zshrc&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;在把下面命令加上&lt;/p&gt;
&lt;figure class=&quot;highlight plain&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;span class=&quot;line&quot;&gt;7&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;alias code=&amp;apos;/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code&amp;apos;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;alias subl=&amp;quot;&amp;apos;/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl&amp;apos;&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;alias nano=&amp;quot;subl&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;export EDITOR=&amp;quot;subl&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Mac" scheme="http://blog.ivanweb.cn/categories/Mac/"/>
    
      <category term="Homebrew" scheme="http://blog.ivanweb.cn/categories/Mac/Homebrew/"/>
    
    
      <category term="Mac" scheme="http://blog.ivanweb.cn/tags/Mac/"/>
    
      <category term="Homebrew" scheme="http://blog.ivanweb.cn/tags/Homebrew/"/>
    
  </entry>
  
  <entry>
    <title>微信小程序 使用Promise封装API</title>
    <link href="http://blog.ivanweb.cn/2018/04/17/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E4%BD%BF%E7%94%A8Promise%E5%B0%81%E8%A3%85API/"/>
    <id>http://blog.ivanweb.cn/2018/04/17/微信小程序-使用Promise封装API/</id>
    <published>2018-04-17T08:14:26.000Z</published>
    <updated>2019-05-08T08:44:23.945Z</updated>
    
    <content type="html"><![CDATA[<h2 id="wx-getUserInfo"><a href="#wx-getUserInfo" class="headerlink" title="wx.getUserInfo"></a>wx.getUserInfo</h2><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></pre></td><td class="code"><pre><span class="line">wx.getUserInfo(&#123;</span><br><span class="line">  withCredentials: <span class="literal">true</span>,</span><br><span class="line">  success(res) &#123;</span><br><span class="line">    <span class="built_in">console</span>.log(res.userInfo)</span><br><span class="line">  &#125;,</span><br><span class="line">  fail(error)&#123;</span><br><span class="line">    <span class="built_in">console</span>.log(error)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="Promise"><a href="#Promise" class="headerlink" title="Promise"></a>Promise</h2><p>使用Promise封装微信小程序的大部分API，把这个函数写在一个公共js文件下。这里首先创建一个带有’original’参数的匿名函数赋值给promisify，匿名函数里返回一个携带微信小程序原生API需要传参数的’opt’的函数，最终返回一个promise函数实例。<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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> promisify = <span class="function"><span class="params">original</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span> (<span class="params">opt</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">      opt = <span class="built_in">Object</span>.assign(&#123;</span><br><span class="line">        success: resolve,</span><br><span class="line">        fail: reject</span><br><span class="line">      &#125;, opt)</span><br><span class="line">      original(opt)</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>接着，在pages中对应页面的js文件中引入</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> utils = <span class="built_in">require</span>(<span class="string">'../../utils/util.js'</span>)</span><br><span class="line"></span><br><span class="line">utils.promisify(wx.getUserInfo)(&#123;<span class="attr">withCredentials</span>: <span class="literal">true</span>&#125;)</span><br><span class="line">  .then(<span class="function"><span class="params">res</span>=&gt;</span>&#123;</span><br><span class="line">    <span class="built_in">console</span>.log(res)</span><br><span class="line">  &#125;).catch(<span class="function"><span class="params">error</span>=&gt;</span>&#123;</span><br><span class="line">    <span class="built_in">console</span>.log(error)</span><br><span class="line">  &#125;)</span><br></pre></td></tr></table></figure><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ol><li><a href="https://developers.weixin.qq.com/miniprogram/dev/api/" target="_blank" rel="noopener">微信小程序</a></li><li><a href="http://es6.ruanyifeng.com/#docs/promise" target="_blank" rel="noopener">ECMAScript 6 入门</a></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;wx-getUserInfo&quot;&gt;&lt;a href=&quot;#wx-getUserInfo&quot; class=&quot;headerlink&quot; title=&quot;wx.getUserInfo&quot;&gt;&lt;/a&gt;wx.getUserInfo&lt;/h2&gt;&lt;p&gt;获取用户信息&lt;/p&gt;
&lt;figure class=&quot;highlight js&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;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&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;wx.getUserInfo(&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  withCredentials: &lt;span class=&quot;literal&quot;&gt;true&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  success(res) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(res.userInfo)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  fail(error)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(error)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="微信小程序" scheme="http://blog.ivanweb.cn/categories/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    
      <category term="微信小程序" scheme="http://blog.ivanweb.cn/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
  </entry>
  
  <entry>
    <title>微信小程序 使用Promise封装wx.request</title>
    <link href="http://blog.ivanweb.cn/2018/04/17/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E4%BD%BF%E7%94%A8Promise%E5%B0%81%E8%A3%85wx-request/"/>
    <id>http://blog.ivanweb.cn/2018/04/17/微信小程序-使用Promise封装wx-request/</id>
    <published>2018-04-17T02:06:33.000Z</published>
    <updated>2018-04-18T15:00:39.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="wx-request"><a href="#wx-request" class="headerlink" title="wx.request"></a>wx.request</h2><p>微信小程序原生的网络请求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><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">wx.request(&#123;</span><br><span class="line">  url: <span class="string">'test.php'</span>, <span class="comment">//仅为示例，并非真实的接口地址</span></span><br><span class="line">  data: &#123;</span><br><span class="line">    x: <span class="string">''</span> ,</span><br><span class="line">    y: <span class="string">''</span></span><br><span class="line">  &#125;,</span><br><span class="line">  header: &#123;</span><br><span class="line">    <span class="string">'content-type'</span>: <span class="string">'application/json'</span> <span class="comment">// 默认值</span></span><br><span class="line">  &#125;,</span><br><span class="line">  success: <span class="function"><span class="keyword">function</span>(<span class="params">res</span>) </span>&#123;</span><br><span class="line">    <span class="built_in">console</span>.log(res.data)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="Promise"><a href="#Promise" class="headerlink" title="Promise"></a>Promise</h2><p>使用Promise封装wx.request,在发起一个请求之前使用wx.showToast()，在接口调用结束的complete回调函数中使用wx.hideToast()</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> wxRequest = <span class="function">(<span class="params">params = &#123;&#125;, url</span>) =&gt;</span> &#123;</span><br><span class="line">  wx.showToast(&#123;</span><br><span class="line">    title: <span class="string">'加载中...'</span>,</span><br><span class="line">    icon: <span class="string">'loading'</span>,</span><br><span class="line">    duration: <span class="number">5000</span></span><br><span class="line">  &#125;)</span><br><span class="line">  <span class="keyword">let</span> data = params.query || &#123;&#125;;</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">    wx.request(&#123;</span><br><span class="line">      url: url,</span><br><span class="line">      method: params.method || <span class="string">'GET'</span>,</span><br><span class="line">      data: data,</span><br><span class="line">      header: &#123; <span class="string">'Content-Type'</span>: <span class="string">'application/json'</span> &#125;,</span><br><span class="line">      success: <span class="function"><span class="params">res</span>=&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (res.data.status == <span class="string">'success'</span>) &#123;</span><br><span class="line">          resolve(res.data)</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">          reject(res.msg)</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;,</span><br><span class="line">      complete:<span class="function"><span class="params">()</span>=&gt;</span>&#123;</span><br><span class="line">        wx.hideToast()</span><br><span class="line">      &#125;,</span><br><span class="line">      error: <span class="function"><span class="params">e</span>=&gt;</span> &#123;</span><br><span class="line">        reject(e)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  wxRequest,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h2><p>编写一个项目的时候，最好把所有的API接口集合一个js文件中</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> http = <span class="built_in">require</span>(<span class="string">"../utils/http.js"</span>)</span><br><span class="line"><span class="keyword">const</span> baseUrl = <span class="string">'http://127.0.0.1:8888/Wxxcx'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> getUnionId = <span class="function">(<span class="params">params</span>) =&gt;</span> http.wxRequest(params, <span class="string">`<span class="subst">$&#123;baseUrl&#125;</span>/getWxUserInfo`</span>)</span><br><span class="line"><span class="keyword">const</span> getLatLng = <span class="function">(<span class="params">params</span>) =&gt;</span> http.wxRequest(params, <span class="string">`<span class="subst">$&#123;baseUrl&#125;</span>/getStationList`</span>)</span><br><span class="line"><span class="keyword">const</span> getOil = <span class="function">(<span class="params">params</span>) =&gt;</span> http.wxRequest(params, <span class="string">`<span class="subst">$&#123;baseUrl&#125;</span>/getOilGun`</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  getUnionId,</span><br><span class="line">  getLatLng,</span><br><span class="line">  getOil</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接着，在pages中对应页面的js文件中引入</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="keyword">const</span> api = <span class="built_in">require</span>(<span class="string">'../../api/api.js'</span>)</span><br><span class="line">在对应的生命周期函数中写入</span><br><span class="line"></span><br><span class="line">api.getUnionId(&#123;</span><br><span class="line">  query: &#123;</span><br><span class="line">    code: app.globalData.code,</span><br><span class="line">    iv: res.iv,</span><br><span class="line">    encryptedData: res.encryptedData</span><br><span class="line">  &#125;</span><br><span class="line">&#125;).then(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="built_in">console</span>.log(res)</span><br><span class="line">&#125;).catch(<span class="function"><span class="params">err</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="built_in">console</span>.log(err)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ol><li><a href="https://developers.weixin.qq.com/miniprogram/dev/api/" target="_blank" rel="noopener">微信小程序</a></li><li><a href="http://es6.ruanyifeng.com/#docs/promise" target="_blank" rel="noopener">ECMAScript 6 入门</a></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;wx-request&quot;&gt;&lt;a href=&quot;#wx-request&quot; class=&quot;headerlink&quot; title=&quot;wx.request&quot;&gt;&lt;/a&gt;wx.request&lt;/h2&gt;&lt;p&gt;微信小程序原生的网络请求API&lt;/p&gt;
&lt;figure class=&quot;highlight js&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;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&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;wx.request(&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  url: &lt;span class=&quot;string&quot;&gt;&#39;test.php&#39;&lt;/span&gt;, &lt;span class=&quot;comment&quot;&gt;//仅为示例，并非真实的接口地址&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  data: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    x: &lt;span class=&quot;string&quot;&gt;&#39;&#39;&lt;/span&gt; ,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    y: &lt;span class=&quot;string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  header: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;string&quot;&gt;&#39;content-type&#39;&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;&#39;application/json&#39;&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;// 默认值&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  success: &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;res&lt;/span&gt;) &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(res.data)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="微信小程序" scheme="http://blog.ivanweb.cn/categories/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    
      <category term="微信小程序" scheme="http://blog.ivanweb.cn/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
  </entry>
  
</feed>
