<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://blog.ddlyt.top/</id>
  <title type="text">DBlog</title>
  <subtitle type="text">越努力，越幸运</subtitle>
  <updated>2026-10-28T00:00:00.000Z</updated>
  <author><name>兜兜里有糖</name></author>
  <link rel="alternate" href="https://blog.ddlyt.top/"/>
  <link rel="self" href="https://blog.ddlyt.top/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v2.0.0</generator>
    <entry>
      <id>https://blog.ddlyt.top/posts/2026/1028/</id>
      <title type="text">Python 笔记：给前端开发者的语法对照</title>
      <published>2026-10-28T00:00:00.000Z</published>
      <updated>2026-10-28T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2026/1028/"/>
      <summary type="text">用 JavaScript 的思维快速理解 Python 中真正不同的语法。</summary>
      <content type="html"><![CDATA[<p>这篇只记 JavaScript 开发者最容易误判的 Python 差异。默认你已经会写 JS，不重复解释变量、循环是什么。</p>
<section><h2>先看结论<a href="#先看结论"><span>#</span></a></h2>

<table><thead><tr><th>场景</th><th>JavaScript</th><th>Python</th></tr></thead><tbody><tr><td>输出</td><td><code>console.log(x)</code></td><td><code>print(x)</code></td></tr><tr><td>字符串插值</td><td><code>`${x}`</code></td><td><code>f"{x}"</code></td></tr><tr><td>布尔值与空值</td><td><code>true</code> / <code>false</code> / <code>null</code></td><td><code>True</code> / <code>False</code> / <code>None</code></td></tr><tr><td>逻辑运算</td><td><code>&amp;&amp;</code> <code>||</code> <code>!</code></td><td><code>and</code> <code>or</code> <code>not</code></td></tr><tr><td>代码块</td><td><code>{ ... }</code></td><td><code>:</code> + 缩进</td></tr><tr><td>遍历</td><td><code>for (const x of a)</code></td><td><code>for x in a</code></td></tr><tr><td>长度</td><td><code>a.length</code></td><td><code>len(a)</code></td></tr><tr><td>最后一个元素</td><td><code>a.at(-1)</code></td><td><code>a[-1]</code></td></tr><tr><td>字典/对象读取</td><td><code>obj.key</code></td><td><code>d["key"]</code> / <code>d.get("key")</code></td></tr><tr><td>函数定义</td><td><code>function f() {}</code></td><td><code>def f():</code></td></tr><tr><td>实例引用</td><td><code>this</code></td><td><code>self</code></td></tr><tr><td>异常捕获</td><td><code>catch (err)</code></td><td><code>except Error as err:</code></td></tr><tr><td>变量声明</td><td><code>let</code> / <code>const</code></td><td>直接赋值，没有 <code>const</code></td></tr><tr><td>实例化</td><td><code>new Person()</code></td><td><code>Person()</code></td></tr><tr><td>包管理</td><td><code>npm</code> + <code>node_modules</code></td><td><code>pip</code> + <code>venv</code></td></tr></tbody></table></section>
<section><h2>变量与字符串<a href="#变量与字符串"><span>#</span></a></h2><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>name</span><span> </span></span><span>=</span><span> </span><span>"Mia"</span><span>;</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>age</span><span> </span><span>=</span><span> </span><span>20</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>`</span><span>${</span><span>name</span><span>}</span><span> is </span><span>${</span><span>age</span><span>}</span><span>`</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>name </span><span>=</span><span> </span></span><span>"Mia"</span></div></div><div><div><div>2</div></div><div><span><span>age </span><span>=</span><span> </span></span><span>20</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>name</span><span>}</span><span> is </span><span>{</span><span>age</span><span>}</span><span>"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>Python 没有 <code>let</code> / <code>const</code>。变量只是名字，重新赋值就是重新绑定：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>name </span><span>=</span><span> </span></span><span>"Mia"</span></div></div><div><div><div>2</div></div><div><span><span>name </span><span>=</span><span> </span></span><span>"Leo"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>约定使用 <code>snake_case</code>，常量通常写全大写：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>MAX_RETRY</span><span> </span><span>=</span><span> </span></span><span>3</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>字符串拼接不同类型会报错，需要显式转换：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>age </span><span>=</span><span> </span></span><span>20</span></div></div><div><div><div>2</div></div><div><span>print</span><span>(</span><span>"Age is "</span><span><span> </span><span>+</span><span> </span></span><span>str</span><span>(age))</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>代码块与条件<a href="#代码块与条件"><span>#</span></a></h2><p>JavaScript 靠花括号，Python 靠缩进。缩进不是格式，是语法。</p><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span><span> (</span><span>age</span><span> </span></span><span>&gt;=</span><span> </span><span>18</span><span>) {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"Adult"</span><span>);</span></div></div><div><div><div>3</div></div><div><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>age</span><span> </span></span><span>&gt;=</span><span> </span><span>12</span><span>) {</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"Teenager"</span><span>);</span></div></div><div><div><div>5</div></div><div><span>} </span><span>else</span><span> {</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"Child"</span><span>);</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span><span> age </span><span>&gt;=</span><span> </span></span><span>18</span><span>:</span></div></div><div><div><div>2</div></div><div><span>    </span><span>print</span><span>(</span><span>"Adult"</span><span>)</span></div></div><div><div><div>3</div></div><div><span>elif</span><span><span> age </span><span>&gt;=</span><span> </span></span><span>12</span><span>:</span></div></div><div><div><div>4</div></div><div><span>    </span><span>print</span><span>(</span><span>"Teenager"</span><span>)</span></div></div><div><div><div>5</div></div><div><span>else</span><span>:</span></div></div><div><div><div>6</div></div><div><span>    </span><span>print</span><span>(</span><span>"Child"</span><span>)</span></div></div><div><div><div>7</div></div><div><span>​</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>另一个容易忽略的差异：<strong>Python 的条件和循环不会创建块级作用域</strong>。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span> </span><span>True</span><span>:</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>level </span><span>=</span><span> </span><span>"adult"</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>print</span><span>(level)  </span><span># adult</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>JS 里 <code>let level</code> 写在 <code>if</code> 内，块外不能访问；Python 可以。</p></section>
<section><h2>数字、布尔值和空值<a href="#数字布尔值和空值"><span>#</span></a></h2>

<table><thead><tr><th>写法</th><th>JavaScript</th><th>Python</th></tr></thead><tbody><tr><td>除法</td><td><code>7 / 2</code> → <code>3.5</code></td><td><code>7 / 2</code> → <code>3.5</code></td></tr><tr><td>整除</td><td><code>Math.floor(7 / 2)</code></td><td><code>7 // 2</code></td></tr><tr><td>乘方</td><td><code>2 ** 10</code></td><td><code>2 ** 10</code></td></tr><tr><td>类型</td><td><code>typeof 2</code></td><td><code>type(2)</code></td></tr><tr><td>相等</td><td>优先用 <code>===</code></td><td>用 <code>==</code></td></tr><tr><td>逻辑</td><td><code>&amp;&amp;</code> <code>||</code> <code>!</code></td><td><code>and</code> <code>or</code> <code>not</code></td></tr><tr><td>空值</td><td><code>undefined</code> / <code>null</code></td><td><code>None</code></td></tr><tr><td>布尔</td><td><code>true</code> / <code>false</code></td><td><code>True</code> / <code>False</code></td></tr></tbody></table><p>Python 的 <code>==</code> 比较值，<code>is</code> 比较是不是同一个对象。不要拿 <code>is</code> 代替 <code>==</code>。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>2</span><span><span> </span><span>==</span><span> </span></span><span>"2"</span><span>      </span><span># False</span></div></div><div><div><div>2</div></div><div><span>2</span><span> </span><span>is</span><span> </span><span>2</span><span>        </span><span># True</span></div></div><div><div><div>3</div></div><div><span>None</span><span> </span><span>is</span><span> </span><span>None</span><span>  </span><span># True</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Python 和 JS 的真值判断也不同：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>bool</span><span>([])      </span><span># False</span></div></div><div><div><div>2</div></div><div><span>bool</span><span>({})      </span><span># False</span></div></div><div><div><div>3</div></div><div><span>bool</span><span>(</span><span>""</span><span>)      </span><span># False</span></div></div><div><div><div>4</div></div><div><span>bool</span><span>(</span><span>0</span><span>)       </span><span># False</span></div></div><div><div><div>5</div></div><div><span>bool</span><span>(</span><span>None</span><span>)    </span><span># False</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>JS 中空数组和空对象都是真值，这是最常见的迁移坑之一。</p></section>
<section><h2>列表 vs 数组<a href="#列表-vs-数组"><span>#</span></a></h2>

<table><thead><tr><th>操作</th><th>JavaScript</th><th>Python</th></tr></thead><tbody><tr><td>追加</td><td><code>arr.push(x)</code></td><td><code>arr.append(x)</code></td></tr><tr><td>长度</td><td><code>arr.length</code></td><td><code>len(arr)</code></td></tr><tr><td>最后一个</td><td><code>arr.at(-1)</code></td><td><code>arr[-1]</code></td></tr><tr><td>切片</td><td><code>arr.slice(1, 3)</code></td><td><code>arr[1:3]</code></td></tr><tr><td>包含</td><td><code>arr.includes(x)</code></td><td><code>x in arr</code></td></tr><tr><td>删除</td><td><code>arr.splice()</code></td><td><code>del arr[i]</code> / <code>pop()</code></td></tr><tr><td>排序</td><td><code>arr.sort()</code> 原地修改</td><td><code>sorted(arr)</code> 返回新列表</td></tr></tbody></table><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>nums </span><span>=</span><span> [</span></span><span>3</span><span>, </span><span>10</span><span>, </span><span>4</span><span>, </span><span>1</span><span>, </span><span>5</span><span>]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>nums.</span><span>append</span><span>(</span></span><span>9</span><span>)</span></div></div><div><div><div>4</div></div><div><span>print</span><span>(</span><span>len</span><span>(nums))       </span><span># 6</span></div></div><div><div><div>5</div></div><div><span>print</span><span><span>(nums[</span><span>-</span></span><span>1</span><span>])        </span><span># 9</span></div></div><div><div><div>6</div></div><div><span>print</span><span>(nums[</span><span>1</span><span>:</span><span>3</span><span>])       </span><span># [10, 4]</span></div></div><div><div><div>7</div></div><div><span>print</span><span>(</span><span>4</span><span> </span><span>in</span><span> nums)       </span><span># True</span></div></div><div><div><div>8</div></div><div><span>print</span><span>(</span><span>sorted</span><span>(nums))    </span><span># [1, 3, 4, 5, 9, 10]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>sorted()</code> 返回新列表，<code>nums.sort()</code> 才是原地排序：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>result </span><span>=</span><span> </span></span><span>sorted</span><span>(nums)</span></div></div><div><div><div>2</div></div><div><span><span>nums.</span><span>sort</span><span>()</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>列表推导式可以直接替代 <code>filter + map</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>result </span><span>=</span><span> [n </span><span>*</span><span> </span></span><span>2</span><span> </span><span>for</span><span> n </span><span>in</span><span> nums </span><span>if</span><span><span> n </span><span>&gt;</span><span> </span></span><span>3</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行逻辑是：先过滤 <code>n &gt; 3</code>，再把满足条件的 <code>n</code> 变成 <code>n * 2</code>。</p></section>
<section><h2>字典 vs 对象<a href="#字典-vs-对象"><span>#</span></a></h2>

<table><thead><tr><th>操作</th><th>JavaScript</th><th>Python</th></tr></thead><tbody><tr><td>读取</td><td><code>book.title</code></td><td><code>book["title"]</code></td></tr><tr><td>缺失键</td><td>返回 <code>undefined</code></td><td>抛 <code>KeyError</code></td></tr><tr><td>安全读取</td><td><code>book.rating ?? 0</code></td><td><code>book.get("rating", 0)</code></td></tr><tr><td>遍历</td><td><code>Object.entries(book)</code></td><td><code>book.items()</code></td></tr></tbody></table><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>book </span><span>=</span><span> {</span></span><span>"title"</span><span>: </span><span>"Dune"</span><span>, </span><span>"year"</span><span>: </span><span>1965</span><span>}</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>print</span><span>(book[</span><span>"title"</span><span>])              </span><span># Dune</span></div></div><div><div><div>4</div></div><div><span>print</span><span><span>(book.</span><span>get</span><span>(</span></span><span>"rating"</span><span>, </span><span>0</span><span>))      </span><span># 0</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>for</span><span> key, value </span><span>in</span><span><span> book.</span><span>items</span><span>():</span></span></div></div><div><div><div>7</div></div><div><span>    </span><span>print</span><span>(key, value)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>注意：<code>get()</code> 的默认值只在键不存在时生效。键存在但值是 <code>None</code>，仍然会返回 <code>None</code>。</p></section>
<section><h2>循环<a href="#循环"><span>#</span></a></h2><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span> (</span><span>const</span><span> </span><span>fruit</span><span> </span><span>of</span><span><span> </span><span>fruits</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>fruit</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span> fruit </span><span>in</span><span> fruits:</span></div></div><div><div><div>2</div></div><div><span>    </span><span>print</span><span>(fruit)</span></div></div><div><div><div>3</div></div><div><span>​</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>需要索引时，Python 用 <code>enumerate()</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span> index, fruit </span><span>in</span><span> </span><span>enumerate</span><span>(fruits):</span></div></div><div><div><div>2</div></div><div><span>    </span><span>print</span><span>(index, fruit)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>数数字用 <code>range()</code>，右边界不包含：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span> i </span><span>in</span><span> </span><span>range</span><span>(</span><span>5</span><span>):</span></div></div><div><div><div>2</div></div><div><span>    </span><span>print</span><span>(i)  </span><span># 0 1 2 3 4</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Python 没有 <code>i++</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>count </span><span>=</span><span> </span></span><span>0</span></div></div><div><div><div>2</div></div><div><span>while</span><span><span> count </span><span>&lt;</span><span> </span></span><span>5</span><span>:</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>count </span><span>+=</span><span> </span><span>1</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>函数<a href="#函数"><span>#</span></a></h2><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>greet</span><span><span>(</span><span>name</span><span>, </span><span>greeting</span><span> </span></span><span>=</span><span> </span><span>"Hi"</span><span>) {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>return</span><span> </span><span>`</span><span>${</span><span>greeting</span><span>}</span><span>, </span><span>${</span><span>name</span><span>}</span><span>!`</span><span>;</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>greet</span><span>(</span><span>"Mia"</span><span>);</span></div></div><div><div><div>6</div></div><div><span>greet</span><span>(</span><span>"Mia"</span><span>, </span><span>"Hello"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>def</span><span> </span><span>greet</span><span>(</span><span>name</span><span>,</span><span><span> </span><span>greeting</span></span><span>=</span><span>"Hi"</span><span>):</span></div></div><div><div><div>2</div></div><div><span>    </span><span>return</span><span> </span><span>f</span><span>"</span><span>{</span><span>greeting</span><span>}</span><span>, </span><span>{</span><span>name</span><span>}</span><span>!"</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span><span>greet</span><span>(</span></span><span>"Mia"</span><span>)</span></div></div><div><div><div>5</div></div><div><span><span>greet</span><span>(</span></span><span>"Mia"</span><span>, </span><span>"Hello"</span><span>)</span></div></div><div><div><div>6</div></div><div><span><span>greet</span><span>(</span></span><span>name</span><span>=</span><span>"Mia"</span><span>, </span><span>greeting</span><span>=</span><span>"Hello"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>关键差异：</p><ul>
<li>Python 支持关键字参数，JS 通常用对象参数模拟。</li>
<li>Python 缺少必填参数会直接抛 <code>TypeError</code>；JS 可能得到 <code>undefined</code>。</li>
<li>Python 函数没有 <code>return</code> 时返回 <code>None</code>。</li>
<li><code>lambda</code> 只能写单个表达式，复杂逻辑应写普通函数。</li>
</ul><p>排序函数的写法也不同：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>words </span><span>=</span><span> [</span></span><span>"banana"</span><span>, </span><span>"fig"</span><span>, </span><span>"apple"</span><span>]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>sorted</span><span>(words, </span><span>key</span><span>=</span><span>len</span><span>)                 </span><span># 按长度</span></div></div><div><div><div>4</div></div><div><span>sorted</span><span>(words, </span><span>key</span><span>=</span><span>lambda</span><span> </span><span>w</span><span><span>: w[</span><span>-</span></span><span>1</span><span>])     </span><span># 按最后一个字符</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>类<a href="#类"><span>#</span></a></h2><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span> </span><span>Person</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>name</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>this</span><span>.</span><span>name</span><span> </span><span>=</span><span><span> </span><span>name</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>speak</span><span>() {</span></div></div><div><div><div>7</div></div><div><span>    </span><span>return</span><span> </span><span>`</span><span>${</span><span>this</span><span>.</span><span>name</span><span>}</span><span> is speaking`</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>const</span><span> </span><span>person</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Person</span><span>(</span><span>"Mia"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span><span> </span><span>Person</span></span><span>:</span></div></div><div><div><div>2</div></div><div><span>    </span><span>def</span><span> </span><span>__init__</span><span>(</span><span>self</span><span>,</span><span><span> </span><span>name</span></span><span>):</span></div></div><div><div><div>3</div></div><div><span>        </span><span>self</span><span><span>.name </span><span>=</span><span> name</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>def</span><span> </span><span>speak</span><span>(</span><span>self</span><span>):</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> </span><span>f</span><span>"</span><span>{</span><span>self</span><span>.name</span><span>}</span><span> is speaking"</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span><span>person </span><span>=</span><span> </span><span>Person</span><span>(</span></span><span>"Mia"</span><span>)</span></div></div><div><div><div>9</div></div><div><span>​</span></div></div><div><div><div>10</div></div><div><span>​</span></div></div><div><div><div>11</div></div><div><span>​</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>记住三点：构造方法叫 <code>__init__</code>，实例方法第一个参数是 <code>self</code>，创建实例不用 <code>new</code>。</p></section>
<section><h2>异常处理<a href="#异常处理"><span>#</span></a></h2><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>try</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>const</span><span> </span><span>data</span><span> </span><span>=</span><span> </span><span>JSON</span><span>.</span><span>parse</span><span><span>(</span><span>text</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>data</span><span>.</span></span><span>age</span><span>);</span></div></div><div><div><div>4</div></div><div><span>} </span><span>catch</span><span><span> (</span><span>error</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>error</span><span>.</span></span><span>message</span><span>);</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>​</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> json</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>try</span><span>:</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>data </span><span>=</span><span> json.</span><span>loads</span><span>(text)</span></div></div><div><div><div>5</div></div><div><span>    </span><span>print</span><span>(data[</span><span>"age"</span><span>])</span></div></div><div><div><div>6</div></div><div><span>except</span><span> json.JSONDecodeError </span><span>as</span><span> error:</span></div></div><div><div><div>7</div></div><div><span>    </span><span>print</span><span>(error)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>主动抛错：</p><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>throw</span><span> </span><span>new</span><span> </span><span>Error</span><span>(</span><span>"Invalid data"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>raise</span><span> </span><span>ValueError</span><span>(</span><span>"Invalid data"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>不要捕获所有异常后什么都不做。至少记录错误，或只捕获明确的异常类型。</p></section>
<section><h2>异步<a href="#异步"><span>#</span></a></h2><p>JS 中 <code>async</code> 函数由运行时调度；Python 中协程需要事件循环执行。</p><div><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>async</span><span> </span><span>function</span><span> </span><span>main</span><span>() {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>const</span><span> </span><span>data</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>fetchData</span><span>();</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div><div><div><div>4</div></div><div><span>​</span></div></div><div><div><div>5</div></div><div><span>​</span></div></div><div><div><div>6</div></div><div><span>​</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> asyncio</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>async</span><span> </span><span>def</span><span> </span><span>main</span><span>():</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>data </span><span>=</span><span> </span><span>await</span><span><span> </span><span>fetch_data</span><span>()</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span>asyncio.</span><span>run</span><span>(</span><span>main</span><span>())</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></div><p>调用 <code>main()</code> 只是创建协程，不会自动执行；<code>asyncio.run()</code> 才会启动事件循环。</p></section>
<section><h2>运行、依赖与模块<a href="#运行依赖与模块"><span>#</span></a></h2>

<table><thead><tr><th>场景</th><th>JavaScript</th><th>Python</th></tr></thead><tbody><tr><td>运行文件</td><td><code>node app.js</code></td><td><code>python app.py</code></td></tr><tr><td>安装依赖</td><td><code>npm install</code></td><td><code>pip install</code></td></tr><tr><td>项目配置</td><td><code>package.json</code></td><td><code>requirements.txt</code> / <code>pyproject.toml</code></td></tr><tr><td>依赖位置</td><td>当前项目 <code>node_modules</code></td><td>默认全局，项目通常使用 <code>venv</code></td></tr><tr><td>导入</td><td><code>import x from "./x.js"</code></td><td><code>import x</code> / <code>from x import y</code></td></tr></tbody></table><p>Python 项目建议始终创建虚拟环境：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>python</span><span> </span><span>-m</span><span> </span><span>venv</span><span> </span><span>.venv</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># Windows PowerShell</span></div></div><div><div><div>4</div></div><div><span>.</span><span>\</span><span>.venv</span><span>\</span><span>Scripts</span><span>\</span><span>Activate.ps1</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># macOS / Linux</span></div></div><div><div><div>7</div></div><div><span>source</span><span> </span><span>.venv/bin/activate</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>激活后再安装依赖，避免污染系统 Python：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pip</span><span> </span><span>install</span><span> </span><span>requests</span></div></div><div><div><div>2</div></div><div><span>pip</span><span> </span><span>freeze</span><span> &gt; </span><span>requirements.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>最容易踩的坑<a href="#最容易踩的坑"><span>#</span></a></h2><ol>
<li>
<p><strong>空数组不是“有值”</strong>：Python 的 <code>[]</code> 是假值，JS 的 <code>[]</code> 是真值。</p>
</li>
<li>
<p><strong>数组排序语义不同</strong>：JS <code>sort()</code> 默认按字符串比较且原地修改；Python <code>sorted()</code> 返回新列表。</p>
</li>
<li>
<p><strong>对象缺键不返回 undefined</strong>：Python 字典缺键会抛 <code>KeyError</code>，不确定时用 <code>get()</code>。</p>
</li>
<li>
<p><strong>没有 <code>++</code></strong>：用 <code>i += 1</code>。</p>
</li>
<li>
<p><strong>不要用可变对象做默认参数</strong>：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>def</span><span> </span><span>add</span><span>(</span><span>item</span><span>,</span><span><span> </span><span>items</span></span><span>=</span><span>None</span><span>):</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span> items </span><span>is</span><span> </span><span>None</span><span>:</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>items </span><span>=</span><span> []</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>items.</span><span>append</span><span>(item)</span></div></div><div><div><div>5</div></div><div><span>    </span><span>return</span><span> items</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><strong>赋值不等于复制</strong>：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>a </span><span>=</span><span> [</span></span><span>1</span><span>, </span><span>2</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>b </span><span>=</span><span> a</span></span></div></div><div><div><div>3</div></div><div><span><span>b.</span><span>append</span><span>(</span></span><span>3</span><span>)</span></div></div><div><div><div>4</div></div><div><span>print</span><span>(a)  </span><span># [1, 2, 3]</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>需要副本时用 <code>b = a.copy()</code> 或 <code>b = a[:]</code>。</p>
</li>
<li>
<p><strong>缩进错误就是语法错误</strong>：不要混用 Tab 和空格。</p>
</li>
<li>
<p><strong><code>None</code> 不是 <code>undefined</code></strong>：Python 没有 <code>undefined</code>，缺值统一用 <code>None</code>。</p>
</li>
</ol></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2026/0728/</id>
      <title type="text">什么是 Agent</title>
      <published>2026-07-28T00:00:00.000Z</published>
      <updated>2026-07-28T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2026/0728/"/>
      <summary type="text">希望可以帮到你</summary>
      <content type="html"><![CDATA[<section><h2>什么是 Agent<a href="#什么是-agent"><span>#</span></a></h2><p>简单来说，Agent 是由 <strong>AI 模型</strong> 驱动，并能够调用工具、执行任务、根据结果继续决策的智能系统。</p><p>可以将它粗略理解为：</p><blockquote><p>Agent = AI 模型 + Tools + Skills + Memory + Workflow</p></blockquote><p>其中：</p><ul>
<li><strong>AI 模型</strong>：负责理解用户的目标、分析当前信息并作出决策。</li>
<li><strong>Tools</strong>：让模型能够与外部世界交互，例如搜索网页、读取文件、执行代码、调用 API。</li>
<li><strong>Skills</strong>：针对某类任务预设的工作方法和规则，例如代码审查、生成图片或操作浏览器。</li>
<li><strong>Memory</strong>：保存用户偏好、项目背景和历史信息，使 Agent 可以在后续任务中保持上下文。</li>
<li><strong>Workflow</strong>：将「理解需求 → 制定步骤 → 调用工具 → 检查结果 → 继续执行」串联起来的执行过程。</li>
</ul><p>普通聊天模型通常只能根据已有信息生成文本；Agent 则可以为了完成目标主动采取行动。例如，当你要求它修复一个 Bug 时，它可以阅读代码、搜索调用位置、修改文件、运行测试，并依据测试结果继续调整。</p><p>MCP（Model Context Protocol）不是 Agent 本身，而是一种让 Agent 以统一方式连接外部工具和数据源的协议。它可以把数据库、浏览器、GitHub、文件系统等能力提供给模型使用。</p><p>因此，Agent 并不等于 MCP，也不等于某一个大模型。更准确地说，Agent 是以模型为决策核心，结合工具、技能、记忆和执行流程而形成的可行动系统。</p></section>
<section><h2>什么是 MCP<a href="#什么是-mcp"><span>#</span></a></h2><p>MCP（Model Context Protocol，模型上下文协议）是一套开放协议，用于让 AI 应用以统一方式连接外部工具和数据源。</p><p>在没有 MCP 时，接入不同服务通常需要为每个服务单独编写接口和鉴权逻辑；有了 MCP 后，服务只要实现 MCP Server，支持 MCP 的 AI 客户端就能按照统一规范发现并调用其能力。</p><p>MCP 通常包含三类能力：</p><ul>
<li><strong>Tools</strong>：可由模型调用的操作，例如查询数据库、创建 Issue、发送请求。</li>
<li><strong>Resources</strong>：可供模型读取的上下文，例如文件、文档、数据库记录。</li>
<li><strong>Prompts</strong>：服务端提供的可复用提示词模板。</li>
</ul><p>可以把 MCP 理解为 AI 与外部服务之间的「通用插座」。它负责连接和通信，但不负责替模型作出决策。</p></section>
<section><h2>什么是 Skills<a href="#什么是-skills"><span>#</span></a></h2><p>Skills 是为某一类任务准备的能力包，通常包含任务说明、执行步骤、约束条件，以及需要调用的工具。</p><p>例如，「代码审查」Skill 会告诉 Agent 应重点检查哪些问题、如何读取代码和运行测试；「浏览器自动化」Skill 则会提供操作网页所需的工具和流程。</p><p>Skills 的价值在于把重复的经验固化下来，让 Agent 不必每次都从零规划任务。它更像一份可执行的操作手册，而不是一个新的模型或协议。</p></section>
<section><h2>什么是 Memory<a href="#什么是-memory"><span>#</span></a></h2><p>Memory 是 Agent 在当前或未来任务中保留信息的机制，使它不必在每次对话中重新了解用户和项目。</p><p>常见的记忆类型包括：</p><ul>
<li><strong>会话记忆</strong>：保存当前对话中的上下文，通常会在会话结束后失效。</li>
<li><strong>长期记忆</strong>：保存用户偏好、项目背景和长期有效的约定，可在后续会话中继续使用。</li>
<li><strong>外部记忆</strong>：将文档、数据库或知识库作为可检索的信息来源，需要时再读取。</li>
</ul><p>Memory 的作用是提供上下文，而不是替代真实数据。涉及当前代码、线上状态或最新文档时，Agent 仍应重新查询并验证。</p></section>
<section><h2>什么是 Workflow<a href="#什么是-workflow"><span>#</span></a></h2><p>Workflow 是完成一类任务时的固定执行流程，它将模型思考、工具调用和结果检查组织成明确的步骤。</p><p>一个简单的代码修复 Workflow 可以是：</p><blockquote><p>理解问题 → 阅读相关代码 → 定位根因 → 修改文件 → 运行测试 → 检查结果</p></blockquote><p>Workflow 可以由人预先定义，也可以由 Agent 根据目标动态规划。前者更稳定、可控，适合重复且步骤明确的任务；后者更灵活，适合探索性问题，但需要设置权限、验证和人工确认等边界。</p></section>
<section><h2>Agent 工作过程<a href="#agent-工作过程"><span>#</span></a></h2><p>Agent 的一次任务通常会经历以下过程：</p><blockquote><p>接收目标 → 获取上下文 → 制定计划 → 调用工具 → 检查结果 → 输出结果或继续执行</p></blockquote><p>以「整理一篇文章」为例，Agent 会先理解用户希望修改什么，再读取文章内容和相关资料；当需要事实依据时，它会查询资料或调用工具；完成修改后，它还应检查结果是否符合要求。</p><p>工具调用不是 Agent 的固定步骤。对于简单的解释或改写任务，模型可能只需直接生成文本；只有在需要外部信息或执行操作时，才需要调用对应工具。</p></section>
<section><h2>Agent 的安全边界<a href="#agent-的安全边界"><span>#</span></a></h2><p>Agent 可以调用工具不代表它应当拥有所有权限。根据影响范围，可以将操作分为三类：</p><ul>
<li><strong>只读操作</strong>：例如读取文件、搜索资料、查询数据，通常风险较低。</li>
<li><strong>写入操作</strong>：例如修改文件、创建记录、发送请求，应检查目标和内容是否正确。</li>
<li><strong>高风险操作</strong>：例如删除数据、执行不可逆命令、发布公开内容或操作生产环境，应要求明确授权和人工确认。</li>
</ul><p>工具返回的内容同样不能完全信任。网页、文档或外部服务的响应可能包含错误信息，甚至试图诱导 Agent 执行无关操作。因此，Agent 在执行高风险动作前，需要验证结果是否与原始目标一致，并遵守既定的权限范围。</p></section>
<section><h2>一个最小示例<a href="#一个最小示例"><span>#</span></a></h2><p>下面以「检查文章中的链接是否有效」为例，展示一个简单的 Agent 流程：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>目标：检查文章中的链接，并汇总失效链接</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>1. 读取文章内容</span></div></div><div><div><div>4</div></div><div><span>2. 提取其中的链接</span></div></div><div><div><div>5</div></div><div><span>3. 逐个检查链接是否能够访问</span></div></div><div><div><div>6</div></div><div><span>4. 汇总可访问与失效的链接</span></div></div><div><div><div>7</div></div><div><span>5. 将检查结果返回给用户</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在这个过程中，模型负责理解「检查链接」这一目标并决定下一步；读取文章和访问链接属于工具能力；检查步骤构成 Workflow；如果系统记住文章所在位置或用户偏好，则使用了 Memory。若要自动修改文章，则还需要额外的写入权限和人工确认。</p><div><div><div></div><div>Tip</div></div><div><p><strong>AI 模型负责思考，MCP 负责连接外部能力，Skills 提供任务方法，Memory 提供上下文，Workflow 规定任务如何推进。它们共同构成了一个能够实际完成工作的 Agent。</strong></p></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2026/0420/</id>
      <title type="text">Vue3 封装命令式组件</title>
      <published>2026-04-20T00:00:00.000Z</published>
      <updated>2026-04-20T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2026/0420/"/>
      <summary type="text">封装命令式组件的几种方式</summary>
      <content type="html"><![CDATA[<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>命令式组件就是通过 <code>$message()</code>、<code>ElMessage()</code> 这种方式调用的组件，而不是在模板里写 <code>&lt;Message /&gt;</code>。</p></section>
<section><h2>创建命令式组件<a href="#创建命令式组件"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>import</span><span> { </span><span>ref</span><span> } </span><span>from</span><span> </span><span>"vue"</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>  </span><span>const</span><span> </span><span>messageShow</span><span> </span><span>=</span><span> </span><span>ref</span><span>(</span><span>false</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>function</span><span> </span><span>showMessage</span><span><span>(</span><span>text</span><span>) {</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>messageShow</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>  </span><span>function</span><span> </span><span>closeMessage</span><span>() {</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>messageShow</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>  </span><span>defineProps</span><span>({</span></div></div><div><div><div>15</div></div><div><span>    </span><span>message</span><span>:</span><span><span> </span><span>String</span><span>,</span></span></div></div><div><div><div>16</div></div><div><span>    </span><span>close</span><span>:</span><span> {</span></div></div><div><div><div>17</div></div><div><span>      </span><span>type</span><span>:</span><span><span> </span><span>Function</span><span>,</span></span></div></div><div><div><div>18</div></div><div><span>      </span><span>default</span><span>:</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>messageShow</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>25</div></div><div><span>&lt;</span><span>template</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>&lt;</span><span>div</span><span> </span><span>v-if</span><span>=</span><span>"messageShow"</span><span>&gt;{{ message }}&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>27</div></div><div><span>&lt;/</span><span>template</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h3>创建调用函数<a href="#创建调用函数"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>MessageBox</span><span> </span><span>from</span><span> </span><span>"./MessageBox.vue"</span><span>;</span></div></div><div><div><div>2</div></div><div><span>import</span><span> { </span><span>createApp</span><span> } </span><span>from</span><span> </span><span>"vue"</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>function</span><span><span>(</span><span>text</span><span>, </span><span>handler</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>const</span><span> </span><span>app</span><span> </span><span>=</span><span> </span><span>createApp</span><span>(</span><span>MessageBox</span><span>, {</span></div></div><div><div><div>6</div></div><div><span>    </span><span>message</span><span>:</span><span> </span><span>text</span><span>,</span></div></div><div><div><div>7</div></div><div><span>    </span><span>close</span><span>:</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>8</div></div><div><span>      </span><span>handler</span><span>?.();</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>app</span><span>.</span><span>unmount</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>      </span></span><span>document</span><span>.</span><span>body</span><span>.</span><span>removeChild</span><span>(</span><span>div</span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>13</div></div><div><span>  </span><span>const</span><span> </span><span>div</span><span> </span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>createElement</span><span>(</span><span>"div"</span><span>);</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>app</span><span>.</span><span>mount</span><span>(</span><span>div</span><span>);</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>document</span><span>.</span><span>body</span><span>.</span><span>appendChild</span><span>(</span><span>div</span><span>);</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>  </span><span>return</span><span> {</span></div></div><div><div><div>18</div></div><div><span>    </span><span>close</span><span>() {</span></div></div><div><div><div>19</div></div><div><span><span>      </span></span><span>app</span><span>.</span><span>unmount</span><span>();</span></div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>document</span><span>.</span><span>body</span><span>.</span><span>removeChild</span><span>(</span><span>div</span><span>);</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>使用<a href="#使用"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>msg</span><span> </span><span>=</span><span> </span><span>showMessage</span><span>(</span><span>"你好"</span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>msg</span><span>.</span></span><span>close</span><span>(); </span><span>// 手动关闭</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>缺陷<a href="#缺陷"><span>#</span></a></h3><p>这种方式创建的组件无法接收组件内的状态更新，比如子组件要主动关闭时，<code>close</code> 函数无法被正确调用。需要借助 <code>reactive</code> 或其他方式传递上下文。</p></section></section>
<section><h2>方式二：基于回调函数<a href="#方式二基于回调函数"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>import</span><span> { </span><span>ref</span><span> } </span><span>from</span><span> </span><span>"vue"</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>  </span><span>const</span><span> </span><span>messageShow</span><span> </span><span>=</span><span> </span><span>ref</span><span>(</span><span>false</span><span>);</span></div></div><div><div><div>5</div></div><div><span>  </span><span>const</span><span> </span><span>messageText</span><span> </span><span>=</span><span> </span><span>ref</span><span>(</span><span>""</span><span>);</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>  </span><span>function</span><span> </span><span>showMessage</span><span><span>(</span><span>text</span><span>, </span><span>onClose</span><span>) {</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>messageText</span><span>.</span><span>value</span><span> </span><span>=</span><span><span> </span><span>text</span><span>;</span></span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>messageShow</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>  </span><span>function</span><span> </span><span>closeMessage</span><span>() {</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>messageShow</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>14</div></div><div><span>    </span><span>onClose</span><span>?.();</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>  </span><span>defineProps</span><span>({</span></div></div><div><div><div>18</div></div><div><span>    </span><span>text</span><span>:</span><span><span> </span><span>String</span><span>,</span></span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>  </span><span>defineExpose</span><span><span>({ </span><span>showMessage</span><span>, </span><span>closeMessage</span><span> });</span></span></div></div><div><div><div>22</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>&lt;</span><span>template</span><span>&gt;</span></div></div><div><div><div>25</div></div><div><span><span>  </span></span><span>&lt;</span><span>div</span><span> </span><span>v-if</span><span>=</span><span>"messageShow"</span><span>&gt;{{ text }}&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span>&lt;/</span><span>template</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h3>使用<a href="#使用-1"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>Message</span><span> </span><span>from</span><span> </span><span>"./Message.vue"</span><span>;</span></div></div><div><div><div>2</div></div><div><span>import</span><span> { </span><span>createApp</span><span> } </span><span>from</span><span> </span><span>"vue"</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>function</span><span> </span><span>showMessage</span><span><span>(</span><span>text</span><span>, </span><span>onClose</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>const</span><span> </span><span>div</span><span> </span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>createElement</span><span>(</span><span>"div"</span><span>);</span></div></div><div><div><div>6</div></div><div><span>  </span><span>const</span><span> </span><span>app</span><span> </span><span>=</span><span> </span><span>createApp</span><span><span>(</span><span>Message</span><span>, {</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>text</span><span>,</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>onClose</span><span>,</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>app</span><span>.</span><span>mount</span><span><span>(</span><span>div</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>document</span><span>.</span><span>body</span><span>.</span><span>appendChild</span><span><span>(</span><span>div</span><span>);</span></span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>缺陷<a href="#缺陷-1"><span>#</span></a></h3><p>每次调用都会创建新的组件实例和 DOM 节点，且不支持多个消息同时存在。</p></section></section>
<section><h2>总结<a href="#总结"><span>#</span></a></h2>

<table><thead><tr><th>方式</th><th>优点</th><th>缺点</th></tr></thead><tbody><tr><td>方式一</td><td>简单直观</td><td>无法接收子组件状态更新</td></tr><tr><td>方式二</td><td>支持回调</td><td>每次调用都创建新实例，无法同时显示多个</td></tr></tbody></table><p>实际项目中，通常会结合发布订阅模式或单例模式来优化这些问题。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/1103/</id>
      <title type="text">Nuxt4备忘录</title>
      <published>2025-11-03T00:00:00.000Z</published>
      <updated>2025-11-03T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/1103/"/>
      <summary type="text">希望可以帮到你</summary>
      <content type="html"><![CDATA[<p>Nuxt4 官网地址: <a href="https://nuxt.com.cn" target="_blank">https://nuxt.com.cn</a></p>
<section><h2>数据获取<a href="#数据获取"><span>#</span></a></h2><ol>
<li><code>$fetch</code> 是 Nuxt 提供的一个基于 fetch API 的封装，用于在服务端和客户端获取数据。</li>
<li><code>useAsyncData</code> 是 Nuxt 提供的一个用于异步数据获取的 <code>composable</code> 函数，它可以在服务端和客户端分别获取数据，并将结果传递到客户端。</li>
<li><code>useFetch</code> 是 <code>useAsyncData</code> + <code>$fetch</code> 的简写方式，用于在服务端和客户端分别获取数据，并将结果传递到客户端。</li>
</ol><p><a href="https://nuxt.com.cn/docs/4.x/api/utils/dollarfetch" target="_blank">以下为官方示例</a></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span> </span><span>lang</span><span>=</span><span>"ts"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// SSR 期间：数据会在服务端和客户端分别获取一次</span></div></div><div><div><div>3</div></div><div><span>  </span><span>const</span><span> </span><span>dataTwice</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>$fetch</span><span>(</span><span>"/api/item"</span><span>);</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>  </span><span>// SSR 期间：数据只在服务端获取，并传递到客户端</span></div></div><div><div><div>6</div></div><div><span>  </span><span>const</span><span> { </span><span>data</span><span> } </span><span>=</span><span> </span><span>await</span><span> </span><span>useAsyncData</span><span>(</span><span>"item"</span><span>, () </span><span>=&gt;</span><span> </span><span>$fetch</span><span>(</span><span>"/api/item"</span><span>));</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>  </span><span>// useFetch 是 useAsyncData + $fetch 的简写方式</span></div></div><div><div><div>9</div></div><div><span>  </span><span>const</span><span> { </span><span>data</span><span> } </span><span>=</span><span> </span><span>await</span><span> </span><span>useFetch</span><span>(</span><span>"/api/item"</span><span>);</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>传递 Headers 和 Cookies<a href="#传递-headers-和-cookies"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span> </span><span>lang</span><span>=</span><span>"ts"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// SSR 期间不会转发 headers 或 cookies</span></div></div><div><div><div>3</div></div><div><span>  </span><span>const</span><span> { </span><span>data</span><span> } </span><span>=</span><span> </span><span>await</span><span> </span><span>useAsyncData</span><span>(() </span><span>=&gt;</span><span> </span><span>$fetch</span><span>(</span><span>"/api/cookies"</span><span>));</span></div></div><div><div><div>4</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果你需要在服务端转发 headers 和 cookies，必须手动传递它们：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span> </span><span>lang</span><span>=</span><span>"ts"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// 将用户的 headers 和 cookies 转发到 `/api/cookies`</span></div></div><div><div><div>3</div></div><div><span>  </span><span>const</span><span> </span><span>requestFetch</span><span> </span><span>=</span><span> </span><span>useRequestFetch</span><span>();</span></div></div><div><div><div>4</div></div><div><span>  </span><span>const</span><span> { </span><span>data</span><span> } </span><span>=</span><span> </span><span>await</span><span> </span><span>useAsyncData</span><span>(() </span><span>=&gt;</span><span> </span><span>requestFetch</span><span>(</span><span>"/api/cookies"</span><span>));</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不过，当你在服务端使用 <code>useFetch</code> 并传递相对路径时，Nuxt 会自动使用 <code>useRequestFetch</code> 来代理 <code>headers</code> 和 <code>cookies</code>（除了像 host 这样的禁止转发的 header）。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0710/</id>
      <title type="text">如何优化vue项目的白屏时间</title>
      <published>2025-07-10T00:00:00.000Z</published>
      <updated>2025-07-10T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0710/"/>
      <summary type="text">希望可以帮到你</summary>
      <content type="html"><![CDATA[<section><h2>使用defer优化白屏时间<a href="#使用defer优化白屏时间"><span>#</span></a></h2><p><strong>原理：</strong></p><ul>
<li>用 <strong>requestAnimationFrame</strong> 每帧自增一个计数器（<strong>frameCount++</strong>）。</li>
<li>当计数器达到你设定的帧数（<strong>maxCount</strong>）后，就停止递归调用。</li>
<li>暴露一个 <strong>defer(n)</strong> 方法，直接看当前计数是否 ≥ <strong>n</strong>，来判断“延迟 <strong>n</strong> 帧”是否完成。</li>
<li>组件销毁时用 <strong>cancelAnimationFrame</strong> 停掉循环，避免无用消耗。</li>
</ul><section><h3>vue3版本写法及使用<a href="#vue3版本写法及使用"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> { </span><span>onMounted</span><span>, </span><span>ref</span><span> } </span><span>from</span><span> </span><span>"vue"</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>export</span><span> </span><span>function</span><span> </span><span>useDefer</span><span><span>(</span><span>maxCount</span><span> </span></span><span>=</span><span> </span><span>60</span><span>) {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>const</span><span> </span><span>frameCount</span><span> </span><span>=</span><span> </span><span>ref</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>let</span><span><span> </span><span>rafId</span><span>;</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>  </span><span>function</span><span> </span><span>updateFrameCount</span><span>() {</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>rafId</span><span> </span><span>=</span><span> </span><span>requestAnimationFrame</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>      </span></span><span>frameCount</span><span>.</span><span>value</span><span> </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span>      </span><span>if</span><span><span> (</span><span>frameCount</span><span>.</span></span><span>value</span><span> </span><span>&gt;=</span><span><span> </span><span>maxCount</span><span>) </span></span><span>return</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>13</div></div><div><span>    </span><span>updateFrameCount</span><span>();</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>  </span><span>updateFrameCount</span><span>();</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>  </span><span>onMounted</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>19</div></div><div><span>    </span><span>cancelAnimationFrame</span><span><span>(</span><span>rafId</span><span>);</span></span></div></div><div><div><div>20</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>  </span><span>return</span><span> </span><span>function</span><span> </span><span>defer</span><span><span>(</span><span>n</span><span>) {</span></span></div></div><div><div><div>23</div></div><div><span>    </span><span>return</span><span><span> </span><span>frameCount</span><span>.</span></span><span>value</span><span> </span><span>&gt;=</span><span><span> </span><span>n</span><span>;</span></span></div></div><div><div><div>24</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>25</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>import</span><span> { </span><span>useDefer</span><span> } </span><span>from</span><span> </span><span>"@/utils/defer.js"</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>const</span><span> </span><span>defer</span><span> </span><span>=</span><span> </span><span>useDefer</span><span>();</span></div></div><div><div><div>4</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>template</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>&lt;</span><span>div</span><span> </span><span>v-for</span><span>=</span><span>"n in 100"</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span> </span><span>v-if</span><span>=</span><span>"defer(n)"</span><span>&gt;{{n}}&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>template</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>vue2版本写法及使用<a href="#vue2版本写法及使用"><span>#</span></a></h3><div><div><div><figure><figcaption><span>src/mixins/defer.js</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>default</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>props</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>maxCount</span><span>:</span><span> {</span></div></div><div><div><div>4</div></div><div><span>      </span><span>type</span><span>:</span><span> </span><span>Number</span><span>,</span></div></div><div><div><div>5</div></div><div><span>      </span><span>default</span><span>:</span><span> </span><span>60</span><span>,</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span>  </span><span>data</span><span>() {</span></div></div><div><div><div>9</div></div><div><span>    </span><span>return</span><span> {</span></div></div><div><div><div>10</div></div><div><span>      </span><span>frameCount</span><span>:</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>11</div></div><div><span>      </span><span>rafId</span><span>:</span><span> </span><span>null</span><span>,</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>14</div></div><div><span>  </span><span>created</span><span>() {</span></div></div><div><div><div>15</div></div><div><span>    </span><span>// 开始递归 RAF</span></div></div><div><div><div>16</div></div><div><span>    </span><span>const</span><span> </span><span>tick</span><span> </span><span>=</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>17</div></div><div><span>      </span><span>this</span><span>.</span><span>rafId</span><span> </span><span>=</span><span> </span><span>requestAnimationFrame</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>18</div></div><div><span>        </span><span>this</span><span>.</span><span>frameCount</span><span>++</span><span>;</span></div></div><div><div><div>19</div></div><div><span>        </span><span>// 未达到上限才继续</span></div></div><div><div><div>20</div></div><div><span>        </span><span>if</span><span> (</span><span>this</span><span>.</span><span>frameCount</span><span> </span><span>&lt;</span><span> </span><span>this</span><span>.</span><span>maxCount</span><span>) {</span></div></div><div><div><div>21</div></div><div><span>          </span><span>tick</span><span>();</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span><span>      </span></span><span>});</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>25</div></div><div><span>    </span><span>tick</span><span>();</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>27</div></div><div><span>  </span><span>beforeDestroy</span><span>() {</span></div></div><div><div><div>28</div></div><div><span>    </span><span>// 组件销毁前取消</span></div></div><div><div><div>29</div></div><div><span>    </span><span>cancelAnimationFrame</span><span>(</span><span>this</span><span>.</span><span>rafId</span><span>);</span></div></div><div><div><div>30</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>31</div></div><div><span>  </span><span>methods</span><span>:</span><span> {</span></div></div><div><div><div>32</div></div><div><span>    </span><span>defer</span><span><span>(</span><span>n</span><span>) {</span></span></div></div><div><div><div>33</div></div><div><span>      </span><span>return</span><span> </span><span>this</span><span>.</span><span>frameCount</span><span> </span><span>&gt;=</span><span> </span><span>n</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>35</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>36</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>import</span><span> </span><span>deferMixin</span><span> </span><span>from</span><span> </span><span>"@/mixins/defer"</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>  </span><span>export</span><span> </span><span>default</span><span> {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>name</span><span>:</span><span> </span><span>"MyComponent"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>    </span><span>mixins</span><span>:</span><span> [</span><span>deferMixin</span><span>],</span></div></div><div><div><div>7</div></div><div><span>    </span><span>// 如果需要修改默认 60 帧：</span></div></div><div><div><div>8</div></div><div><span>    </span><span>props</span><span>:</span><span> {</span></div></div><div><div><div>9</div></div><div><span>      </span><span>maxCount</span><span>:</span><span> {</span></div></div><div><div><div>10</div></div><div><span>        </span><span>type</span><span>:</span><span> </span><span>Number</span><span>,</span></div></div><div><div><div>11</div></div><div><span>        </span><span>default</span><span>:</span><span> </span><span>100</span><span>,</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>15</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span>&lt;</span><span>template</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>&lt;</span><span>div</span><span> </span><span>v-for</span><span>=</span><span>"n in 100"</span><span>&gt;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span> </span><span>v-if</span><span>=</span><span>"defer(n)"</span><span>&gt;{{n}}&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span>&lt;/</span><span>template</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0617/</id>
      <title type="text">如何阻止iframe自动聚焦导致页面滚动</title>
      <published>2025-06-17T00:00:00.000Z</published>
      <updated>2025-06-17T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0617/"/>
      <summary type="text">希望可以帮到你</summary>
      <content type="html"><![CDATA[<section><h2>阻止iframe加载后自动滚动<a href="#阻止iframe加载后自动滚动"><span>#</span></a></h2><ul>
<li>
<p><strong>原因：</strong> iframe加载完成后，会自动聚焦页面，导致页面滚动。</p>
</li>
<li>
<p><strong>解决：</strong> 默认隐藏 iframe，当 iframe 挂载后移除焦点，同时监听其加载完成事件。在加载完成后，将 <code>isLoad</code> 设置为 true 以显示 iframe。</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>v-show</span><span>=</span><span>"isLoad"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>iframe</span><span> </span><span>ref</span><span>=</span><span>"iframeRef"</span><span> </span><span>src</span><span>=</span><span>"https://www.baidu.com"</span><span> </span><span>@load</span><span>=</span><span>"iframeLoad"</span><span>&gt;&lt;/</span><span>iframe</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>  </span><span>const</span><span> </span><span>isLoad</span><span> </span><span>=</span><span> </span><span>ref</span><span>(</span><span>false</span><span>);</span></div></div><div><div><div>6</div></div><div><span>  </span><span>const</span><span> </span><span>iframeRef</span><span> </span><span>=</span><span> </span><span>useTemplateRef</span><span>(</span><span>"iframeRef"</span><span>);</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>  </span><span>function</span><span> </span><span>iframeLoad</span><span>() {</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>isLoad</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>  </span><span>onMounted</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>iframeRef</span><span>.</span><span>value</span><span>?.</span><span>blur</span><span>();</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>14</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0516/</id>
      <title type="text">Element Plus 自定义图片预览组件</title>
      <published>2025-05-16T00:00:00.000Z</published>
      <updated>2025-05-16T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0516/"/>
      <summary type="text">希望可以帮到你</summary>
      <content type="html"><![CDATA[<section><h2>创建一个图片预览组件<a href="#创建一个图片预览组件"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>setup</span><span> </span><span>lang</span><span>=</span><span>"ts"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>import</span><span> { </span><span>ref</span><span>, </span><span>watchEffect</span><span> } </span><span>from</span><span> </span><span>"vue"</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>const</span><span> </span><span>props</span><span> </span><span>=</span><span> </span><span>defineProps</span><span>&lt;{</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>imageList</span><span><span>?</span><span>:</span></span><span><span> </span><span>string</span><span>[];</span></span></div></div><div><div><div>6</div></div><div><span>}&gt;();</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>const</span><span> </span><span>visible</span><span> </span><span>=</span><span> </span><span>ref</span><span>(</span><span>false</span><span>);</span></div></div><div><div><div>9</div></div><div><span>const</span><span> </span><span>list</span><span> </span><span>=</span><span> </span><span>ref</span><span><span>&lt;</span><span>string</span><span>[]&gt;([]);</span></span></div></div><div><div><div>10</div></div><div><span>const</span><span> </span><span>currentIndex</span><span> </span><span>=</span><span> </span><span>ref</span><span><span>&lt;</span><span>number</span><span>&gt;(</span></span><span>0</span><span>);</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>watchEffect</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>13</div></div><div><span>  </span><span>const</span><span> { </span><span>imageList</span><span> } </span><span>=</span><span><span> </span><span>props</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>  </span><span>if</span><span> (</span><span>!</span><span><span>imageList</span><span>?.</span></span><span>length</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>list</span><span>.</span><span>value</span><span> </span><span>=</span><span> [</span><span>...</span><span><span>imageList</span><span>];</span></span></div></div><div><div><div>16</div></div><div><span>});</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>function</span><span> </span><span>open</span><span><span>(</span><span>data</span></span><span>:</span><span><span> { </span><span>previewIndex</span></span><span>:</span><span> </span><span>number</span><span> }) {</span></div></div><div><div><div>19</div></div><div><span>  </span><span>const</span><span> { </span><span>previewIndex</span><span> } </span><span>=</span><span><span> </span><span>data</span><span>;</span></span></div></div><div><div><div>20</div></div><div><span><span>  </span></span><span>currentIndex</span><span>.</span><span>value</span><span> </span><span>=</span><span><span> </span><span>previewIndex</span><span>;</span></span></div></div><div><div><div>21</div></div><div><span><span>  </span></span><span>visible</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>const</span><span> </span><span>emit</span><span> </span><span>=</span><span> </span><span>defineEmits</span><span>&lt;{</span></div></div><div><div><div>25</div></div><div><span><span>  </span></span><span>(</span><span>e</span><span>:</span><span> </span><span>"close"</span><span>)</span><span>:</span><span><span> </span><span>void</span><span>;</span></span></div></div><div><div><div>26</div></div><div><span>}&gt;();</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>function</span><span> </span><span>close</span><span>() {</span></div></div><div><div><div>29</div></div><div><span><span>  </span></span><span>visible</span><span>.</span><span>value</span><span> </span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>30</div></div><div><span>  </span><span>emit</span><span>(</span><span>"close"</span><span>);</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>// 切换图片时触发</span></div></div><div><div><div>34</div></div><div><span>function</span><span> </span><span>onSwitch</span><span><span>(</span><span>index</span></span><span>:</span><span> </span><span>number</span><span>) {</span></div></div><div><div><div>35</div></div><div><span><span>  </span></span><span>currentIndex</span><span>.</span><span>value</span><span> </span><span>=</span><span><span> </span><span>index</span><span>;</span></span></div></div><div><div><div>36</div></div><div><span>}</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>defineExpose</span><span>({</span></div></div><div><div><div>39</div></div><div><span><span>  </span></span><span>open</span><span>,</span></div></div><div><div><div>40</div></div><div><span><span>  </span></span><span>close</span><span>,</span></div></div><div><div><div>41</div></div><div><span>});</span></div></div><div><div><div>42</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div><span>&lt;</span><span>template</span><span>&gt;</span></div></div><div><div><div>45</div></div><div><span><span>  </span></span><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"image-preview"</span><span> </span><span>v-if</span><span>=</span><span>"visible"</span><span>&gt;</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>&lt;</span><span>el-image-viewer</span></div></div><div><div><div>47</div></div><div><span>      </span><span>:url-list</span><span>=</span><span>"list"</span></div></div><div><div><div>48</div></div><div><span>      </span><span>@close</span><span>=</span><span>"close"</span></div></div><div><div><div>49</div></div><div><span>      </span><span>@switch</span><span>=</span><span>"onSwitch"</span></div></div><div><div><div>50</div></div><div><span>      </span><span>:initial-index</span><span>=</span><span>"currentIndex"</span></div></div><div><div><div>51</div></div><div><span>      </span><span>show-progress</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>&gt;</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>&lt;/</span><span>el-image-viewer</span><span>&gt;</span></div></div><div><div><div>54</div></div><div><span><span>  </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>55</div></div><div><span>&lt;/</span><span>template</span><span>&gt;</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>&lt;</span><span>style</span><span> </span><span>scoped</span><span> </span><span>lang</span><span>=</span><span>"scss"</span><span>&gt;</span></div></div><div><div><div>58</div></div><div><span>#image-preview</span><span> {</span></div></div><div><div><div>59</div></div><div><span><span>  </span></span><span>position: </span><span>relative</span><span>;</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span><span>  </span></span><span>:</span><span>deep</span><span><span>(</span><span>.el-image-viewer__progress</span><span>) {</span></span></div></div><div><div><div>62</div></div><div><span><span>    </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>63</div></div><div><span><span>    </span></span><span>top: </span><span>0</span><span>;</span></div></div><div><div><div>64</div></div><div><span><span>    </span></span><span>height: </span><span><span>40</span><span>px</span></span><span>;</span></div></div><div><div><div>65</div></div><div><span><span>    </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>66</div></div><div><span><span>    </span></span><span>background: </span><span>rgba</span><span>(</span><span>0</span><span>, </span><span>0</span><span>, </span><span>0</span><span>, </span><span>0.1</span><span>);</span></div></div><div><div><div>67</div></div><div><span><span>    </span></span><span>border-radius: </span><span>0</span><span>;</span></div></div><div><div><div>68</div></div><div><span><span>    </span></span><span>font-weight: </span><span>400</span><span>;</span></div></div><div><div><div>69</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>70</div></div><div><span>}</span></div></div><div><div><div>71</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0511/</id>
      <title type="text">Electron</title>
      <published>2025-05-11T00:00:00.000Z</published>
      <updated>2025-05-11T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0511/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[<section><h2>增加多系统的窗口管理逻辑<a href="#增加多系统的窗口管理逻辑"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> { </span><span>BrowserWindow</span><span>, </span><span>app</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>function</span><span> </span><span>createWindow</span><span>() {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>const</span><span> </span><span>win</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>BrowserWindow</span><span>({</span></div></div><div><div><div>5</div></div><div><span>    </span><span>width</span><span>:</span><span> </span><span>800</span><span>,</span></div></div><div><div><div>6</div></div><div><span>    </span><span>height</span><span>:</span><span> </span><span>600</span><span>,</span></div></div><div><div><div>7</div></div><div><span>    </span><span>autoHideMenuBar</span><span>:</span><span> </span><span>true</span><span>, </span><span>// 自动隐藏菜单栏</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>win</span><span>.</span><span>loadURL</span><span>(</span><span>"https://blog.ddlyt.top/"</span><span>);</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>app</span><span>.</span></span><span>on</span><span>(</span><span>"ready"</span><span>, () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>13</div></div><div><span>  </span><span>createWindow</span><span>();</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>app</span><span>.</span><span>on</span><span>(</span><span>"activate"</span><span>, () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>15</div></div><div><span>    </span><span>// mac 当窗口数量为0时 则启动一个新窗口</span></div></div><div><div><div>16</div></div><div><span>    </span><span>if</span><span><span> (</span><span>BrowserWindow</span><span>.</span></span><span>getAllWindows</span><span>().</span><span>length</span><span> </span><span>===</span><span> </span><span>0</span><span>) </span><span>createWindow</span><span>();</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>18</div></div><div><span>});</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>// windows 关闭所有窗口时 退出应用</span></div></div><div><div><div>21</div></div><div><span><span>app</span><span>.</span></span><span>on</span><span>(</span><span>"window-all-closed"</span><span>, () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>22</div></div><div><span>  </span><span>if</span><span><span> (</span><span>process</span><span>.</span></span><span>platform</span><span> </span><span>!==</span><span> </span><span>"darwin"</span><span><span>) </span><span>app</span><span>.</span></span><span>quit</span><span>();</span></div></div><div><div><div>23</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>创建桥梁<a href="#创建桥梁"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> { </span><span>BrowserWindow</span><span>, </span><span>app</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>path</span><span> </span><span>=</span><span> </span><span>require</span><span>(</span><span>"path"</span><span>);</span></div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>win</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>BrowserWindow</span><span>({</span></div></div><div><div><div>4</div></div><div><span>  </span><span>width</span><span>:</span><span> </span><span>800</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>height</span><span>:</span><span> </span><span>600</span><span>,</span></div></div><div><div><div>6</div></div><div><span>  </span><span>autoHideMenuBar</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>7</div></div><div><span>  </span><span>webPreferences</span><span>:</span><span> {</span></div></div><div><div><div>8</div></div><div><span>    </span><span>preload</span><span>:</span><span><span> </span><span>path</span><span>.</span></span><span>join</span><span><span>(</span><span>__dirname</span><span>, </span></span><span>"./preload.js"</span><span>),</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>10</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>随后在根目录创建 <code>preload.js</code> 文件</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> { </span><span>contextBridge</span><span>, </span><span>ipcRenderer</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>contextBridge</span><span>.</span></span><span>exposeInMainWorld</span><span>(</span><span>"electronAPI"</span><span>, {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>version</span><span>:</span><span><span> </span><span>process</span><span>.</span></span><span>version</span><span>, </span><span>// 获取当前electron版本号</span></div></div><div><div><div>4</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在渲染进程中访问主进程内容</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>consloe</span><span>.</span></span><span>log</span><span><span>(</span><span>electronAPI</span><span>.</span></span><span>version</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>单向通信<a href="#单向通信"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 主进程</span></div></div><div><div><div>2</div></div><div><span>const</span><span> { </span><span>app</span><span>, </span><span>BrowserWindow</span><span>, </span><span>ipcMain</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>function</span><span> </span><span>writeFile</span><span><span>(</span><span>event</span><span>, </span><span>data</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>data</span><span>); </span></span><span>// 获取渲染进程传送过来的数据</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>function</span><span> </span><span>createWindow</span><span>() {</span></div></div><div><div><div>9</div></div><div><span>  </span><span>// ... 此处省略</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>ipcMain</span><span>.</span><span>on</span><span>(</span><span>"file-save"</span><span><span>, </span><span>writeFile</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span>  </span><span>// ... 加载页面</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span>preload.js</span></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> { </span><span>contextBridge</span><span>, </span><span>ipcRenderer</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>contextBridge</span><span>.</span></span><span>exposeInMainWorld</span><span>(</span><span>"electronAPI"</span><span>, {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>saveFile</span><span>:</span><span><span> (</span><span>data</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>ipcRenderer</span><span>.</span><span>send</span><span>(</span><span>"file-save"</span><span><span>, </span><span>data</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>6</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 渲染进程</span></div></div><div><div><div>2</div></div><div><span><span>electronAPI</span><span>.</span></span><span>saveFile</span><span>(</span><span>"发送数据"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>双向通信<a href="#双向通信"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 主进程</span></div></div><div><div><div>2</div></div><div><span>const</span><span> { </span><span>app</span><span>, </span><span>BrowserWindow</span><span>, </span><span>ipcMain</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>function</span><span> </span><span>readFile</span><span><span>(</span><span>event</span><span>, </span><span>data</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>const</span><span> </span><span>res</span><span> </span><span>=</span><span><span> </span><span>fs</span><span>.</span></span><span>readFileSync</span><span>(</span><span>"D:/hello.txt"</span><span>).</span><span>toString</span><span>();</span></div></div><div><div><div>6</div></div><div><span>  </span><span>return</span><span><span> </span><span>res</span><span>; </span></span><span>// 讲读取到的内容传回渲染进程</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>function</span><span> </span><span>createWindow</span><span>() {</span></div></div><div><div><div>10</div></div><div><span>  </span><span>// ... 此处省略</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>ipcMain</span><span>.</span><span>handle</span><span>(</span><span>"file-read"</span><span><span>, </span><span>readFile</span><span>);</span></span></div></div><div><div><div>12</div></div><div><span>  </span><span>// ... 加载页面</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span>preload.js</span></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> { </span><span>contextBridge</span><span>, </span><span>ipcRenderer</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>contextBridge</span><span>.</span></span><span>exposeInMainWorld</span><span>(</span><span>"electronAPI"</span><span>, {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>readFile</span><span>:</span><span> () </span><span>=&gt;</span><span> {</span></div></div><div><div><div>4</div></div><div><span>    </span><span>return</span><span><span> </span><span>ipcRenderer</span><span>.</span></span><span>invoke</span><span>(</span><span>"file-read"</span><span>);</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>6</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 渲染进程</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>res</span><span> </span><span>=</span><span> </span><span>await</span><span><span> </span><span>electronAPI</span><span>.</span></span><span>readFile</span><span>();</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>判断当前是否为打包环境<a href="#判断当前是否为打包环境"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 主进程</span></div></div><div><div><div>2</div></div><div><span>const</span><span> { </span><span>app</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>isDev</span><span> </span><span>=</span><span> </span><span>!</span><span><span>app</span><span>.</span></span><span>isPackaged</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>通过文件对象获取文件路径 (electron ^v32.0.0)<a href="#通过文件对象获取文件路径-electron-v3200"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//preload 预加载脚本</span></div></div><div><div><div>2</div></div><div><span>const</span><span> { </span><span>contextBridge</span><span>, </span><span>webUtils</span><span> } </span><span>=</span><span> </span><span>require</span><span>(</span><span>"electron"</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>contextBridge</span><span>.</span></span><span>exposeInMainWorld</span><span>(</span><span>"electron"</span><span>, {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>showFilePath</span><span><span>(</span><span>file</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>    </span><span>const</span><span> </span><span>path</span><span> </span><span>=</span><span><span> </span><span>webUtils</span><span>.</span></span><span>getPathForFile</span><span><span>(</span><span>file</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>    </span><span>alert</span><span>(</span><span>`Uploaded file path was: </span><span>${</span><span>path</span><span>}</span><span>`</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0509/</id>
      <title type="text">TypeScript</title>
      <published>2025-05-09T00:00:00.000Z</published>
      <updated>2025-05-09T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0509/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[<section><h2>类型运算符(typeof)<a href="#类型运算符typeof"><span>#</span></a></h2><p>在 <code>TypeScript</code> 中，<code>typeof</code> 操作符不仅可以用于获取值的运行时类型，还可以在类型上下文中使用，获取变量或属性的编译时类型。</p><section><h3>基础示例<a href="#基础示例"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>person</span><span> </span><span>=</span><span> { </span><span>name</span><span>:</span><span> </span><span>"兜兜"</span><span>, </span><span>age</span><span>:</span><span> </span><span>18</span><span> };</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>// 使用 typeof 获取 person 对象的类型</span></div></div><div><div><div>4</div></div><div><span>type</span><span> </span><span>Person</span><span> </span><span>=</span><span> </span><span>typeof</span><span><span> </span><span>person</span><span>;</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>/*</span></div></div><div><div><div>7</div></div><div><span>Person 类型等价于:</span></div></div><div><div><div>8</div></div><div><span>{</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>name: string;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>age: number;</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div><div><div><div>12</div></div><div><span>*/</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>function</span><span> </span><span>updatePerson</span><span><span>(</span><span>p</span></span><span>:</span><span> </span><span>Person</span><span>) {</span></div></div><div><div><div>15</div></div><div><span>  </span><span>// p 的类型是 { name: string; age: number; }</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>复杂对象类型获取<a href="#复杂对象类型获取"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>userInfo</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>id</span><span>:</span><span> </span><span>1</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>name</span><span>:</span><span> </span><span>"兜兜"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>roles</span><span>:</span><span> [</span><span>"admin"</span><span>, </span><span>"user"</span><span><span>] </span><span>as</span><span> </span></span><span>const</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>permissions</span><span>:</span><span> { </span><span>read</span><span>:</span><span> </span><span>true</span><span>, </span><span>write</span><span>:</span><span> </span><span>false</span><span>, </span><span>delete</span><span>:</span><span> </span><span>false</span><span> },</span></div></div><div><div><div>6</div></div><div><span>  </span><span>createdAt</span><span>:</span><span> </span><span>new</span><span> </span><span>Date</span><span>(),</span></div></div><div><div><div>7</div></div><div><span>};</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>// 使用 typeof 获取复杂对象的完整类型</span></div></div><div><div><div>10</div></div><div><span>type</span><span> </span><span>UserInfoType</span><span> </span><span>=</span><span> </span><span>typeof</span><span><span> </span><span>userInfo</span><span>;</span></span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>/* UserInfoType 等价于:</span></div></div><div><div><div>13</div></div><div><span>{</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>id: number;</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>name: string;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>roles: readonly ["admin", "user"];</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>permissions: {</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>read: boolean;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>write: boolean;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>delete: boolean;</span></div></div><div><div><div>21</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>createdAt: Date;</span></div></div><div><div><div>23</div></div><div><span><span> </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span><span> </span></span><span>*/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>函数类型获取<a href="#函数类型获取"><span>#</span></a></h3><ul>
<li><code>Parameters</code> 获取函数参数类型</li>
<li><code>ReturnType</code> 获取函数返回值类型</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>calculateTotal</span><span><span>(</span><span>items</span></span><span>:</span><span><span> { </span><span>price</span></span><span>:</span><span> </span><span>number</span><span><span>; </span><span>quantity</span></span><span>:</span><span> </span><span>number</span><span> }[]) {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>return</span><span><span> </span><span>items</span><span>.</span></span><span>reduce</span><span><span>((</span><span>total</span><span>, </span><span>item</span><span>) </span></span><span>=&gt;</span><span><span> </span><span>total</span><span> </span></span><span>+</span><span><span> </span><span>item</span><span>.</span></span><span>price</span><span> </span><span>*</span><span><span> </span><span>item</span><span>.</span></span><span>quantity</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div><div><div><div>4</div></div><div><span>// 获取函数的类型</span></div></div><div><div><div>5</div></div><div><span>type</span><span> </span><span>CalculateTotalType</span><span> </span><span>=</span><span> </span><span>typeof</span><span><span> </span><span>calculateTotal</span><span>;</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>// 获取函数参数类型</span></div></div><div><div><div>8</div></div><div><span>type</span><span> </span><span>CalculateTotalParams</span><span> </span><span>=</span><span> </span><span>Parameters</span><span>&lt;</span><span>typeof</span><span><span> </span><span>calculateTotal</span><span>&gt;;</span></span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>// 获取函数返回值类型</span></div></div><div><div><div>11</div></div><div><span>type</span><span> </span><span>CalculateTotalReturnType</span><span> </span><span>=</span><span> </span><span>ReturnType</span><span>&lt;</span><span>typeof</span><span><span> </span><span>calculateTotal</span><span>&gt;;</span></span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>// 使用示例</span></div></div><div><div><div>14</div></div><div><span>const</span><span> </span><span>items</span><span> </span><span>=</span><span> [</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>{ </span><span>price</span><span>:</span><span> </span><span>10</span><span>, </span><span>quantity</span><span>:</span><span> </span><span>2</span><span> },</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>{ </span><span>price</span><span>:</span><span> </span><span>5</span><span>, </span><span>quantity</span><span>:</span><span> </span><span>3</span><span> },</span></div></div><div><div><div>17</div></div><div><span>];</span></div></div><div><div><div>18</div></div><div><span>const</span><span> </span><span>total</span><span>:</span><span> </span><span>CalculateTotalReturnType</span><span> </span><span>=</span><span> </span><span>calculateTotal</span><span><span>(</span><span>items</span><span>); </span></span><span>// number</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>类和构造函数类型<a href="#类和构造函数类型"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span> </span><span>UserAccount</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>id</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>name</span></span><span>:</span><span> </span><span>string</span><span><span>, </span><span>id</span></span><span>:</span><span> </span><span>number</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>this</span><span>.</span><span>name</span><span> </span><span>=</span><span><span> </span><span>name</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span>    </span><span>this</span><span>.</span><span>id</span><span> </span><span>=</span><span><span> </span><span>id</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>  </span><span>getInfo</span><span>() {</span></div></div><div><div><div>9</div></div><div><span>    </span><span>return</span><span> </span><span>`</span><span>${</span><span>this</span><span>.</span><span>name</span><span>}</span><span> (</span><span>${</span><span>this</span><span>.</span><span>id</span><span>}</span><span>);`</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div><div><div><div>12</div></div><div><span>const</span><span> </span><span>userInstance</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>UserAccount</span><span>(</span><span>"兜兜"</span><span>, </span><span>1</span><span>);</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>// 获取实例类型</span></div></div><div><div><div>15</div></div><div><span>type</span><span> </span><span>UserInstanceType</span><span> </span><span>=</span><span> </span><span>typeof</span><span><span> </span><span>userInstance</span><span>;</span></span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>// 获取类的构造函数类型</span></div></div><div><div><div>18</div></div><div><span>type</span><span> </span><span>UserClassType</span><span> </span><span>=</span><span> </span><span>typeof</span><span><span> </span><span>UserAccount</span><span>;</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>// 使用类构造函数类型创建工厂函数</span></div></div><div><div><div>21</div></div><div><span>function</span><span> </span><span>createUser</span><span><span>(</span><span>ctor</span></span><span>:</span><span> </span><span>UserClassType</span><span><span>, </span><span>name</span></span><span>:</span><span> </span><span>string</span><span><span>, </span><span>id</span></span><span>:</span><span> </span><span>number</span><span>)</span><span>:</span><span> </span><span>InstanceType</span><span>&lt;</span><span>UserClassType</span><span>&gt; {</span></div></div><div><div><div>22</div></div><div><span>  </span><span>return</span><span> </span><span>new</span><span> </span><span>ctor</span><span><span>(</span><span>name</span><span>, </span><span>id</span><span>);</span></span></div></div><div><div><div>23</div></div><div><span>}</span></div></div><div><div><div>24</div></div><div><span>const</span><span> </span><span>newUser</span><span> </span><span>=</span><span> </span><span>createUser</span><span><span>(</span><span>UserAccount</span><span>, </span></span><span>"Murphy"</span><span>, </span><span>2</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>枚举类型获取<a href="#枚举类型获取"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>enum</span><span> </span><span>Direction</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>Up</span><span> </span><span>=</span><span> </span><span>"UP"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>Down</span><span> </span><span>=</span><span> </span><span>"DOWN"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>Left</span><span> </span><span>=</span><span> </span><span>"LEFT"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>Right</span><span> </span><span>=</span><span> </span><span>"RIGHT"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>// 获取枚举类型</span></div></div><div><div><div>9</div></div><div><span>type</span><span> </span><span>DirectionType</span><span> </span><span>=</span><span> </span><span>typeof</span><span><span> </span><span>Direction</span><span>;</span></span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>// 在运行时使用枚举</span></div></div><div><div><div>12</div></div><div><span>function</span><span> </span><span>move</span><span><span>(</span><span>direction</span></span><span>:</span><span> </span><span>Direction</span><span>) {</span></div></div><div><div><div>13</div></div><div><span>  </span><span>switch</span><span><span> (</span><span>direction</span><span>) {</span></span></div></div><div><div><div>14</div></div><div><span>    </span><span>case</span><span><span> </span><span>Direction</span><span>.</span></span><span>Up</span><span>:</span></div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"Moving up"</span><span>);</span></div></div><div><div><div>16</div></div><div><span>      </span><span>break</span><span>;</span></div></div><div><div><div>17</div></div><div><span>    </span><span>case</span><span><span> </span><span>Direction</span><span>.</span></span><span>Down</span><span>:</span></div></div><div><div><div>18</div></div><div><span><span>      </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"Moving down"</span><span>);</span></div></div><div><div><div>19</div></div><div><span>      </span><span>break</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div><div><div><div>22</div></div><div><span>// 使用 typeof 获取枚举成员的类型</span></div></div><div><div><div>23</div></div><div><span>type</span><span> </span><span>DirectionValue</span><span> </span><span>=</span><span> </span><span>DirectionType</span><span>[</span><span>keyof</span><span> </span><span>DirectionType</span><span>];</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>数组和元组类型获取<a href="#数组和元组类型获取"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>COLORS</span><span> </span><span>=</span><span> [</span><span>"red"</span><span>, </span><span>"green"</span><span>, </span><span>"blue"</span><span><span>] </span><span>as</span><span> </span></span><span>const</span><span>;</span></div></div><div><div><div>2</div></div><div><span>// 获取数组类型</span></div></div><div><div><div>3</div></div><div><span>type</span><span> </span><span>ColorsType</span><span> </span><span>=</span><span> </span><span>typeof</span><span> </span><span>COLORS</span><span>;</span></div></div><div><div><div>4</div></div><div><span>// COLORS 的类型是 readonly ["red", "green", "blue"]</span></div></div><div><div><div>5</div></div><div><span>// 而不是 string[]</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>// 使用 typeof 创建基于常量数组的类型</span></div></div><div><div><div>8</div></div><div><span>type</span><span> </span><span>Color</span><span> </span><span>=</span><span> (</span><span>typeof</span><span> </span><span>COLORS</span><span>)[</span><span>number</span><span>]; </span><span>// "red" | "green" | "blue"</span></div></div><div><div><div>9</div></div><div><span>const</span><span> </span><span>validColors</span><span>:</span><span> </span><span>Color</span><span>[] </span><span>=</span><span> [</span><span>"red"</span><span>, </span><span>"green"</span><span>]; </span><span>// 只能是 COLORS 中的值</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>结构类型（interface）<a href="#结构类型interface"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// noinspection JSAnnotator</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>interface</span><span> </span><span>User</span><span> {</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>id</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>const</span><span> </span><span>user</span><span>:</span><span> </span><span>User</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>9</div></div><div><span>  </span><span>name</span><span>:</span><span> </span><span>"兜兜"</span><span>,</span></div></div><div><div><div>10</div></div><div><span>  </span><span>id</span><span>:</span><span> </span><span>2</span><span>,</span></div></div><div><div><div>11</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>类使用接口声明<a href="#类使用接口声明"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>interface</span><span> </span><span>User</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>id</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>class</span><span> </span><span>UserAccount</span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>id</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>name</span></span><span>:</span><span> </span><span>string</span><span><span>, </span><span>id</span></span><span>:</span><span> </span><span>number</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>    </span><span>this</span><span>.</span><span>name</span><span> </span><span>=</span><span><span> </span><span>name</span><span>;</span></span></div></div><div><div><div>12</div></div><div><span>    </span><span>this</span><span>.</span><span>id</span><span> </span><span>=</span><span><span> </span><span>id</span><span>;</span></span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>const</span><span> </span><span>user</span><span>:</span><span> </span><span>User</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>UserAccount</span><span>(</span><span>"Murphy"</span><span>, </span><span>1</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>函数定义<a href="#函数定义"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>interface</span><span> </span><span>User</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>id</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>function</span><span> </span><span>getAdminUser</span><span>()</span><span>:</span><span> </span><span>User</span><span> {</span></div></div><div><div><div>7</div></div><div><span>  </span><span>//...</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>function</span><span> </span><span>deleteUser</span><span><span>(</span><span>user</span></span><span>:</span><span> </span><span>User</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>  </span><span>// ...</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>继承（extends）<a href="#继承extends"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>interface</span><span> </span><span>User</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>id</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>interface</span><span> </span><span>AdminUser</span><span> </span><span>extends</span><span> </span><span>User</span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>isAdmin</span><span>:</span><span> </span><span>boolean</span><span>;</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>const</span><span> </span><span>user</span><span>:</span><span> </span><span>AdminUser</span><span> </span><span>=</span><span> {};</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>组合类型 (|)<a href="#组合类型-"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>type</span><span> </span><span>MyBool</span><span> </span><span>=</span><span> </span><span>true</span><span> </span><span>|</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>function</span><span> </span><span>getLength</span><span><span>(</span><span>obj</span></span><span>:</span><span> </span><span>string</span><span> </span><span>|</span><span> </span><span>string</span><span>[]) {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>return</span><span><span> </span><span>obj</span><span>.</span></span><span>length</span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>泛型（&lt;&gt;）<a href="#泛型"><span>#</span></a></h2><p>泛型为类型提供变量。一个常见的例子是数组。没有泛型的数组可以包含任何东西。具有泛型的数组可以描述数组包含的值。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>type</span><span> </span><span>StringArray</span><span> </span><span>=</span><span> </span><span>Array</span><span><span>&lt;</span><span>string</span><span>&gt;;</span></span></div></div><div><div><div>2</div></div><div><span>type</span><span> </span><span>NumberArray</span><span> </span><span>=</span><span> </span><span>Array</span><span><span>&lt;</span><span>number</span><span>&gt;;</span></span></div></div><div><div><div>3</div></div><div><span>type</span><span> </span><span>ObjectWithNameArray</span><span> </span><span>=</span><span> </span><span>Array</span><span><span>&lt;{ </span><span>name</span></span><span>:</span><span><span> </span><span>string</span><span> }&gt;;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>可忽略参数 (?)<a href="#可忽略参数-"><span>#</span></a></h2><p>在函数中，我们可以使用?来表示一个参数是可选的。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>f</span><span><span>(</span><span>x</span></span><span>:</span><span> </span><span>number</span><span><span>, </span><span>y</span></span><span><span>?</span><span>:</span></span><span> </span><span>number</span><span>) {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>return</span><span><span> </span><span>x</span><span> </span></span><span>+</span><span><span> (</span><span>y</span><span> </span></span><span>||</span><span> </span><span>0</span><span>);</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>非空断言 (!)<a href="#非空断言-"><span>#</span></a></h2><ul>
<li><code>!</code> 是 TypeScript 的一个类型层面的操作符，用于告诉编译器：“我非常确定这个变量在此时不是 <code>null</code> 也不是
<code>undefined</code>”，因此可以安全使用其属性或方法，不会报类型错误。</li>
<li>它只在编译阶段有效，编译后会被移除，对最终 JS 输出不起任何作用。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>a</span><span>!</span><span>.</span><span>data</span><span>;</span></div></div><div><div><div>2</div></div><div><span>a</span><span>!</span><span>.</span><span>data</span><span>.</span><span>length</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>交叉类型 (&amp;)<a href="#交叉类型-"><span>#</span></a></h2><p>交叉类型（Intersection Types）通过 <code>&amp;</code> 运算符将多个类型合并为一个，表示同时具备所有类型的所有属性和方法。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>interface</span><span> </span><span>Dog</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>dogName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>dogAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>interface</span><span> </span><span>Cat</span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>catName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>catAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>type</span><span> </span><span>Pet</span><span> </span><span>=</span><span> </span><span>Dog</span><span> </span><span>&amp;</span><span> </span><span>Cat</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>const</span><span> </span><span>pet</span><span>:</span><span> </span><span>Pet</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>14</div></div><div><span>  </span><span>dogName</span><span>:</span><span> </span><span>"Murphy"</span><span>,</span></div></div><div><div><div>15</div></div><div><span>  </span><span>dogAge</span><span>:</span><span> </span><span>2</span><span>,</span></div></div><div><div><div>16</div></div><div><span>  </span><span>catName</span><span>:</span><span> </span><span>"Murphy"</span><span>,</span></div></div><div><div><div>17</div></div><div><span>  </span><span>catAge</span><span>:</span><span> </span><span>2</span><span>,</span></div></div><div><div><div>18</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>缺省运算 (Omit)<a href="#缺省运算-omit"><span>#</span></a></h2><p>使用 <code>Omit</code> 运算符可以删除对象中的某些属性。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>type</span><span> </span><span>Pet</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>dogName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>dogAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>catName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>catAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>6</div></div><div><span>};</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>// 删除 catName 和 catAge</span></div></div><div><div><div>9</div></div><div><span>type</span><span> </span><span>Dog</span><span> </span><span>=</span><span> </span><span>Omit</span><span>&lt;</span><span>Pet</span><span>, </span><span>"catName"</span><span> </span><span>|</span><span> </span><span>"catAge"</span><span>&gt;;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>挑选运算 (Pick)<a href="#挑选运算-pick"><span>#</span></a></h2><p>使用 <code>Pick</code> 运算符可以挑选对象中的某些属性。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>type</span><span> </span><span>Pet</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>dogName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>dogAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>catName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>catAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>6</div></div><div><span>};</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>type</span><span> </span><span>Dog</span><span> </span><span>=</span><span> </span><span>Pick</span><span>&lt;</span><span>Pet</span><span>, </span><span>"dogName"</span><span> </span><span>|</span><span> </span><span>"dogAge"</span><span>&gt;;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>可选运算 (Partial)<a href="#可选运算-partial"><span>#</span></a></h2><p>使用 <code>Partial</code> 运算符可以将所有属性变为可选。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>type</span><span> </span><span>Pet</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>dogName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>dogAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>catName</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>catAge</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>6</div></div><div><span>};</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>type</span><span> </span><span>Dog</span><span> </span><span>=</span><span> </span><span>Partial</span><span>&lt;</span><span>Pet</span><span>&gt;;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>Optional的实现及原理<a href="#optional的实现及原理"><span>#</span></a></h2><p><strong>原理：</strong></p><ul>
<li><code>K extends keyof T</code>：表示 <code>K</code> 必须是 <code>"name" | "age" | "email" | "isAdmin"</code> 中的一个或多个</li>
<li><code>Pick&lt;T, K&gt;</code>：从 <code>T</code> 中挑选出指定的 <code>K</code> 属性，返回一个新类型</li>
<li><code>Partial&lt;...&gt;</code>：将 <code>Pick</code> 出来的属性变成可选的</li>
<li><code>Omit&lt;T, K&gt;</code>：从原始类型 <code>T</code> 中排除掉 <code>K</code> 属性</li>
<li>最后将 <code>Omit</code> 和 <code>Partial</code> 的结果通过交叉类型 <code>&amp;</code> 组合起来</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>interface</span><span> </span><span>User</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>age</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>email</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>isAdmin</span><span>:</span><span> </span><span>boolean</span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>interface</span><span> </span><span>UserOptional</span><span> {</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>name</span><span><span>?</span><span>:</span></span><span> </span><span>string</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>age</span><span><span>?</span><span>:</span></span><span> </span><span>number</span><span>;</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>type</span><span> </span><span>Optional</span><span>&lt;</span><span>T</span><span>, </span><span>K</span><span> </span><span>extends</span><span> </span><span>keyof</span><span> </span><span>T</span><span>&gt; </span><span>=</span><span> </span><span>Omit</span><span>&lt;</span><span>T</span><span>, </span><span>K</span><span>&gt; </span><span>&amp;</span><span> </span><span>Partial</span><span>&lt;</span><span>Pick</span><span>&lt;</span><span>T</span><span>, </span><span>K</span><span>&gt;&gt;;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>type</span><span> </span><span>UserOptional</span><span> </span><span>=</span><span> </span><span>Optional</span><span>&lt;</span><span>User</span><span>, </span><span>"name"</span><span> </span><span>|</span><span> </span><span>"age"</span><span>&gt;;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>记录类型（Record）<a href="#记录类型record"><span>#</span></a></h2><p><code>Record</code> 是 TypeScript 中的一个实用类型，用于创建具有特定键值对类型的对象。它接受两个类型参数：键的类型和值的类型。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 示例：用户 ID 映射</span></div></div><div><div><div>2</div></div><div><span>type</span><span> </span><span>User</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>name</span><span>:</span><span> </span><span>string</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>id</span><span>:</span><span> </span><span>number</span><span>;</span></div></div><div><div><div>5</div></div><div><span>};</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>const</span><span> </span><span>users</span><span>:</span><span> </span><span>Record</span><span><span>&lt;</span><span>string</span><span>, </span></span><span>User</span><span>&gt; </span><span>=</span><span> {</span></div></div><div><div><div>8</div></div><div><span>  </span><span>u1</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>"兜兜"</span><span>, </span><span>id</span><span>:</span><span> </span><span>2</span><span> },</span></div></div><div><div><div>9</div></div><div><span>  </span><span>u2</span><span>:</span><span> { </span><span>name</span><span>:</span><span> </span><span>"Murphy"</span><span>, </span><span>id</span><span>:</span><span> </span><span>1</span><span> },</span></div></div><div><div><div>10</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>你也可以使用 <code>Record</code> 创建简单的键值对集合：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 字符串到数字的映射</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>scores</span><span>:</span><span> </span><span>Record</span><span><span>&lt;</span><span>string</span><span>, </span><span>number</span><span>&gt; </span></span><span>=</span><span> {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>math</span><span>:</span><span> </span><span>90</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>english</span><span>:</span><span> </span><span>85</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>science</span><span>:</span><span> </span><span>92</span><span>,</span></div></div><div><div><div>6</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>使用联合类型作为键<a href="#使用联合类型作为键"><span>#</span></a></h3><p>你可以通过联合类型来限制键的取值范围：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>type</span><span> </span><span>Color</span><span> </span><span>=</span><span> </span><span>"red"</span><span> </span><span>|</span><span> </span><span>"green"</span><span> </span><span>|</span><span> </span><span>"blue"</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>colorHex</span><span>:</span><span> </span><span>Record</span><span>&lt;</span><span>Color</span><span><span>, </span><span>string</span><span>&gt; </span></span><span>=</span><span> {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>red</span><span>:</span><span> </span><span>"#FF0000"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>green</span><span>:</span><span> </span><span>"#00FF00"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>  </span><span>blue</span><span>:</span><span> </span><span>"#0000FF"</span><span>,</span></div></div><div><div><div>7</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0214/</id>
      <title type="text">微信小程序原生开发</title>
      <published>2025-02-14T00:00:00.000Z</published>
      <updated>2025-02-14T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0214/"/>
      <summary type="text">开发体验极差</summary>
      <content type="html"><![CDATA[<section><h2>数据的创建与修改<a href="#数据的创建与修改"><span>#</span></a></h2><p>使用 <code>wx.setData()</code> 方法修改数据，使用 <code>this.data</code> 方法获取数据。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>data</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>value</span><span>:</span><span> </span><span>1</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>obj</span><span>:</span><span> {</span></div></div><div><div><div>5</div></div><div><span>      </span><span>a</span><span>:</span><span> </span><span>1</span><span>,</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span>  </span><span>onLoad</span><span>() {</span></div></div><div><div><div>9</div></div><div><span>    </span><span>// 修改数据</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>wx</span><span>.</span><span>setData</span><span>({</span></div></div><div><div><div>11</div></div><div><span>      </span><span>value</span><span>:</span><span> </span><span>2</span><span>,</span></div></div><div><div><div>12</div></div><div><span>      </span><span>"obj.a"</span><span>:</span><span> </span><span>2</span><span>,</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>15</div></div><div><span>  </span><span>onReady</span><span>() {</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>this</span><span>.</span><span>data</span><span>.</span><span>value</span><span>);</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>18</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>点击事件<a href="#点击事件"><span>#</span></a></h2><section><h4>触发方式<a href="#触发方式"><span>#</span></a></h4><p>微信小程序中的点击事件为 <code>bindtap</code></p></section><section><h4>传递参数<a href="#传递参数"><span>#</span></a></h4><p>微信小程序传递方法如下</p><section><h5>index.wxml<a href="#indexwxml"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>button</span><span> </span><span>class</span><span>=</span><span>"right-btn"</span><span> </span><span>bindtap</span><span>=</span><span>"open"</span><span> </span><span>data-id</span><span>=</span><span>"{{info.id}}"</span><span>&gt;查看详情&lt;/</span><span>button</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>index.js<a href="#indexjs"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>open</span><span><span>(</span><span>e</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>e</span><span>.</span></span><span>currentTarget</span><span>.</span><span>dataset</span><span>.</span><span>id</span><span>) </span><span>// 获取到传递的参数</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h2>阻止事件冒泡<a href="#阻止事件冒泡"><span>#</span></a></h2><p>使用 <code>catchtap</code> 阻止事件冒泡。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>view</span><span> </span><span>bindtap</span><span>=</span><span>"open"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>button</span><span> </span><span>class</span><span>=</span><span>"right-btn"</span><span> </span><span>catchtap</span><span>=</span><span>"open"</span><span> </span><span>bindtap</span><span>=</span><span>"show"</span><span>&gt;查看详情&lt;/</span><span>button</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>view</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>单向绑定<a href="#单向绑定"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"{{1}}"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>双向绑定<a href="#双向绑定"><span>#</span></a></h2><p>需要注意的是仅支持基本类型，类似于 <code>data.value</code> 是非法的。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>input</span><span> </span><span>model:value</span><span>=</span><span>"{{value}}"</span><span> /&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>子组件获取参数<a href="#子组件获取参数"><span>#</span></a></h2><p>子组件通过 <code>properties</code> 获取参数。</p><p>父组件传参</p><section><h5>index.wxml<a href="#indexwxml-1"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>component</span><span> </span><span>value</span><span>=</span><span>"1"</span><span>&gt;&lt;/</span><span>component</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>子组件接收</p></section><section><h5>component.js<a href="#componentjs"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Component</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>properties</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>value</span><span>:</span><span> {</span></div></div><div><div><div>4</div></div><div><span>      </span><span>type</span><span>:</span><span><span> </span><span>Number</span><span>,</span></span></div></div><div><div><div>5</div></div><div><span>      </span><span>value</span><span>:</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>父组件调用子组件方法<a href="#父组件调用子组件方法"><span>#</span></a></h2><p>使用 <code>selectComponent</code> 获取子组件实例，调用子组件方法。</p><section><h5>component.js<a href="#componentjs-1"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Component</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>methods</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>open</span><span>() {</span></div></div><div><div><div>4</div></div><div><span><span>      </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"子组件方法被调用了"</span><span>);</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>index.wxml<a href="#indexwxml-2"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>button</span><span> </span><span>bindtap</span><span>=</span><span>"open"</span><span>&gt;调用子组件方法&lt;/</span><span>button</span><span>&gt; &lt;</span><span>component</span><span> </span><span>id</span><span>=</span><span>"child"</span><span>&gt;&lt;/</span><span>component</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>index.js<a href="#indexjs-1"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>open</span><span>() {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>const</span><span> </span><span>child</span><span> </span><span>=</span><span> </span><span>this</span><span>.</span><span>selectComponent</span><span>(</span><span>"#child"</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>child</span><span>.</span><span>open</span><span>();</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>6</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>子组件调用父组件方法<a href="#子组件调用父组件方法"><span>#</span></a></h2><p>子组件通过 <code>this.triggerEvent</code> 触发事件，父组件通过 <code>bind</code> 绑定事件。</p><section><h5>component.js<a href="#componentjs-2"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Component</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>methods</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>open</span><span>() {</span></div></div><div><div><div>4</div></div><div><span>      </span><span>this</span><span>.</span><span>triggerEvent</span><span>(</span><span>"open"</span><span>, { </span><span>a</span><span>:</span><span> </span><span>"参数"</span><span> });</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>index.wxml<a href="#indexwxml-3"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>component</span><span> </span><span>bind:open</span><span>=</span><span>"open"</span><span>&gt;&lt;/</span><span>component</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>index.js<a href="#indexjs-2"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>open</span><span><span>(</span><span>data</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"父组件方法被调用了"</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>data</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>6</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>路由跳转方法<a href="#路由跳转方法"><span>#</span></a></h2><ol>
<li><code>wx.navigateTo()</code> 保留当前页，跳转到应用内部某个页面。<strong>小程序中页面栈最多十层</strong>。</li>
<li><code>wx.redirectTo()</code> 关闭当前页面，跳转到应用内部某个页面。</li>
<li><code>wx.switchTab()</code> 跳转到 <strong>tabBar</strong> 页面，并关闭其他所有非 <strong>tabBar</strong> 页面。</li>
<li><code>wx.reLaunch()</code> 关闭所有页面，打开到应用内的某个页面。</li>
<li><code>wx.navigateBack()</code> 关闭当前页面，返回上一页面或多级页面。</li>
</ol><p>详情请查看 <a href="https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab.html" target="_blank">微信官方文档</a></p></section>
<section><h2>页面下拉刷新<a href="#页面下拉刷新"><span>#</span></a></h2><p>在需要开启的页面 <code>json</code> 文件中添加 <code>enablePullDownRefresh</code> 属性，值为 <code>true</code> ，即可开启下拉刷新功能。</p><p>使用 <code>wx.stopPullDownRefresh()</code> 停止下拉刷新。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// 下拉刷新</span></div></div><div><div><div>3</div></div><div><span>  </span><span>onPullDownRefresh</span><span>() {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"下拉刷新"</span><span>);</span></div></div><div><div><div>5</div></div><div><span>    </span><span>setTimeout</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>6</div></div><div><span>      </span><span>// 停止下拉刷新</span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>wx</span><span>.</span><span>stopPullDownRefresh</span><span>();</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}, </span><span>1000</span><span>);</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>10</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>本地存储<a href="#本地存储"><span>#</span></a></h2><ol>
<li><code>wx.setStorageSync()</code> 设置本地存储</li>
<li><code>wx.getStorageSync()</code> 获取本地存储</li>
</ol></section>
<section><h2>wx<a href="#wx"><span>#</span></a></h2><p>循环渲染列表，使用 <code>wx:for</code> 属性，值为 <code>Array</code> 。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>view</span><span> </span><span>wx:for</span><span>=</span><span>"{{list}}"</span><span> </span><span>wx:for-item</span><span>=</span><span>"item"</span><span> </span><span>wx:for-index</span><span>=</span><span>"index"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>view</span><span>&gt;{{item}}&lt;/</span><span>view</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>view</span><span>&gt;{{index}}&lt;/</span><span>view</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;/</span><span>view</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>wx<a href="#wx-1"><span>#</span></a></h2><p>条件渲染，使用 <code>wx:if</code> 属性，值为 <code>Boolean</code> 。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>view</span><span> </span><span>wx:if</span><span>=</span><span>"{{true}}"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>view</span><span>&gt;条件渲染&lt;/</span><span>view</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>view</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>view</span><span> </span><span>wx:else</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&lt;</span><span>view</span><span>&gt;条件渲染&lt;/</span><span>view</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;/</span><span>view</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>数据监听器<a href="#数据监听器"><span>#</span></a></h2><p>监听器使用 <code>observers</code> 属性 。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>observers</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"numberA, numberB"</span><span>:</span><span> </span><span>function</span><span><span> (</span><span>numberA</span><span>, </span><span>numberB</span><span>) {</span></span></div></div><div><div><div>4</div></div><div><span>      </span><span>// 在 numberA 或者 numberB 被设置时，执行这个函数</span></div></div><div><div><div>5</div></div><div><span>      </span><span>this</span><span>.</span><span>setData</span><span>({</span></div></div><div><div><div>6</div></div><div><span>        </span><span>sum</span><span>:</span><span><span> </span><span>numberA</span><span> </span></span><span>+</span><span><span> </span><span>numberB</span><span>,</span></span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>});</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>10</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>详情请查看 <a href="https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/observer.html" target="_blank">微信官方文档</a></p></section>
<section><h2>页面通讯<a href="#页面通讯"><span>#</span></a></h2><p>在打开新页面时，可使用 <code>events</code> 实现页面之间的通讯。</p><div><div><div><figure><figcaption><span>index.js</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>open</span><span>() {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>wx</span><span>.</span><span>navigateTo</span><span>({</span></div></div><div><div><div>4</div></div><div><span>      </span><span>url</span><span>:</span><span> </span><span>"/pages/detail/detail"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>      </span><span>events</span><span>:</span><span> {</span></div></div><div><div><div>6</div></div><div><span>        </span><span>// 为指定事件添加一个监听器，获取被打开页面传送到当前页面的数据</span></div></div><div><div><div>7</div></div><div><span>        </span><span>acceptDataFromOpenedPage</span><span>:</span><span> </span><span>function</span><span><span> (</span><span>data</span><span>) {</span></span></div></div><div><div><div>8</div></div><div><span><span>          </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>data</span><span>);</span></span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>},</span></div></div><div><div><div>10</div></div><div><span>        </span><span>someEvent</span><span>:</span><span> </span><span>function</span><span><span> (</span><span>data</span><span>) {</span></span></div></div><div><div><div>11</div></div><div><span><span>          </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>data</span><span>);</span></span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>},</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>14</div></div><div><span>      </span><span>success</span><span>:</span><span> </span><span>function</span><span><span> (</span><span>res</span><span>) {</span></span></div></div><div><div><div>15</div></div><div><span>        </span><span>// 通过eventChannel向被打开页面传送数据</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>res</span><span>.</span><span>eventChannel</span><span>.</span><span>emit</span><span>(</span><span>"acceptDataFromOpenerPage"</span><span>, { </span><span>data</span><span>:</span><span> </span><span>"test"</span><span> });</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>20</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><div><div><figure><figcaption><span>detail.js</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>onLoad</span><span>:</span><span> </span><span>function</span><span><span> (</span><span>option</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>const</span><span> </span><span>eventChannel</span><span> </span><span>=</span><span> </span><span>this</span><span>.</span><span>getOpenerEventChannel</span><span>();</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>// 调用 index.js 中的 acceptDataFromOpenedPage 方法</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>eventChannel</span><span>.</span><span>emit</span><span>(</span><span>"acceptDataFromOpenedPage"</span><span>, { </span><span>data</span><span>:</span><span> </span><span>"test"</span><span> });</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>// 调用 index.js 中的 someEvent 方法</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>eventChannel</span><span>.</span><span>emit</span><span>(</span><span>"someEvent"</span><span>, { </span><span>data</span><span>:</span><span> </span><span>"test"</span><span> });</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>// 监听acceptDataFromOpenerPage事件，获取上一页面通过eventChannel传送到当前页面的数据</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>eventChannel</span><span>.</span><span>on</span><span>(</span><span>"acceptDataFromOpenerPage"</span><span>, </span><span>function</span><span><span> (</span><span>data</span><span>) {</span></span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>data</span><span>);</span></span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>16</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>手机上预览效果非常卡<a href="#手机上预览效果非常卡"><span>#</span></a></h2><p>有时候会碰到，模拟器上很流畅，但是在移动端预览时，页面异常卡顿，以下是一些解决方法</p><ol>
<li>尝试将真机调试更改为局域网模式</li>
<li>使用真机预览功能，而非真机调试</li>
<li>发布体验版再次查看是否卡顿</li>
</ol></section>
<section><h2>需要在体验版访问http域名？<a href="#需要在体验版访问http域名"><span>#</span></a></h2><p>上传至体验版后打开小程序调试模式即可不受域名限制</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0210/</id>
      <title type="text">什么？都5202年了，你还不会Grid布局？</title>
      <published>2025-02-10T00:00:00.000Z</published>
      <updated>2025-02-10T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0210/"/>
      <summary type="text">一些Grid布局的基本语法</summary>
      <content type="html"><![CDATA[<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>CSS Grid的功能远比我们想象的要强，很多人对Gird布局仅仅局限于了解或者一知半解，殊不知它是CSS语言中最牛逼的部分之一。</p></section>
<section><h2>参数<a href="#参数"><span>#</span></a></h2><section><h3>grid-column-start<a href="#grid-column-start"><span>#</span></a></h3><p>用于指定网格项目在列方向上的起始位置。通过定义项目从哪条列线开始放置，你可以精确控制其在网格中的布局。</p><blockquote><p>grid-column-start 用于水平方向 <br />
grid-row-start 用于垂直方向</p></blockquote><p>支持负数</p><section><h4>示例<a href="#示例"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.container</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>.item</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>grid-column-start: </span><span>2</span><span>; </span><span>/* 从第2列线开始 */</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>grid-column-end<a href="#grid-column-end"><span>#</span></a></h3><p>用于指定网格项目在列方向上的结束位置。</p><blockquote><p>grid-column-end 用于水平方向 <br />
grid-row-end 用于垂直方向</p></blockquote><p>支持负数</p><section><h4>示例<a href="#示例-1"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.container</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>.item</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>grid-column-start: </span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>grid-column-end: </span><span>4</span><span>;</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>span<a href="#span"><span>#</span></a></h3><p>用于指定网格项目在列方向上跨越的宽度。</p><p>请注意 <code>span</code> 只能是正值。</p><section><h4>示例<a href="#示例-2"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.container</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>.item</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>grid-column-start: </span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>grid-column-end: span </span><span>2</span><span>;</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>grid-column<a href="#grid-column"><span>#</span></a></h3><p>用于同时设置 <code>grid-column-start</code> 和 <code>grid-column-end</code>。</p><p>同时也支持 <a href="#span">span</a></p><section><h4>示例<a href="#示例-3"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.container</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>.item</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>grid-column: </span><span>2</span><span> / </span><span>4</span><span>; </span><span>/* 第二列线开始，到第四列线结束 */</span></div></div><div><div><div>9</div></div><div><span>  </span><span>/* 相对于第五列线，初始位置向左跨越两列 */</span></div></div><div><div><div>10</div></div><div><span>  </span><span>/* grid-column: span 2 / 4; */</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>grid-row<a href="#grid-row"><span>#</span></a></h3><p>用于同时设置 <code>grid-row-start</code> 和 <code>grid-row-end</code>。</p><p>同样也支持 <a href="#span">span</a></p><section><h4>示例<a href="#示例-4"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.container</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>.item</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>grid-row: span </span><span>3</span><span> / </span><span>-1</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>grid-area<a href="#grid-area"><span>#</span></a></h3><p>grid-area属性接受4个由 <code>/</code> 分开的值：<code>grid-row-start</code>, <code>grid-column-start</code>, <code>grid-row-end</code>, 最后是<code>grid-column-end</code>。</p><p>同时也支持 <a href="#span">span</a></p><section><h4>示例<a href="#示例-5"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.container</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>.item</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>grid-area: </span><span>1</span><span> / </span><span>1</span><span> / </span><span>3</span><span> / </span><span>6</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>order<a href="#order"><span>#</span></a></h3><p>order属性用于控制网格项目在网格中的显示顺序。默认情况下，所有网格项目顺序都是0，但是顺序也可以被任意设置为正数或者负数，就像
<code>z-index</code> 一样。</p><blockquote><p>注意：order属性只影响网格项目在网格中的显示顺序，而不影响其位置。</p></blockquote><section><h4>示例<a href="#示例-6"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#garden</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>.water</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>order: </span><span>0</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>#poison</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>order: </span><span>1</span><span>; </span><span>/* 该项会被放在最后面 */</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>grid-template-columns<a href="#grid-template-columns"><span>#</span></a></h3><p>grid-template-columns属性用于设置网格的列数，并且可以设置列的宽度。</p><section><h4>示例<a href="#示例-7"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#garden</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>/* 5行3列 */</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span><span>50</span><span>%</span></span><span> </span><span><span>30</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>grid-template-rows: </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span> </span><span><span>20</span><span>%</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>#water</span><span> {</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>grid-column: </span><span>1</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>grid-row: </span><span>1</span><span>;</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>repeat<a href="#repeat"><span>#</span></a></h3><p><code>repeat()</code> 函数用于重复一个模板。</p><p>比如 5 列宽度均为 20% 的模板，可以写成 <code>grid-template-columns: repeat(5, 20%);</code></p></section><section><h3>fr<a href="#fr"><span>#</span></a></h3><p>网格系统也引入了一个新的单位，分数<strong>fr</strong>。每一个<strong>fr</strong>
单元分配一个可用的空间。比如说，如果两个元素分别被设置为1fr和3fr，那么空间就会被平均分配为4份；第一个元素占据1/4，第二个元素占据3/4。</p><section><h4>fr 和 % 的区别<a href="#fr-和--的区别"><span>#</span></a></h4><ol>
<li>% 模式下：随着父容器的缩放，当子容器分配到的空间过小时，容器会被挤压</li>
<li>fr 模式下：即使父容器宽度再小，子容器都不会被挤压，能保持正常展示</li>
</ol></section></section><section><h3>grid-template<a href="#grid-template"><span>#</span></a></h3><p><code>grid-template</code> 属性是 <code>grid-template-rows</code> 和 <code>grid-template-columns</code> 的简写。</p><p>比如说，<code>grid-template: 50% 50% / 200px;</code>将创建一个具有两行的网格，每一行占据50%，以及一个200像素宽的列。</p></section><section><h3>gap<a href="#gap"><span>#</span></a></h3><p><code>gap</code> 属性是 <code>grid-row-gap</code> 和 <code>grid-column-gap</code> 的简写。</p><p><code>gap</code> 属性接受两个参数，第一个参数是行间距，第二个参数是列间距。</p></section><section><h3>minmax<a href="#minmax"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.parent</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>grid</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>grid-template-columns: </span><span>repeat</span><span><span>(</span><span>auto-fit</span><span>, </span></span><span>minmax</span><span>(</span><span>min</span><span>(</span><span><span>100</span><span>%</span></span><span>, </span><span><span>100</span><span>px</span></span><span>), </span><span><span>1</span><span>fr</span></span><span>));</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>auto-fit</code> 网格项会拉伸以填充整个网格容器的宽度，即便是在网格项不足以填满行时</li>
<li><code>minmax()</code> 定义的范围大于或等于 min， 小于或等于 max</li>
<li><code>min()</code> 函数，返回两个参数中的最小值</li>
</ul></section><section><h3>grid-auto-columns<a href="#grid-auto-columns"><span>#</span></a></h3><p><code>grid-auto-columns</code> 属性用于定义自动生成的网格项的宽度。</p></section></section>
<section><h2>结尾<a href="#结尾"><span>#</span></a></h2><p>这里推荐一个 <a href="https://cssgridgarden.com/#zh-cn" target="_blank">Grid布局</a> 练习网站。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0206-1/</id>
      <title type="text">UniApp</title>
      <published>2025-02-06T00:00:00.000Z</published>
      <updated>2025-02-06T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0206-1/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[<section><h2>获取状态栏高度<a href="#获取状态栏高度"><span>#</span></a></h2><p>在 <strong>uni-app</strong> 中可以使用全局变量 <code>--status-bar-height</code> 来获取状态栏高度</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.myHead</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>padding-top: </span><span>var</span><span>(</span><span>--status-bar-height</span><span>);</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>去除默认顶栏内容<a href="#去除默认顶栏内容"><span>#</span></a></h2><p>在 <code>pages.json</code> 文件中加入以下内容即可去除默认顶栏</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"globalStyle"</span><span>: {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"navigationStyle"</span><span>: </span><span>"custom"</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>路由跳转<a href="#路由跳转"><span>#</span></a></h2><p>与 <strong>vue</strong> 不同的是 <strong>uni-app</strong> 使用 <code>uni.navigateTo</code> api实现路由跳转</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>uni</span><span>.</span></span><span>navigateTo</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>url</span><span>:</span><span> </span><span>`/pages/detail/detail?id=</span><span>${</span><span>id</span><span>}</span><span>`</span><span>,</span></div></div><div><div><div>3</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>开启页面下拉刷新<a href="#开启页面下拉刷新"><span>#</span></a></h2><p>在路由配置中添加 <code>enablePullDownRefresh</code> 即可开启</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"pages"</span><span>: [</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>4</div></div><div><span>      </span><span>"path"</span><span>: </span><span>"pages/index/index"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>      </span><span>"style"</span><span>: {</span></div></div><div><div><div>6</div></div><div><span>        </span><span>"enablePullDownRefresh"</span><span>: </span><span>true</span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>]</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0206-2/</id>
      <title type="text">HBuilder X 怎么使用真机无线调试</title>
      <published>2025-02-06T00:00:00.000Z</published>
      <updated>2025-02-06T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0206-2/"/>
      <summary type="text">如何在手机上调试 uni-app 应用程序</summary>
      <content type="html"><![CDATA[<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>在使用 HBuilder X 开发 uni-app 应用时，经常需要预览在手机上的效果，大多数时候都是使用模拟器来调试。但是，从 <code>android 11</code> 开始，usb调试新增了<strong>无线调试</strong>功能，允许设备通过局域网进行调试，无需root权限。</p><p>那么接下来，我们来介绍一下如何使用 HBuilder X 真机无线调试 uni-app 应用。</p></section>
<section><h2>准备工作<a href="#准备工作"><span>#</span></a></h2><ol>
<li>设备开启开发者选项（一般点击五次系统版本号即可开启）</li>
<li>在开发者选项中找到 调试-&gt;无线调试 选项，并开启。这里需要记录一下 IP地址和端口号，后面会用到 例如我这里是：<code>192.168.31.10:38631</code>
<figure><img src="https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/250206-1.png" alt="开启无线调试" /><figcaption>开启无线调试</figcaption></figure></li>
<li>点击使用配对码配对设备，并保持在该页面不要退出，同样记录一下 配对码 和 端口号，后面会用到。我这里是 <code>192.168.31.10:37917</code>
<figure><img src="https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/250206-3.png" alt="配对码配对设备" /><figcaption>配对码配对设备</figcaption></figure></li>
</ol></section>
<section><h2>启动调试<a href="#启动调试"><span>#</span></a></h2><ol>
<li>在Pc端下载adb工具 adb最新版下载入口 <a href="https://developer.android.google.cn/studio/releases/platform-tools" target="_blank">SDK Platform Tools</a></li>
<li>将工具解压至 HBuilderX 根目录 下 的 <code>plugins\launcher-tools\tools\adbs</code> 下
<figure><img src="https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/250206-5.png" alt="工具目录" /><figcaption>工具目录</figcaption></figure></li>
<li>在 HBuilder X 中 点击 <code>工具</code> -&gt; <code>设置</code> -&gt; <code>运行配置</code> 将adb运行目录更改为工具所在目录。
例如我这里是：<code>HBuilderX/plugins/launcher-tools/tools/adbs/35.0.2/adb.exe</code></li>
<li>进入工具所在目录，在目录地址栏中输入 <code>cmd</code> 打开cmd终端
<figure><img src="https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/250206-4.png" alt="使用cmd打开" /><figcaption>使用cmd打开</figcaption></figure></li>
<li>在cmd终端输入 <code>adb pair</code> 后面跟 配对IP和端口号，我这里的完整命令是：<code>adb pair 192.168.31.10:37917</code> 接着输入配对码：<strong>870186</strong> 即可完成配对。
当终端中提示 <code>Successfully paired to 。。。。</code> 时，则表示配对成功。</li>
<li>接着输入 <code>adb connect</code> 后面跟 IP和端口号连接设备，我这里的完整命令是：<code>adb connect 192.168.31.10:38631</code> ，当终端中提示 <code>connected to 。。。。</code> 时，则表示连接成功。</li>
<li>最后，在 HBuilder X 中 点击 <code>运行</code> -&gt; <code>运行到手机或模拟器</code> -&gt; <code>运行到Android App基座</code>。在设备列表中就可以看见无线调试的设备了</li>
</ol></section>
<section><h2>结尾<a href="#结尾"><span>#</span></a></h2><p>这里需要的注意的是：</p><ol>
<li>无线调试显示的端口号与配对时的端口号不同，配对时不要搞混了。</li>
<li>当手机息屏时，需要重新运行，否则手机上的代码可能不会更新。</li>
</ol></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2025/0106/</id>
      <title type="text">实用的JS代码片段</title>
      <published>2025-01-06T00:00:00.000Z</published>
      <updated>2025-01-06T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2025/0106/"/>
      <summary type="text">书到用时方恨少</summary>
      <content type="html"><![CDATA[<section><h2>深拷贝 (ES6)<a href="#深拷贝-es6"><span>#</span></a></h2><p>在现代浏览器中，可以使用 <code>structuredClone</code> 方法来实现深拷贝，它是一种更高效、更安全的深拷贝方式。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>original</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>a</span><span>:</span><span> </span><span>1</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>b</span><span>:</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span>],</span></div></div><div><div><div>4</div></div><div><span>  </span><span>c</span><span>:</span><span> </span><span>new</span><span> </span><span>Map</span><span>([</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>[</span><span>1</span><span>, </span><span>"one"</span><span>],</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>[</span><span>2</span><span>, </span><span>"two"</span><span>],</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>]),</span></div></div><div><div><div>8</div></div><div><span>};</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>const</span><span> </span><span>cloned</span><span> </span><span>=</span><span> </span><span>structuredClone</span><span><span>(</span><span>original</span><span>);</span></span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>cloned</span><span>); </span></span><span>// 输出克隆后的对象</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>记录一段代码运行所花时间<a href="#记录一段代码运行所花时间"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"计时器"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>for</span><span> (</span><span>let</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span> </span><span>1000</span><span><span>; </span><span>i</span></span><span>++</span><span>) {</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>i</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"计时器"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>快速去除数组中的 undefined 和 null<a href="#快速去除数组中的-undefined-和-null"><span>#</span></a></h2><p><code>filter(Boolean)</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>arr</span><span> </span><span>=</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>undefined</span><span>, </span><span>3</span><span>, </span><span>null</span><span>, </span><span>4</span><span>];</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>filteredArr</span><span> </span><span>=</span><span><span> </span><span>arr</span><span>.</span></span><span>filter</span><span><span>(</span><span>Boolean</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>filteredArr</span><span>); </span></span><span>// 输出 [1, 2, 3, 4]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>文档注释<a href="#文档注释"><span>#</span></a></h2><p>在写函数时，可以使用文档注释来描述函数的功能和参数。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/**</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>* 这是一个函数</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>* </span><span>@</span><span>author</span><span> </span><span>兜兜里有糖</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>* </span><span>@</span><span>param</span><span> </span><span>{number}</span><span> </span><span>num</span><span> 第一个参数为数字</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>* </span><span>@</span><span>return</span><span> </span><span>{void}</span><span> 没有返回值</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>* </span><span>@</span><span>example</span></div></div><div><div><div>7</div></div><div><span><span> </span></span><span>* jian(10); // 输出10 - 0</span></div></div><div><div><div>8</div></div><div><span><span> </span></span><span>*/</span></div></div><div><div><div>9</div></div><div><span>function</span><span> </span><span>jian</span><span><span>(</span><span>num</span><span>) {</span></span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>num</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span>  </span><span>if</span><span><span> (</span><span>num</span><span> </span></span><span>===</span><span> </span><span>0</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>num</span><span>--</span><span>;</span></div></div><div><div><div>13</div></div><div><span>  </span><span>jian</span><span><span>(</span><span>num</span><span>);</span></span></div></div><div><div><div>14</div></div><div><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>jian</span><span><span>(</span><span>num</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>快捷字符串转数字<a href="#快捷字符串转数字"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>string</span><span> </span></span><span>=</span><span> </span><span>"2"</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>+</span><span><span>string</span><span>); </span></span><span>// 2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>ForOf中使用两个参数<a href="#forof中使用两个参数"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>data</span><span> </span></span><span>=</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span>];</span></div></div><div><div><div>2</div></div><div><span>for</span><span> (</span><span>const</span><span> [</span><span>item</span><span>, </span><span>index</span><span>] </span><span>of</span><span><span> </span><span>data</span><span>.</span></span><span>entries</span><span>()) {</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>item</span><span>, </span><span>index</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>// entries 将数组转换为可迭代对象</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>可选链式操作符<a href="#可选链式操作符"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>obj</span><span> </span><span>=</span><span> {};</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>obj</span><span>.</span></span><span>name</span><span> </span><span>??</span><span> </span><span>2</span><span>); </span><span>// 输出2</span></div></div><div><div><div>3</div></div><div><span>let</span><span><span> </span><span>obj2</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>name</span><span>:</span><span> </span><span>"兜兜"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>};</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>obj2</span><span>.</span></span><span>name</span><span> </span><span>??</span><span> </span><span>2</span><span>); </span><span>// 输出 兜兜</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>obj2</span><span>.</span></span><span>name</span><span>?.</span><span>children</span><span>); </span><span>// 输出 undefined</span></div></div><div><div><div>8</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>obj2</span><span>.</span></span><span>name</span><span>?.</span><span>children</span><span> </span><span>??</span><span> </span><span>2</span><span>); </span><span>// 输出2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>访问数组末尾的元素<a href="#访问数组末尾的元素"><span>#</span></a></h2><p><code>at</code> 支持负数索引</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span><span> </span></span><span>=</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span>];</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>[</span></span><span>-</span><span>1</span><span>]); </span><span>// undefined</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>.</span></span><span>at</span><span>(</span><span>-</span><span>1</span><span>)); </span><span>// 输出 3</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>快速从一个对象中剔除某些属性<a href="#快速从一个对象中剔除某些属性"><span>#</span></a></h2><p>通过解构可以快速剔除对象中某些属性</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>obj</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>name</span><span>:</span><span> </span><span>"兜兜"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>age</span><span>:</span><span> </span><span>18</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>sex</span><span>:</span><span> </span><span>"男"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>address</span><span>:</span><span> </span><span>"河南"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>};</span></div></div><div><div><div>7</div></div><div><span>// 剔除age和address</span></div></div><div><div><div>8</div></div><div><span>const</span><span> { </span><span>age</span><span>, </span><span>address</span><span>, </span><span>...</span><span>newObj</span><span> } </span><span>=</span><span><span> </span><span>obj</span><span>;</span></span></div></div><div><div><div>9</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>newObj</span><span>); </span></span><span>// 输出 {age: 18, address: '河南'}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>快速合并数组嵌套列表<a href="#快速合并数组嵌套列表"><span>#</span></a></h2><p>通过<code>flat</code>方法可以快速合并数组嵌套列表</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>arr</span><span> </span><span>=</span><span> [</span><span>1</span><span>, [</span><span>2</span><span>, [</span><span>3</span><span>, [</span><span>4</span><span>, [</span><span>5</span><span>]]]]];</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>.</span></span><span>flat</span><span>(</span><span>Infinity</span><span>)); </span><span>// 输出 [1, 2, 3, 4, 5]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>封装可链式调用函数/类<a href="#封装可链式调用函数类"><span>#</span></a></h2><p>::: tabs
== 类</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span> </span><span>Chainable</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>value</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>this</span><span>.</span><span>value</span><span> </span><span>=</span><span><span> </span><span>value</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>  </span><span>a</span><span>() {</span></div></div><div><div><div>6</div></div><div><span>    </span><span>this</span><span>.</span><span>value</span><span> </span><span>+=</span><span> </span><span>"A"</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>return</span><span> </span><span>this</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>  </span><span>b</span><span>() {</span></div></div><div><div><div>10</div></div><div><span>    </span><span>this</span><span>.</span><span>value</span><span> </span><span>+=</span><span> </span><span>"B"</span><span>;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>return</span><span> </span><span>this</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>new</span><span> </span><span>Chainable</span><span>(</span><span>1</span><span>).</span><span>a</span><span>().</span><span>b</span><span>()); </span><span>// 1AB</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>== 函数</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>chainable</span><span><span>(</span><span>value</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>const</span><span> </span><span>state</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>value</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>a</span><span>() {</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>state</span><span>.</span><span>value</span><span> </span><span>+=</span><span> </span><span>"A"</span><span>;</span></div></div><div><div><div>6</div></div><div><span>      </span><span>return</span><span><span> </span><span>state</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span>    </span><span>b</span><span>() {</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>state</span><span>.</span><span>value</span><span> </span><span>+=</span><span> </span><span>"B"</span><span>;</span></div></div><div><div><div>10</div></div><div><span>      </span><span>return</span><span><span> </span><span>state</span><span>;</span></span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>13</div></div><div><span>  </span><span>return</span><span><span> </span><span>state</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>chainable</span><span>(</span><span>1</span><span>).</span><span>a</span><span>().</span><span>b</span><span>()); </span><span>// 1AB</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>:::</p></section>
<section><h2>封装创建单例类函数<a href="#封装创建单例类函数"><span>#</span></a></h2><p>该函数用于创建单例类，确保同一个类只有一个实例。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>singleton</span><span><span>(</span><span>className</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>let</span><span><span> </span><span>ins</span><span> </span></span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span> </span><span>new</span><span> </span><span>Proxy</span><span><span>(</span><span>className</span><span>, {</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>construct</span><span><span>(</span><span>target</span><span>, </span><span>args</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>      </span><span>if</span><span> (</span><span>!</span><span><span>ins</span><span>) {</span></span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>ins</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>target</span><span>(</span><span>...</span><span><span>args</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>      </span><span>return</span><span><span> </span><span>ins</span><span>;</span></span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>控制台<a href="#控制台"><span>#</span></a></h2><p>在控制台(DevTools)中，可以通过不同的方法来获取我们想要的内容。</p><section><h3>获取当前高亮元素属性<a href="#获取当前高亮元素属性"><span>#</span></a></h3><p>可以通过 <code>console.dir($0)</code> 来获取当前选中的元素属性。</p><p>其中 <code>$0</code> 是当前选中的元素，可以通过 <code>$1</code> <code>$2</code> <code>$3</code> <code>$4</code> 来获取之前选中的元素。</p></section><section><h3>打印对象/数组结构<a href="#打印对象数组结构"><span>#</span></a></h3><p><code>console.table(obj)</code> 可以打印对象/数组结构。
这样打印出来的内容更加清晰，适合打印对象/数组结构。</p><p>在控制台(DevTools)中，可以通过 <code>console.table(obj)</code> 来打印对象/数组结构。</p></section><section><h3>打印当前函数堆栈<a href="#打印当前函数堆栈"><span>#</span></a></h3><p><code>console.trace()</code> 可以打印当前函数堆栈。</p><p>可看到当前函数调用链，非常适合查事件触发源头。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>a</span><span>() {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>b</span><span>();</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div><div><div><div>4</div></div><div><span>function</span><span> </span><span>b</span><span>() {</span></div></div><div><div><div>5</div></div><div><span>  </span><span>c</span><span>();</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>function</span><span> </span><span>c</span><span>() {</span></div></div><div><div><div>8</div></div><div><span>  </span><span>d</span><span>();</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div><span>function</span><span> </span><span>d</span><span>() {</span></div></div><div><div><div>11</div></div><div><span>  </span><span>e</span><span>();</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>function</span><span> </span><span>e</span><span>() {</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>trace</span><span>(); </span><span>// 输出当前函数堆栈</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div><div><div><div>16</div></div><div><span>a</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section>
<section><h2>在class中定义私有属性<a href="#在class中定义私有属性"><span>#</span></a></h2><p>在ES6中，我们可以使用 <code>#</code> 来定义私有属性。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span> </span><span>Person</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>#name</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>name</span><span>) {</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>this</span><span>.</span><span>#name</span><span> </span><span>=</span><span><span> </span><span>name</span><span>;</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>const</span><span> </span><span>person</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Person</span><span>(</span><span>"张三"</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>person</span><span>.</span></span><span>#name</span><span>); </span><span>// 输出 undefined 因为 `#name` 是私有属性，不能在类的外部访问。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2024/1225/</id>
      <title type="text">Scss</title>
      <published>2024-12-25T00:00:00.000Z</published>
      <updated>2024-12-25T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2024/1225/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[<section><h2>响应式<a href="#响应式"><span>#</span></a></h2><ol>
<li>当某一个元素需要添加响应式时，可直接在类名样式内添加<code>@media</code>属性</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.codeBox</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>display: </span><span>flex</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>justify-content: </span><span>center</span><span>;</span></div></div><div><div><div>4</div></div><div><span>  </span><span>@media</span><span> </span><span>screen</span><span><span> </span><span>and</span><span> (max-width: </span></span><span><span>576</span><span>px</span></span><span>) {</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>scale: </span><span>0.5</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>当需要根据某一个元素进行响应式时，可以生命父级容器并通过 <code>@container</code> 进行响应式</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.list</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// 声明为容器（父级元素）</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>container-type: inline-size;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>container-name: product</span><span>-</span><span>list;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>.item</span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>@container (</span><span>inline-size</span><span> &gt; 576px) {</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>width: </span><span><span>50</span><span>%</span></span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>@container (</span><span>inline-size</span><span> &lt; 576px) {</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>同一元素，样式相同 颜色不同<a href="#同一元素样式相同-颜色不同"><span>#</span></a></h2><p>当碰到多个元素样式相同，只是颜色不同时，可通过<code>&amp;.class</code>的方式选中</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.bar</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>width: </span><span><span>1</span><span>em</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>height: </span><span><span>1</span><span>em</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>border-radius: </span><span><span>1</span><span>em</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>font-size: </span><span><span>14</span><span>px</span></span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>  </span><span>&amp;</span><span>.red</span><span> {</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>background-color: </span><span>#</span><span>f75554</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>  </span><span>&amp;</span><span>.yellow</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>background-color: </span><span>#</span><span>f7c54a</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>  </span><span>&amp;</span><span>.green</span><span> {</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>background-color: </span><span>#</span><span>5fcf5f</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2024/1223/</id>
      <title type="text">怎样才能让网站被搜索引擎收录？</title>
      <published>2024-12-23T00:00:00.000Z</published>
      <updated>2024-12-23T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2024/1223/"/>
      <summary type="text">这里给出几个小建议</summary>
      <content type="html"><![CDATA[<section><h2>怎样才能让网站被搜索引擎收录？<a href="#怎样才能让网站被搜索引擎收录"><span>#</span></a></h2><p>搜索引擎的收录是网站获得流量的第一步，以下是针对常见搜索引擎的收录流程和一些建议：</p><section><h3>百度<a href="#百度"><span>#</span></a></h3><ol>
<li>提交网站
提交地址：<a href="https://ziyuan.baidu.com/linksubmit/url" target="_blank">百度搜索资源平台</a>
登录百度账号后，在提交页面输入网站地址并提交。</li>
<li>注意事项
添加站点地图 (SiteMap)：站点地图能帮助搜索引擎更好地了解网站结构，可以在百度站长工具中添加。
提高内容质量：确保网站内容原创且符合用户需求，避免低质内容。
提升网站访问速度：百度更倾向于收录访问速度快、体验好的网站。</li>
<li>反馈问题
如果提交网站后一个月及以上仍未被收录，可以通过<a href="https://ziyuan.baidu.com/feedback/apply" target="_blank">反馈中心</a>反馈问题，并申请解除 SiteMap 提交次数限制。
反馈申请示例：</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>我的网站普通收录的 SiteMap 提示：今日提交上限：0 条 今日提交余额：0 条，我无法提交 SiteMap，请管理员处理一下~</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>后续操作
百度反馈后会提供一个填写表单的链接，按提示填写即可。</li>
</ol></section><section><h3>必应<a href="#必应"><span>#</span></a></h3><ol>
<li>提交网站
提交地址：<a href="https://www.bing.com/webmasters" target="_blank">必应站长工具</a>
登录后添加您的网站，并提交站点地图。</li>
<li>注意事项
确保 robots.txt 设置正确：检查文件中是否允许搜索引擎爬取您希望被收录的页面。
链接建设：获取高质量的外链有助于加快收录。</li>
<li>反馈问题
如果提交后一个月未被收录，可以通过必应<a href="https://www.bing.com/webmasters/support" target="_blank">反馈中心</a>反馈问题。
反馈后通常会有专员联系您，并协助解决问题。</li>
</ol></section><section><h3>360<a href="#360"><span>#</span></a></h3><ol>
<li>提交网站
提交地址：360 <a href="https://info.so.360.cn/site_submit.html" target="_blank">搜索站长平台</a>
登录后按提示提交网站。</li>
<li>注意事项
站点地图：在提交页面中添加 SiteMap，帮助搜索引擎更快地发现您的内容。
持续更新：定期发布高质量内容，有助于吸引爬虫访问并提高收录率。</li>
</ol></section><section><h3>谷歌<a href="#谷歌"><span>#</span></a></h3><ol>
<li>提交网站
提交地址：<a href="https://search.google.com/search-console" target="_blank">Google Search Console</a>
登录 Google 账号后，添加网站并验证所有权。</li>
<li>注意事项
提交站点地图：在 Search Console 中提交网站的 SiteMap 文件。
确保爬取权限：检查 robots.txt 文件，确保未误屏蔽重要页面。
优化内容质量：谷歌非常注重用户体验，高质量、原创内容是关键。</li>
</ol></section><section><h3>通用建议<a href="#通用建议"><span>#</span></a></h3><p>优化站点速度</p><ol>
<li>使用 CDN（如 Cloudflare）和高效的服务器提高网站加载速度。
确保无死链</li>
<li>使用工具检查网站是否有错误链接，确保搜索引擎爬虫能够顺利访问。
生成并更新站点地图</li>
<li>确保站点地图完整且实时更新，帮助搜索引擎快速抓取新内容。</li>
<li>建设高质量外链
来自权威网站的反向链接有助于提高搜索引擎对网站的信任度。</li>
<li>保持更新频率
定期更新网站内容，让搜索引擎爬虫频繁访问。</li>
</ol><p>通过以上步骤和建议，可以提高网站被各大搜索引擎收录的几率。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2024/1220/</id>
      <title type="text">HTML标签</title>
      <published>2024-12-20T00:00:00.000Z</published>
      <updated>2024-12-20T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2024/1220/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[<section><h2>文字注音<a href="#文字注音"><span>#</span></a></h2><ruby>
只
<rt>zhí</rt>
</ruby><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>ruby</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>只</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>rt</span><span>&gt;zhí&lt;/</span><span>rt</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;/</span><span>ruby</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>有序列表<a href="#有序列表"><span>#</span></a></h2><p>每天上班要干的事</p><ol>
	<li>摸鱼</li>
	<li>摸鱼</li>
	<li>还是TMD摸鱼！</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>ol</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>li</span><span>&gt;摸鱼&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>li</span><span>&gt;摸鱼&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;</span><span>li</span><span>&gt;还是TMD摸鱼！&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>ol</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>下拉列表分组<a href="#下拉列表分组"><span>#</span></a></h2>

    

  

    
  
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>select</span><span> </span><span>id</span><span>=</span><span>"fun-select"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>optgroup</span><span> </span><span>label</span><span>=</span><span>"早餐"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>option</span><span>&gt;热乎乎的煎饼果子&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>option</span><span>&gt;牛奶泡麦片&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>option</span><span>&gt;不吃！&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>&lt;/</span><span>optgroup</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>&lt;</span><span>optgroup</span><span> </span><span>label</span><span>=</span><span>"游戏"</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>option</span><span>&gt;有款游戏，越打越想笑，那就是。。。&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>option</span><span>&gt;什么齐天大圣，没听说过&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>&lt;</span><span>option</span><span>&gt;决战孤儿院，启动！&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>&lt;/</span><span>optgroup</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;/</span><span>select</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>预定义格式文本（保留代码中的空格）<a href="#预定义格式文本保留代码中的空格"><span>#</span></a></h2><pre>  ____  ____  _
 |  _ \| __ )| | ___   __ _
 | | | |  _ \| |/ _ \ / _` |
 | |_| | |_) | | (_) | (_| |
 |____/|____/|_|\___/ \__, |
                      |___/
</pre><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>pre</span><span> </span><span>style</span><span>=</span><span>"</span><span>font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace;</span><span>"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>____  ____  _</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>|  _ \| __ )| | ___   __ _</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>| | | |  _ \| |/ _ \ / _` |</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>| |_| | |_) | | (_) | (_| |</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>|____/|____/|_|\___/ \__, |</span></div></div><div><div><div>7</div></div><div><span><span>                      </span></span><span>|___/</span></div></div><div><div><div>8</div></div><div><span>&lt;/</span><span>pre</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>引号<a href="#引号"><span>#</span></a></h2><p><q>这段文字会被引号包裹</q></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>q</span><span>&gt;这段文字会被引号包裹&lt;/</span><span>q</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>删除线<a href="#删除线"><span>#</span></a></h2><p>这段文字会被删除线包裹</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>del</span><span>&gt;这段文字会被删除线包裹&lt;/</span><span>del</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>标记<a href="#标记"><span>#</span></a></h2><p><code>samp</code> 元素，用于标识计算机程序输出</p><p>常规文本。 <samp>这是示例文本。</samp> 常规文本。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>p</span><span>&gt;常规文本。 &lt;</span><span>samp</span><span>&gt;这是示例文本。&lt;/</span><span>samp</span><span>&gt; 常规文本。&lt;/</span><span>p</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>高亮<a href="#高亮"><span>#</span></a></h2><p><mark>这段文字会被高亮</mark></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>mark</span><span>&gt;这段文字会被高亮&lt;/</span><span>mark</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>浏览器原生模态框<a href="#浏览器原生模态框"><span>#</span></a></h2><p>::: tabs</p><p>== 演示</p><p>打开弹窗</p>
  <div>
    <div>
      <div>标题</div>
      <div>×</div>
    </div>
    <div>
      这是内容，这是内容。
    </div>
  </div>

==<p>== 代码</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#modal {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>border: none;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>border-radius: 8px;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>margin: 0 auto;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>padding: 20px;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>position: fixed;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>top: -100%;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>left: 20%;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>transform: translateX(-50%);</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>animation: slideIn 0.3s forwards;</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>@keyframes slideIn {</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>from {</span></div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>top: -100%;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>to {</span></div></div><div><div><div>18</div></div><div><span><span>      </span></span><span>top: 10%;</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>#modal .modal-header {</span></div></div><div><div><div>23</div></div><div><span><span>  </span></span><span>width: 400px;</span></div></div><div><div><div>24</div></div><div><span><span>  </span></span><span>padding: 10px 0;</span></div></div><div><div><div>25</div></div><div><span><span>  </span></span><span>display: flex;</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>border-bottom: 1px solid #eee;</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div><div><div><div>28</div></div><div><span>#modal .modal-header .modal-title {</span></div></div><div><div><div>29</div></div><div><span><span>  </span></span><span>flex: 1;</span></div></div><div><div><div>30</div></div><div><span><span>  </span></span><span>font-size: 20px;</span></div></div><div><div><div>31</div></div><div><span>}</span></div></div><div><div><div>32</div></div><div><span>#modal .modal-content {</span></div></div><div><div><div>33</div></div><div><span><span>  </span></span><span>border-bottom: 1px solid #eee;</span></div></div><div><div><div>34</div></div><div><span><span>  </span></span><span>padding: 20px 0;</span></div></div><div><div><div>35</div></div><div><span><span>  </span></span><span>font-size: 15px;</span></div></div><div><div><div>36</div></div><div><span>}</span></div></div><div><div><div>37</div></div><div><span>#modal .modal-header .modal-close {</span></div></div><div><div><div>38</div></div><div><span><span>  </span></span><span>width: 50px;</span></div></div><div><div><div>39</div></div><div><span><span>  </span></span><span>font-size: 23px;</span></div></div><div><div><div>40</div></div><div><span><span>  </span></span><span>text-align: right;</span></div></div><div><div><div>41</div></div><div><span><span>  </span></span><span>cursor: pointer;</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div><div><div><div>43</div></div><div><span>#modal::backdrop {</span></div></div><div><div><div>44</div></div><div><span><span>  </span></span><span>position: fixed;</span></div></div><div><div><div>45</div></div><div><span><span>  </span></span><span>top: 0px;</span></div></div><div><div><div>46</div></div><div><span><span>  </span></span><span>right: 0px;</span></div></div><div><div><div>47</div></div><div><span><span>  </span></span><span>bottom: 0px;</span></div></div><div><div><div>48</div></div><div><span><span>  </span></span><span>left: 0px;</span></div></div><div><div><div>49</div></div><div><span><span>  </span></span><span>background: rgba(0, 0, 0, 0.2);</span></div></div><div><div><div>50</div></div><div><span>}</span></div></div><div><div><div>51</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>&lt;</span><span>button</span><span> </span><span>onclick</span><span>=</span><span>"</span><span><span>modal</span><span>.</span></span><span>showModal</span><span>()</span><span>"</span><span>&gt;打开弹窗&lt;/</span><span>button</span><span>&gt;</span></div></div><div><div><div>54</div></div><div><span>&lt;</span><span>dialog</span><span> </span><span>id</span><span>=</span><span>"modal"</span><span>&gt;</span></div></div><div><div><div>55</div></div><div><span><span>  </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"modal-body"</span><span>&gt;</span></div></div><div><div><div>56</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"modal-header"</span><span>&gt;</span></div></div><div><div><div>57</div></div><div><span><span>      </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"modal-title"</span><span>&gt;标题&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>58</div></div><div><span><span>      </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"modal-close"</span><span> </span><span>onclick</span><span>=</span><span>"</span><span><span>modal</span><span>.</span></span><span>close</span><span>()</span><span>"</span><span>&gt;×&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>59</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>60</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"modal-content"</span><span>&gt;</span></div></div><div><div><div>61</div></div><div><span><span>      </span></span><span>这是内容，这是内容。</span></div></div><div><div><div>62</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>63</div></div><div><span><span>  </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>64</div></div><div><span>&lt;/</span><span>dialog</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>==
:::</p></section>
<section><h2>数据列表元素 (HTML5)<a href="#数据列表元素-html5"><span>#</span></a></h2><p>选择口味:
</p>

  

<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>label</span><span> </span><span>for</span><span>=</span><span>"ice-cream-choice"</span><span> </span><span>style</span><span>=</span><span>"</span><span>display: block;margin-bottom: 10px;</span><span>"</span><span>&gt;选择口味:&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>input</span><span> </span><span>list</span><span>=</span><span>"ice-cream-flavors"</span><span> </span><span>id</span><span>=</span><span>"ice-cream-choice"</span><span> </span><span>name</span><span>=</span><span>"ice-cream-choice"</span><span> /&gt;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>&lt;</span><span>datalist</span><span> </span><span>id</span><span>=</span><span>"ice-cream-flavors"</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&lt;</span><span>option</span><span> </span><span>value</span><span>=</span><span>"巧克力"</span><span>&gt;&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>&lt;</span><span>option</span><span> </span><span>value</span><span>=</span><span>"椰子"</span><span>&gt;&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>&lt;</span><span>option</span><span> </span><span>value</span><span>=</span><span>"薄荷"</span><span>&gt;&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;</span><span>option</span><span> </span><span>value</span><span>=</span><span>"草莓"</span><span>&gt;&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>&lt;</span><span>option</span><span> </span><span>value</span><span>=</span><span>"香草"</span><span>&gt;&lt;/</span><span>option</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>datalist</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2024/1218/</id>
      <title type="text">Koa</title>
      <published>2024-12-18T00:00:00.000Z</published>
      <updated>2024-12-18T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2024/1218/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[<section><h2>启动服务<a href="#启动服务"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>Koa</span><span> </span><span>=</span><span> </span><span>require</span><span>(</span><span>"koa"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>app</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Koa</span><span>();</span></div></div><div><div><div>3</div></div><div><span><span>app</span><span>.</span></span><span>use</span><span>(</span><span>async</span><span><span> (</span><span>ctx</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>ctx</span><span>.</span><span>body</span><span> </span><span>=</span><span> </span><span>"hello koa2"</span><span>;</span></div></div><div><div><div>5</div></div><div><span>});</span></div></div><div><div><div>6</div></div><div><span><span>app</span><span>.</span></span><span>listen</span><span>(</span><span>3000</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>"koa 服务运行在 http://localhost:3000"</span><span>);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>// 在控制台输入 node index.js</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>koa-router 路由中间件<a href="#koa-router-路由中间件"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>Koa</span><span> </span><span>=</span><span> </span><span>require</span><span>(</span><span>'koa'</span><span>)</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>Router</span><span> </span><span>=</span><span> </span><span>require</span><span>(</span><span>'koa-router'</span><span>)</span></div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>app</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Koa</span><span>()</span></div></div><div><div><div>4</div></div><div><span>const</span><span> </span><span>router</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Router</span><span>()</span></div></div><div><div><div>5</div></div><div><span><span>router</span><span>.</span></span><span>get</span><span>(</span><span>'/'</span><span>, </span><span>async</span><span><span> (</span><span>ctx</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>ctx</span><span>.</span><span>body</span><span> </span><span>=</span><span> </span><span>'hello koa2'</span></div></div><div><div><div>7</div></div><div><span>})</span></div></div><div><div><div>8</div></div><div><span>]</span></div></div><div><div><div>9</div></div><div><span><span>router</span><span>.</span></span><span>get</span><span>(</span><span>'/user'</span><span>, </span><span>async</span><span><span> (</span><span>ctx</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>ctx</span><span>.</span><span>body</span><span> </span><span>=</span><span> </span><span>'user'</span></div></div><div><div><div>11</div></div><div><span>})</span></div></div><div><div><div>12</div></div><div><span><span>app</span><span>.</span></span><span>use</span><span><span>(</span><span>router</span><span>.</span></span><span>routes</span><span>())</span></div></div><div><div><div>13</div></div><div><span><span>app</span><span>.</span></span><span>listen</span><span>(</span><span>3000</span><span>)</span></div></div><div><div><div>14</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'koa 服务运行在 http://localhost:3000'</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>请求数据获取<a href="#请求数据获取"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>Koa</span><span> </span><span>=</span><span> </span><span>require</span><span>(</span><span>'koa'</span><span>)</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>Router</span><span> </span><span>=</span><span> </span><span>require</span><span>(</span><span>'koa-router'</span><span>)</span></div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>app</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Koa</span><span>()</span></div></div><div><div><div>4</div></div><div><span>const</span><span> </span><span>router</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Router</span><span>()</span></div></div><div><div><div>5</div></div><div><span><span>router</span><span>.</span></span><span>get</span><span>(</span><span>'/'</span><span>, </span><span>async</span><span><span> (</span><span>ctx</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>})</span></div></div><div><div><div>8</div></div><div><span><span>router</span><span>.</span></span><span>get</span><span>(</span><span>'/user'</span><span>, </span><span>async</span><span><span> (</span><span>ctx</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>9</div></div><div><span>  </span><span>// 从上下文的request对象中获取</span></div></div><div><div><div>10</div></div><div><span>  </span><span>let</span><span><span> </span><span>request</span><span> </span></span><span>=</span><span><span> </span><span>ctx</span><span>.</span></span><span>request</span></div></div><div><div><div>11</div></div><div><span>  </span><span>let</span><span><span> </span><span>req_query</span><span> </span></span><span>=</span><span><span> </span><span>request</span><span>.</span></span><span>query</span></div></div><div><div><div>12</div></div><div><span>  </span><span>let</span><span><span> </span><span>req_querystring</span><span> </span></span><span>=</span><span><span> </span><span>request</span><span>.</span></span><span>querystring</span></div></div><div><div><div>13</div></div><div><span>  </span><span>// 从上下文中直接获取</span></div></div><div><div><div>14</div></div><div><span>  </span><span>let</span><span><span> </span><span>ctx_query</span><span> </span></span><span>=</span><span><span> </span><span>ctx</span><span>.</span></span><span>query</span></div></div><div><div><div>15</div></div><div><span>  </span><span>let</span><span><span> </span><span>ctx_querystring</span><span> </span></span><span>=</span><span><span> </span><span>ctx</span><span>.</span></span><span>querystring</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>ctx</span><span>.</span><span>body</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>17</div></div><div><span>    </span><span>url</span><span>:</span><span><span> </span><span>ctx</span><span>.</span></span><span>url</span><span>,</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>req_query</span><span>,</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>req_querystring</span><span>,</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>ctx_query</span><span>,</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>ctx_querystring</span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div><div><div><div>24</div></div><div><span>})</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2024/1111/</id>
      <title type="text">CSS样式</title>
      <published>2024-11-11T00:00:00.000Z</published>
      <updated>2024-11-11T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2024/1111/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[<section><h2>单行或多行溢出隐藏<a href="#单行或多行溢出隐藏"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>/* 单行省略 */</span></div></div><div><div><div>3</div></div><div><span>  </span><span>.box</span><span> {</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>overflow: </span><span>hidden</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>text-overflow: </span><span>ellipsis</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>white-space: </span><span>nowrap</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>  </span><span>/* 多行省略 */</span></div></div><div><div><div>9</div></div><div><span>  </span><span>.box</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>display: </span><span>-webkit-box</span><span>;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>-webkit-box-orient</span><span><span>: </span><span>vertical</span><span>;</span></span></div></div><div><div><div>12</div></div><div><span>    </span><span>-webkit-line-clamp</span><span>: </span><span>2</span><span>; </span><span>/* 超过两行 */</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>overflow: </span><span>hidden</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"box"</span><span>&gt;11111&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>宽度适应内容 block<a href="#宽度适应内容-block"><span>#</span></a></h2><p>示例：</p><div>宽度适应内容</div>
<div>在这里，块盒宽度将会适应内容</div><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>div</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>width: </span><span>fit-content</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>background-color: </span><span>red</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>color: </span><span>white</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>div</span><span>&gt;宽度适应内容&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>文字与背景颜色混合<a href="#文字与背景颜色混合"><span>#</span></a></h2><p>颜色会根据背景颜色与文字颜色进行对比，对比的结果作为新的颜色。</p><div>文字与背景颜色混合</div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>div</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>mix-blend-mode: </span><span>difference</span><span>; </span><span>/*difference 为差值算法*/</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>background-color: </span><span>#</span><span>4d64f0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>color: </span><span>black</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>div</span><span>&gt;文字与背景颜色混合&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>将元素样式还原为浏览器默认样式/重置样式<a href="#将元素样式还原为浏览器默认样式重置样式"><span>#</span></a></h2><p><code>revert</code>表示还原默认样式，包括字体、颜色、背景、边框等，在需要重置样式时，可以尝试使用这个。</p><p>还原浏览器默认样式</p>

<table><thead><tr><th>参数</th><th>作用</th></tr></thead><tbody><tr><td>revert</td><td>还原浏览器默认样式，忽略自定义样式。</td></tr><tr><td>initial</td><td>将属性重置为 CSS 规范中的默认初始值（不依赖于任何外部样式表或继承）</td></tr></tbody></table></section>
<section><h2>自定义背景颜色形状<a href="#自定义背景颜色形状"><span>#</span></a></h2><p>背景颜色形状通过<code>clip-path</code>来设置。</p><div></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>div</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>width: </span><span><span>100</span><span>px</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>height: </span><span><span>100</span><span>px</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>clip-path: </span><span>circle</span><span>(</span><span><span>50</span><span>%</span></span><span>); </span><span>/*代表画出一个圆形*/</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>推荐使用 <a href="https://www.cssportal.com/css-clip-path-generator/" target="_blank">clip-path生成器生成</a></p></section>
<section><h2>锁定元素宽高比<a href="#锁定元素宽高比"><span>#</span></a></h2><p><code>aspect-ratio</code>属性可以锁定元素的宽高比，在某些情况下，例如视频，图片等元素，可以设置宽高比，让元素保持固定比例。</p><img src="https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/02.jpg" /><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>img</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>aspect-ratio: </span><span>16</span><span>/</span><span>9</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>max-width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>overflow: </span><span>hidden</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/02.jpg"</span><span> </span><span>alt</span><span>=</span><span>"紧箍"</span><span> /&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>高斯模糊<a href="#高斯模糊"><span>#</span></a></h2><div>
 <img src="https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/02.jpg" alt="紧箍" />
</div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>div</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>filter: </span><span>blur</span><span>(</span><span><span>1</span><span>px</span></span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>  </span><span>img</span><span> {</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>aspect-ratio: </span><span>16</span><span>/</span><span>9</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>max-width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>overflow: </span><span>hidden</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>&lt;</span><span>div</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"https://ddlyt-top.oss-cn-beijing.aliyuncs.com/img/02.jpg"</span><span> </span><span>alt</span><span>=</span><span>"紧箍"</span><span> /&gt;</span></div></div><div><div><div>13</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>修改输入框光标颜色<a href="#修改输入框光标颜色"><span>#</span></a></h2>
  <span>输入框光标颜色:</span>

<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>input</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>caret-color: </span><span>red</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"text"</span><span> /&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>快速选中同一个父级下的多个子元素<a href="#快速选中同一个父级下的多个子元素"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>.box</span><span> </span><span>:is</span><span>(</span><span>h1</span><span><span>,</span><span> </span></span><span>h2</span><span><span>,</span><span> </span></span><span>h3</span><span><span>,</span><span> </span></span><span>h4</span><span><span>,</span><span> </span></span><span>h5</span><span>)</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>/*权重更高*/</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>color: </span><span>red</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>  </span><span>.box</span><span> </span><span>:where</span><span>(</span><span>h1</span><span><span>,</span><span> </span></span><span>h2</span><span><span>,</span><span> </span></span><span>h3</span><span><span>,</span><span> </span></span><span>h4</span><span><span>,</span><span> </span></span><span>h5</span><span>)</span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>color: </span><span>red</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"box"</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>&lt;</span><span>h1</span><span>&gt;1&lt;/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>&lt;</span><span>h2</span><span>&gt;2&lt;/</span><span>h2</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>&lt;</span><span>h3</span><span>&gt;3&lt;/</span><span>h3</span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>&lt;</span><span>h4</span><span>&gt;4&lt;/</span><span>h4</span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>&lt;</span><span>h5</span><span>&gt;5&lt;/</span><span>h5</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>&lt;</span><span>p</span><span>&gt;6&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>&lt;</span><span>span</span><span>&gt;7&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>18</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>元素缩放问题<a href="#元素缩放问题"><span>#</span></a></h2><p>当使用transform进行缩放时，会经常遇见一个问题，虽然元素看着是被缩小了，但是，元素所占空间并没有改变。解决办法就是使用 <code>zoom</code> 来缩放。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>@media</span><span> </span><span>screen</span><span><span> </span><span>and</span><span> (max-width: </span></span><span><span>768</span><span>px</span></span><span>) {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>/*transform: scale(0.5);*/</span></div></div><div><div><div>3</div></div><div><span>  </span><span>/*transform-origin: top left;*/</span></div></div><div><div><div>4</div></div><div><span>  </span><span>zoom: 0.5;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>伪元素 ::first-line<a href="#伪元素-first-line"><span>#</span></a></h2><p><code>::first-line</code> 可以用来选中块级元素中第一行可见文本，通常用于美化段落的首行样式。</p><p>
  第一行文字会变红<br />
  第二行文字不会
</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>p</span><span> </span><span>class</span><span>=</span><span>"first-line-p"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>第一行文字会变红&lt;</span><span>br</span><span> /&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>第二行文字不会</span></div></div><div><div><div>4</div></div><div><span>&lt;/</span><span>p</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>解决 <code>flex:1</code> 时，子元素内容超出父元素问题<a href="#解决-flex1-时子元素内容超出父元素问题"><span>#</span></a></h2><p>有时，给父元素设置 <code>flex:1</code> 后，子元素宽度或高度会超出父元素，导致父元素也跟着宽度或高度变大</p><blockquote><p>原因：</p></blockquote><p>在 <code>Flex</code> 中，子元素默认是不会自动收缩的。</p><ul>
<li>浏览器默认行为是：</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>min-width: </span><span>auto</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>min-height: </span><span>auto</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>这会导致：即使父容器很窄，子元素也不会压缩自己内容，而是维持自身内容宽度。也就是 <strong>宁可撑破父容器，也不换行或压缩</strong></li>
</ul><blockquote><p>解决：</p></blockquote><p>父元素设置 <code>min-width: 0</code>、<code>min-height: 0</code> 或 <code>overflow: hidden</code></p><p>这样写的意思是 <strong>允许宽高自动收缩</strong></p></section>
<section><h2>伪类 <a href="#伪类-"><span>#</span></a></h2><p><code>:empty</code> 伪类选择器，用于匹配元素内容为空的元素。</p><img alt="" />
<div></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span><span>.myImg</span><span>:empty::before</span></span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>content: </span><span>"图片已丢失"</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>color: </span><span>red</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>  </span><span><span>.box</span><span>:empty::before</span></span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>content: </span><span>"数据为空"</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>color: </span><span>gray</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>""</span><span> </span><span>alt</span><span>=</span><span>""</span><span> </span><span>class</span><span>=</span><span>"myImg"</span><span> /&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"box"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.ddlyt.top/posts/2024/1030/</id>
      <title type="text">Vue3</title>
      <published>2024-10-30T00:00:00.000Z</published>
      <updated>2024-10-30T00:00:00.000Z</updated>
      <author><name>兜兜里有糖</name></author>
      <link rel="alternate" href="https://blog.ddlyt.top/posts/2024/1030/"/>
      <summary type="text">标题说的对</summary>
      <content type="html"><![CDATA[]]></content>
    </entry>
</feed>
