<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vue on Bigshans&#39; Blog</title>
    <link>https://bigshans.github.io/tags/vue/</link>
    <description>Recent content in Vue on Bigshans&#39; Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>bigshans</copyright>
    <lastBuildDate>Wed, 04 Mar 2026 19:46:28 +0800</lastBuildDate>
    <atom:link href="https://bigshans.github.io/tags/vue/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Vue 的响应式原理</title>
      <link>https://bigshans.github.io/post/vue_s_reactive/</link>
      <pubDate>Wed, 04 Mar 2026 19:46:28 +0800</pubDate>
      <guid>https://bigshans.github.io/post/vue_s_reactive/</guid>
      <description>&lt;p&gt;Vue 3 使用 &lt;code&gt;Proxy&lt;/code&gt; 是一大创举，它成功解决了 Vue 2&#xA;无法追踪新增属性的问题。不过，仅仅是如此吗？不如我们用简单的代码实现一个&#xA;&lt;code&gt;reactive&lt;/code&gt; 看看。&lt;/p&gt;&#xA;&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode javascript&#34;&gt;&lt;code class=&#34;sourceCode javascript&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;reactive&lt;/span&gt;(target) {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;cf&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;bu&#34;&gt;Proxy&lt;/span&gt;(target&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-3&#34;&gt;&lt;a href=&#34;#cb1-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;kw&#34;&gt;get&lt;/span&gt;(target&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; key&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; recevier) {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-4&#34;&gt;&lt;a href=&#34;#cb1-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;cf&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bu&#34;&gt;Reflect&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;get&lt;/span&gt;(target&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; key&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; recevier)&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-5&#34;&gt;&lt;a href=&#34;#cb1-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    }&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-6&#34;&gt;&lt;a href=&#34;#cb1-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;kw&#34;&gt;set&lt;/span&gt;(target&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; key&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; value&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; recevier) {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-7&#34;&gt;&lt;a href=&#34;#cb1-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;cf&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bu&#34;&gt;Reflect&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;set&lt;/span&gt;(target&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; key&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; value&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; recevier)&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-8&#34;&gt;&lt;a href=&#34;#cb1-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    }&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-9&#34;&gt;&lt;a href=&#34;#cb1-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  })&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-10&#34;&gt;&lt;a href=&#34;#cb1-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;这里，&lt;code&gt;Reflect&lt;/code&gt; 和 &lt;code&gt;Proxy()&lt;/code&gt;&#xA;是配套的，等同于我们直接对 &lt;code&gt;target[key]&lt;/code&gt; 进行操作，但用&#xA;&lt;code&gt;Reflect&lt;/code&gt; 更加方便，也更加安全。我们可以通过在拦截器层面增加&#xA;&lt;code&gt;console.log()&lt;/code&gt; 来查看效果。&lt;/p&gt;</description>
    </item>
    <item>
      <title>《Vuejs设计与实现》读书笔记</title>
      <link>https://bigshans.github.io/post/vuejs%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sun, 08 Jan 2023 13:37:21 +0800</pubDate>
      <guid>https://bigshans.github.io/post/vuejs%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;第二篇-响应系统&#34;&gt;第二篇 响应系统&lt;/h2&gt;&#xA;&lt;h3 id=&#34;第四章-响应系统的作用与实现&#34;&gt;第四章 响应系统的作用与实现&lt;/h3&gt;&#xA;&lt;h4 id=&#34;设计完善的响应式系统&#34;&gt;设计完善的响应式系统&lt;/h4&gt;&#xA;&lt;p&gt;借助 &lt;code&gt;Proxy&lt;/code&gt;&#xA;，我们实现一个基本的响应式系统。书中代码我改成可以在 Node&#xA;中运行的代码了。&lt;/p&gt;&#xA;&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode javascript&#34;&gt;&lt;code class=&#34;sourceCode javascript&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kw&#34;&gt;const&lt;/span&gt; bucket &lt;span class=&#34;op&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;bu&#34;&gt;Set&lt;/span&gt;()&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-3&#34;&gt;&lt;a href=&#34;#cb1-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kw&#34;&gt;const&lt;/span&gt; data &lt;span class=&#34;op&#34;&gt;=&lt;/span&gt; { &lt;span class=&#34;dt&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;hello world&amp;#39;&lt;/span&gt; }&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-4&#34;&gt;&lt;a href=&#34;#cb1-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-5&#34;&gt;&lt;a href=&#34;#cb1-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kw&#34;&gt;const&lt;/span&gt; obj &lt;span class=&#34;op&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;bu&#34;&gt;Proxy&lt;/span&gt;(data&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-6&#34;&gt;&lt;a href=&#34;#cb1-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;kw&#34;&gt;get&lt;/span&gt;(target&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; key) {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-7&#34;&gt;&lt;a href=&#34;#cb1-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        bucket&lt;span class=&#34;op&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;add&lt;/span&gt;(effect)&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-8&#34;&gt;&lt;a href=&#34;#cb1-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;cf&#34;&gt;return&lt;/span&gt; target[key]&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-9&#34;&gt;&lt;a href=&#34;#cb1-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    }&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-10&#34;&gt;&lt;a href=&#34;#cb1-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;kw&#34;&gt;set&lt;/span&gt;(target&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; key&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; newVal) {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-11&#34;&gt;&lt;a href=&#34;#cb1-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        target[key] &lt;span class=&#34;op&#34;&gt;=&lt;/span&gt; newVal&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-12&#34;&gt;&lt;a href=&#34;#cb1-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        bucket&lt;span class=&#34;op&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;forEach&lt;/span&gt;(fn &lt;span class=&#34;kw&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;fn&lt;/span&gt;())&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-13&#34;&gt;&lt;a href=&#34;#cb1-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;cf&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-14&#34;&gt;&lt;a href=&#34;#cb1-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    }&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-15&#34;&gt;&lt;a href=&#34;#cb1-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;})&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-16&#34;&gt;&lt;a href=&#34;#cb1-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-17&#34;&gt;&lt;a href=&#34;#cb1-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;effect&lt;/span&gt;() {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-18&#34;&gt;&lt;a href=&#34;#cb1-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;bu&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;log&lt;/span&gt;(obj&lt;span class=&#34;op&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;at&#34;&gt;text&lt;/span&gt;)&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-19&#34;&gt;&lt;a href=&#34;#cb1-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;}&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-20&#34;&gt;&lt;a href=&#34;#cb1-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-21&#34;&gt;&lt;a href=&#34;#cb1-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;effect&lt;/span&gt;()&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-22&#34;&gt;&lt;a href=&#34;#cb1-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-23&#34;&gt;&lt;a href=&#34;#cb1-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;pp&#34;&gt;setTimeout&lt;/span&gt;(() &lt;span class=&#34;kw&#34;&gt;=&amp;gt;&lt;/span&gt; {&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-24&#34;&gt;&lt;a href=&#34;#cb1-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    obj&lt;span class=&#34;op&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;at&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;op&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Hello Vue&amp;#39;&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-25&#34;&gt;&lt;a href=&#34;#cb1-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;}&lt;span class=&#34;op&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1000&lt;/span&gt;)&lt;span class=&#34;op&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-26&#34;&gt;&lt;a href=&#34;#cb1-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;// Output:&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-27&#34;&gt;&lt;a href=&#34;#cb1-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;// hello world&lt;/span&gt;&lt;/span&gt;&#xA;&lt;span id=&#34;cb1-28&#34;&gt;&lt;a href=&#34;#cb1-28&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;// Hello Vue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;这里是写死了 &lt;code&gt;effect&lt;/code&gt; ，不过不用太过纠结。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vue 3.2 &lt;script setup&gt; 摘要</title>
      <link>https://bigshans.github.io/post/vue3_2-setup/</link>
      <pubDate>Thu, 26 Aug 2021 15:43:34 +0800</pubDate>
      <guid>https://bigshans.github.io/post/vue3_2-setup/</guid>
      <description>&lt;p&gt;在 Vue 3.2 发布的内容中，最主要内容就是 &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; 。 &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; 想必大家都有使用过，跟当初作为实验特性不同，这次正式发布还是有很多的修改的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;废除-usecontext&#34;&gt;废除 &lt;code&gt;useContext()&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;原先获取全局 &lt;code&gt;ctx&lt;/code&gt; 的方法就是 &lt;code&gt;useContext()&lt;/code&gt; ，现在不行了。 Vue 还是希望用户摆脱全局变量的使用，进而使用 &lt;code&gt;useXXX&lt;/code&gt; 代替。利弊各有吧，总体来说利大于弊。&lt;/p&gt;</description>
    </item>
    <item>
      <title>webpack 的 require 和 import 相关的一点问题</title>
      <link>https://bigshans.github.io/post/net-musicvue-problem-set1/</link>
      <pubDate>Sun, 26 Aug 2018 12:41:45 +0000</pubDate>
      <guid>https://bigshans.github.io/post/net-musicvue-problem-set1/</guid>
      <description>&lt;p&gt;今天继续用 electron-vue 写 NeteaseCloudMusic 的第三方 app， 用的 NeteaseCloudMusicApi 使用起来却很麻烦。不知道为什么之前可以正常使用，现在却不行了，摸索了好久，还是没能解决。不过还是有点收获的，接下来讲一讲。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
