<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>fairy-domain</title><link>/</link><description>Recent content on fairy-domain</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>© 2023 Powered by fairy-domain</copyright><lastBuildDate>Sat, 11 Feb 2023 21:45:42 +0800</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>Miniprogram List Local Update</title><link>/posts/miniprogram-list-local-update/</link><pubDate>Sat, 11 Feb 2023 21:45:42 +0800</pubDate><guid>/posts/miniprogram-list-local-update/</guid><description>小程序列表经常遇到需要局部刷新的需求，具体场景如下：
列表单项带有操作按钮，操作后需刷新列表数据，且列表保持不滚动，仅需更新当前项的数据，分页需要保持；
从列表单项进入详情页面，在详情页面进行操作后，再次返回列表时，列表数据需要更新，且列表保持不滚动，仅需更新当前项的数据，分页需要保持；
问题思考和方案：
针对第一条，相对来说比较好处理，只要在单项操作后，接口返回更新后的数据，我们在现有列表中找出操作项数据，进行数据替换即可；这里需要注意，除了替换，还有可能是移除（状态变了，不在当前列表了或者真实删除了），需要同步移除本地列表对应的数据项；
第二条比较麻烦，在详情页操作了，返回列表时需要更新或者删除列表中具体一项，首先想到的就是通过 EventChannel 在列表页和详情页建立通讯，表面看起来好像确实能解决，但仔细推敲，其实是行不通滴；假如操作是在详情页之后的页面中进行，返回详情页需要更新，再返回列表页还需要更新，这里链路一长，就不靠谱了，很多列表都有类似的需求，太麻烦；
具体解决方案：
针对第一条，列表单项更新或者删除，以下为示例代码： Page({ data: { listData: [], }, // 更新列表项 updataListItem(item, del = false) { // 通过单项id, 找到该项在列表数组中的下标 const index = this.data.listData.findIndex(v =&amp;gt; v.id === item.id); if (index &amp;gt; -1) { const updataKey = `listData[${index}]`; // 不要通过filter过滤出新的列表，再更新整个列表，效率低，不推荐；应该只更新对应单项 this.setData({ optionItem: item, [updataKey]: del ? null : item }); } else { // console.log(&amp;#34;更新列表时，未找到对应项&amp;#34;) } } }) 第二条我们的策略是在离开列表页面时，保持当前操作项的数据，在页面再次 show 时通过当前操作项查询最新的数据，并替换列表项；实现代码如下： Page({ data: { listData: [], optionItem: {} }, // 页面显示时 async onShow() { // 操作项数据不为空时，查询当前项的最新数据 if (JSON.</description><content>&lt;p>小程序列表经常遇到需要局部刷新的需求，具体场景如下：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>列表单项带有操作按钮，操作后&lt;strong>需刷新列表数据，且列表保持不滚动，仅需更新当前项的数据，分页需要保持&lt;/strong>；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>从列表单项进入详情页面，在详情页面进行操作后，再次返回列表时，&lt;strong>列表数据需要更新，且列表保持不滚动，仅需更新当前项的数据，分页需要保持&lt;/strong>；&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>问题思考和方案：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>针对第一条，相对来说比较好处理，只要在单项操作后，接口返回更新后的数据，我们在现有列表中找出操作项数据，进行数据替换即可；这里需要注意，除了替换，还有可能是移除（状态变了，不在当前列表了或者真实删除了），需要同步移除本地列表对应的数据项；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>第二条比较麻烦，在详情页操作了，返回列表时需要更新或者删除列表中具体一项，首先想到的就是通过 EventChannel 在列表页和详情页建立通讯，表面看起来好像确实能解决，但仔细推敲，其实是行不通滴；假如操作是在详情页之后的页面中进行，返回详情页需要更新，再返回列表页还需要更新，这里链路一长，就不靠谱了，很多列表都有类似的需求，太麻烦；&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>具体解决方案：&lt;/p>
&lt;ul>
&lt;li>针对第一条，列表单项更新或者删除，以下为示例代码：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Page&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">data&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">listData&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 更新列表项
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">updataListItem&lt;/span>(&lt;span style="color:#a6e22e">item&lt;/span>, &lt;span style="color:#a6e22e">del&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 通过单项id, 找到该项在列表数组中的下标
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">index&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">data&lt;/span>.&lt;span style="color:#a6e22e">listData&lt;/span>.&lt;span style="color:#a6e22e">findIndex&lt;/span>(&lt;span style="color:#a6e22e">v&lt;/span> =&amp;gt; &lt;span style="color:#a6e22e">v&lt;/span>.&lt;span style="color:#a6e22e">id&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span>.&lt;span style="color:#a6e22e">id&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">index&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">updataKey&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">`listData[&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">index&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">]`&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 不要通过filter过滤出新的列表，再更新整个列表，效率低，不推荐；应该只更新对应单项
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">setData&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">optionItem&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#a6e22e">updataKey&lt;/span>]&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">del&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span> &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// console.log(&amp;#34;更新列表时，未找到对应项&amp;#34;)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>第二条我们的策略是在离开列表页面时，保持当前操作项的数据，在页面再次 show 时通过当前操作项查询最新的数据，并替换列表项；实现代码如下：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Page&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">data&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">listData&lt;/span>&lt;span style="color:#f92672">:&lt;/span> [],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">optionItem&lt;/span>&lt;span style="color:#f92672">:&lt;/span> {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 页面显示时
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#a6e22e">onShow&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 操作项数据不为空时，查询当前项的最新数据
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">JSON&lt;/span>.&lt;span style="color:#a6e22e">stringify&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">data&lt;/span>.&lt;span style="color:#a6e22e">optionItem&lt;/span>) &lt;span style="color:#f92672">!==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;{}&amp;#34;&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">await&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">queryItemDataAndUpdataList&lt;/span>(&lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">data&lt;/span>.&lt;span style="color:#a6e22e">optionItem&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 查看详情页面
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">handleGoDetails&lt;/span>(&lt;span style="color:#a6e22e">event&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">optionItem&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">event&lt;/span>.&lt;span style="color:#a6e22e">currentTarget&lt;/span>.&lt;span style="color:#a6e22e">dataset&lt;/span>.&lt;span style="color:#a6e22e">item&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">setData&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">optionItem&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">wx&lt;/span>.&lt;span style="color:#a6e22e">navigateTo&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">url&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#e6db74">`/pages/details/details?id=&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">optionItem&lt;/span>.&lt;span style="color:#a6e22e">id&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 通过id和列表查询条件获取最新数据，并更新列表数据
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">async&lt;/span> &lt;span style="color:#a6e22e">queryItemDataAndUpdataList&lt;/span>(&lt;span style="color:#a6e22e">item&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 省略实现代码 ...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">updataListItem&lt;/span>(&lt;span style="color:#a6e22e">itemData&lt;/span>); &lt;span style="color:#75715e">// this.updataListItem(itemData, true);
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 更新列表项
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">updataListItem&lt;/span>(&lt;span style="color:#a6e22e">item&lt;/span>, &lt;span style="color:#a6e22e">del&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 通过单项id, 找到该项在列表数组中的下标
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">index&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">data&lt;/span>.&lt;span style="color:#a6e22e">listData&lt;/span>.&lt;span style="color:#a6e22e">findIndex&lt;/span>(&lt;span style="color:#a6e22e">v&lt;/span> =&amp;gt; &lt;span style="color:#a6e22e">v&lt;/span>.&lt;span style="color:#a6e22e">id&lt;/span> &lt;span style="color:#f92672">===&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span>.&lt;span style="color:#a6e22e">id&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">index&lt;/span> &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">updataKey&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">`listData[&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">index&lt;/span>&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">]`&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 不要通过filter过滤出新的列表，再更新整个列表，效率低，不推荐；应该只更新对应单项
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">setData&lt;/span>({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">optionItem&lt;/span>&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#a6e22e">updataKey&lt;/span>]&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">del&lt;/span> &lt;span style="color:#f92672">?&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span> &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">item&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// console.log(&amp;#34;更新列表时，未找到对应项&amp;#34;)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意事项：&lt;/p>
&lt;ul>
&lt;li>分页不能通过 page 和 size 这种简单实现，需要更改为通过最后一条查询指定条数的方式实现；&lt;/li>
&lt;li>列表存在不必要获取数据的问题（列表进入详情，详情页面无任何操作，再次返回，其实无需再次获取当前操作项的数据），但无伤大雅；&lt;/li>
&lt;/ul></content></item><item><title>Image Preload</title><link>/posts/image-preload/</link><pubDate>Thu, 11 Mar 2021 16:03:41 +0800</pubDate><guid>/posts/image-preload/</guid><description>图片预载的简单实现，配合 Promise 还是很方便滴！
function loadResource(data) { return new Promise((reslove, reject) =&amp;gt; { Promise.all( data.map( ({ name, path }) =&amp;gt; new Promise((resolve, reject) =&amp;gt; { const img = new Image(); img.src = path; img.addEventListener(&amp;#34;load&amp;#34;, () =&amp;gt; { resolve({ [name]: img }); }); img.addEventListener(&amp;#34;error&amp;#34;, reject); }) ) ) .then(list =&amp;gt; { reslove( list.reduce((prev, curr) =&amp;gt; Object.assign(prev, curr)), {} ); }) .catch(reject); }); }; 使用方法如下：
/* name：为图片资源名称，加载完成后引用资源时使用 path： 图片路径 */ const imagesList = [{name:&amp;#34;logo&amp;#34;,path:&amp;#34;&amp;#34;}]; loadResource(imagesList).</description><content>&lt;p>图片预载的简单实现，配合 Promise 还是很方便滴！&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">loadResource&lt;/span>(&lt;span style="color:#a6e22e">data&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Promise((&lt;span style="color:#a6e22e">reslove&lt;/span>, &lt;span style="color:#a6e22e">reject&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Promise.&lt;span style="color:#a6e22e">all&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">data&lt;/span>.&lt;span style="color:#a6e22e">map&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ({ &lt;span style="color:#a6e22e">name&lt;/span>, &lt;span style="color:#a6e22e">path&lt;/span> }) =&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> Promise((&lt;span style="color:#a6e22e">resolve&lt;/span>, &lt;span style="color:#a6e22e">reject&lt;/span>) =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">img&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> &lt;span style="color:#a6e22e">Image&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">img&lt;/span>.&lt;span style="color:#a6e22e">src&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">path&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">img&lt;/span>.&lt;span style="color:#a6e22e">addEventListener&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;load&amp;#34;&lt;/span>, () =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">resolve&lt;/span>({ [&lt;span style="color:#a6e22e">name&lt;/span>]&lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#a6e22e">img&lt;/span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">img&lt;/span>.&lt;span style="color:#a6e22e">addEventListener&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;error&amp;#34;&lt;/span>, &lt;span style="color:#a6e22e">reject&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">then&lt;/span>(&lt;span style="color:#a6e22e">list&lt;/span> =&amp;gt; {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">reslove&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">list&lt;/span>.&lt;span style="color:#a6e22e">reduce&lt;/span>((&lt;span style="color:#a6e22e">prev&lt;/span>, &lt;span style="color:#a6e22e">curr&lt;/span>) =&amp;gt; Object.&lt;span style="color:#a6e22e">assign&lt;/span>(&lt;span style="color:#a6e22e">prev&lt;/span>, &lt;span style="color:#a6e22e">curr&lt;/span>)),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> );
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#66d9ef">catch&lt;/span>(&lt;span style="color:#a6e22e">reject&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用方法如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/* name：为图片资源名称，加载完成后引用资源时使用
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> path： 图片路径
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">*/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">imagesList&lt;/span> &lt;span style="color:#f92672">=&lt;/span> [{&lt;span style="color:#a6e22e">name&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#e6db74">&amp;#34;logo&amp;#34;&lt;/span>,&lt;span style="color:#a6e22e">path&lt;/span>&lt;span style="color:#f92672">:&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>}];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">loadResource&lt;/span>(&lt;span style="color:#a6e22e">imagesList&lt;/span>).&lt;span style="color:#a6e22e">then&lt;/span>(&lt;span style="color:#a6e22e">res&lt;/span>=&amp;gt;{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}).&lt;span style="color:#66d9ef">catch&lt;/span>(&lt;span style="color:#a6e22e">err&lt;/span>=&amp;gt;{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">err&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content></item><item><title>关于我自己</title><link>/about/</link><pubDate>Thu, 04 Feb 2021 10:05:28 +0800</pubDate><guid>/about/</guid><description>概述 偏执而又执着的业余前端工程师，热爱计算机技术，自学编程技术，对新技术和科技类内容有浓厚的兴趣。
经历 2014/2015年 就职杭州鼎商信息科技有限公司，任职web前端工程师；
2015/2017年 就职杭州博采网络科技股份有限公司，任职新媒体事业部web前端工程师；
2017/2019年 就职杭州云暴科技有限公司，任职web前端工程师兼前端主管；
2019/至今 就职北京军地联合网络技术中心西安研发中心，任职web前端工程师兼前端主管；
技能 精通HTML，CSS，Javascript 等web基础技术；
熟练使用 Node，Nginx，Mongodb，docker等技术；
熟悉主流前端框架 React，Vue，Svelte，小程序等技术；
熟悉Android基础开发；
方向 偏执和执着的人，总是再试图挑战自我；努力朝着全栈工程师靠近～
联系我 wechat: hgq_tx / qq: 398263326</description><content>&lt;h4 id="概述">概述&lt;/h4>
&lt;p>偏执而又执着的业余前端工程师，热爱计算机技术，自学编程技术，对新技术和科技类内容有浓厚的兴趣。&lt;/p>
&lt;h4 id="经历">经历&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>2014/2015年 就职杭州鼎商信息科技有限公司，任职web前端工程师；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>2015/2017年 就职杭州博采网络科技股份有限公司，任职新媒体事业部web前端工程师；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>2017/2019年 就职杭州云暴科技有限公司，任职web前端工程师兼前端主管；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>2019/至今 就职北京军地联合网络技术中心西安研发中心，任职web前端工程师兼前端主管；&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="技能">技能&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>精通HTML，CSS，Javascript 等web基础技术；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>熟练使用 Node，Nginx，Mongodb，docker等技术；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>熟悉主流前端框架 React，Vue，Svelte，小程序等技术；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>熟悉Android基础开发；&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="方向">方向&lt;/h4>
&lt;p>偏执和执着的人，总是再试图挑战自我；努力朝着全栈工程师靠近～&lt;/p>
&lt;h4 id="联系我">联系我&lt;/h4>
&lt;p>wechat: hgq_tx / qq: 398263326&lt;/p></content></item><item><title>Android Fullscreen</title><link>/posts/android-fullscreen/</link><pubDate>Thu, 04 Feb 2021 09:22:07 +0800</pubDate><guid>/posts/android-fullscreen/</guid><description>沉浸状态栏应用Android应用中很常见,作为新手自己找了很多资料，并无比较完美的结果，也问了身边做Android的大佬，给出的答案也理想，自己各种bing，最终终于找个了满意的结果。 具体实现代码（Kotlin）如下：
if (Build.VERSION.SDK_INT &amp;gt;= 30) { window.setDecorFitsSystemWindows(false) } else { @Suppress(&amp;#34;DEPRECATION&amp;#34;) window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) } 全屏后 Toolbar 最好使用 AppBarLayout 包裹，设置 AppBarLayout 背景颜色即可完成顶部的 Toolbar 大概如下：
&amp;lt;com.google.android.material.appbar.AppBarLayout android:layout_width=&amp;#34;match_parent&amp;#34; android:layout_height=&amp;#34;wrap_content&amp;#34; android:fitsSystemWindows=&amp;#34;true&amp;#34;&amp;gt; &amp;lt;androidx.appcompat.widget.Toolbar android:layout_width=&amp;#34;match_parent&amp;#34; android:layout_height=&amp;#34;wrap_content&amp;#34; android:minHeight=&amp;#34;?attr/actionBarSize&amp;#34; android:overScrollMode=&amp;#34;always&amp;#34; app:layout_scrollFlags=&amp;#34;snap|exitUntilCollapsed&amp;#34; app:title=&amp;#34;@string/nav_giftware_title&amp;#34; app:titleTextColor=&amp;#34;@color/white&amp;#34; /&amp;gt; &amp;lt;/com.google.android.material.appbar.AppBarLayout&amp;gt;</description><content>&lt;p>沉浸状态栏应用Android应用中很常见,作为新手自己找了很多资料，并无比较完美的结果，也问了身边做Android的大佬，给出的答案也理想，自己各种bing，最终终于找个了满意的结果。
具体实现代码（Kotlin）如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-kotlin" data-lang="kotlin">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">Build&lt;/span>.&lt;span style="color:#a6e22e">VERSION&lt;/span>.SDK_INT &lt;span style="color:#f92672">&amp;gt;=&lt;/span> &lt;span style="color:#ae81ff">30&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window.setDecorFitsSystemWindows(&lt;span style="color:#66d9ef">false&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} &lt;span style="color:#66d9ef">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Suppress&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;DEPRECATION&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> window.decorView.systemUiVisibility = (&lt;span style="color:#a6e22e">View&lt;/span>.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> or &lt;span style="color:#a6e22e">View&lt;/span>.SYSTEM_UI_FLAG_LAYOUT_STABLE)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>全屏后 Toolbar 最好使用 AppBarLayout 包裹，设置 AppBarLayout 背景颜色即可完成顶部的 Toolbar 大概如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;com.google.android.material.appbar.AppBarLayout&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">android:layout_width=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;match_parent&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">android:layout_height=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;wrap_content&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">android:fitsSystemWindows=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;true&amp;#34;&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;lt;androidx.appcompat.widget.Toolbar&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">android:layout_width=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;match_parent&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">android:layout_height=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;wrap_content&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">android:minHeight=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;?attr/actionBarSize&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">android:overScrollMode=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;always&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">app:layout_scrollFlags=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;snap|exitUntilCollapsed&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">app:title=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;@string/nav_giftware_title&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">app:titleTextColor=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;@color/white&amp;#34;&lt;/span> &lt;span style="color:#f92672">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">&amp;lt;/com.google.android.material.appbar.AppBarLayout&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content></item></channel></rss>