<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>likepoems</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://likepoems.com/</id>
  <link href="https://likepoems.com/" rel="alternate"/>
  <link href="https://likepoems.com/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, likepoems</rights>
  <subtitle>学习笔记</subtitle>
  <title>如诗</title>
  <updated>2025-11-14T16:00:00.000Z</updated>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="服务端" scheme="https://likepoems.com/categories/service-side/"/>
    <category term="C#" scheme="https://likepoems.com/categories/service-side/cshape/"/>
    <category term="csharp" scheme="https://likepoems.com/tags/csharp/"/>
    <category term="netcore" scheme="https://likepoems.com/tags/netcore/"/>
    <content>
      <![CDATA[<blockquote><p>通过模板字符串和一个匿名对象来解析字符串，这种需求比较常见，对于比较简单的模板字符串，我们可以直接替换，但对于比较复杂的模板，我们可以通过模板工具来实现。</p></blockquote><h3 id="Scriban简介"><a href="#Scriban简介" class="headerlink" title="Scriban简介"></a>Scriban简介</h3><p><a class="link"   href="https://github.com/scriban/scriban" >Scriban<i class="fas fa-external-link-alt"></i></a>是一个适用于.Net的一款轻量级的脚本引擎。</p><p>通过包管理进行安装：</p><p><img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2025/11/nuget_scriban.png"                        alt="nuget_scriban"                 ><br>官方案例：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> template = Template.Parse(<span class="string">&quot;Hello &#123;&#123;name&#125;&#125;!&quot;</span>);</span><br><span class="line"><span class="keyword">var</span> result = template.Render(<span class="keyword">new</span> &#123; Name = <span class="string">&quot;World&quot;</span> &#125;); <span class="comment">// =&gt; &quot;Hello World!&quot;</span></span><br></pre></td></tr></table></figure><p>对于这种简单的模板可以直接使用，但针对嵌套的会出现问题，如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> obj = <span class="keyword">new</span></span><br><span class="line">&#123;</span><br><span class="line">    Today = <span class="keyword">new</span> &#123; time = DateTime.Now, luckyNumber = <span class="number">3.1415926525</span> &#125;,</span><br><span class="line">&#125;;</span><br><span class="line"> <span class="keyword">var</span> temp = Template.Parse(<span class="string">&quot;当前时间：&#123;&#123;Today.time&#125;&#125;&quot;</span>);</span><br><span class="line"> <span class="keyword">var</span> test = temp.Render(obj);</span><br><span class="line"> <span class="comment">// Cannot get the member Today.time for a null object</span></span><br></pre></td></tr></table></figure><p>针对有嵌套的对象，需要单独对传入的对象进行处理，以下是对该功能的封装</p><h3 id="TemplateUtil模板渲染工具"><a href="#TemplateUtil模板渲染工具" class="headerlink" title="TemplateUtil模板渲染工具"></a>TemplateUtil模板渲染工具</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">TemplateUtil</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 渲染模板</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;template&quot;&gt;</span>模板内容<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;anonymousObject&quot;&gt;</span>匿名对象<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">RenderTemplate</span>(<span class="params"><span class="built_in">string</span> template, <span class="built_in">object</span> anonymousObject</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">string</span>.IsNullOrEmpty(template) || anonymousObject == <span class="literal">null</span>)</span><br><span class="line">            <span class="keyword">return</span> template;</span><br><span class="line">        <span class="keyword">try</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// 通过对象构建脚本对象示例</span></span><br><span class="line">            <span class="keyword">var</span> scriptObject = (ScriptObject)ToScriptObject(anonymousObject);</span><br><span class="line">            <span class="comment">// 解析模板</span></span><br><span class="line">            <span class="keyword">var</span> parsedTemplate = Template.Parse(template);</span><br><span class="line">            <span class="comment">// 创建模板引擎的执行上下文</span></span><br><span class="line">            <span class="keyword">var</span> context = <span class="keyword">new</span> TemplateContext();</span><br><span class="line">            <span class="comment">// 将ScriptObject添加到模板的全局作用域中</span></span><br><span class="line">            context.PushGlobal(scriptObject);</span><br><span class="line">            <span class="comment">// 解析错误就直接返回template</span></span><br><span class="line">            <span class="keyword">if</span> (parsedTemplate.HasErrors)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="comment">// 错误信息：parsedTemplate.Messages</span></span><br><span class="line">                <span class="keyword">return</span> template;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 获取解析后的字符串</span></span><br><span class="line">            <span class="keyword">var</span> result = parsedTemplate.Render(context);</span><br><span class="line">            <span class="keyword">return</span> result;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">catch</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> template;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 将匿名对象转换为Scriban可识别的ScriptObject【解决嵌套对象中非字符字段解析问题】</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;anonymousObject&quot;&gt;</span>要转换的匿名对象<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>转换后的ScriptObject<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">object</span> <span class="title">ToScriptObject</span>(<span class="params"><span class="built_in">object</span> anonymousObject</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 空值检查</span></span><br><span class="line">        <span class="keyword">if</span> (anonymousObject == <span class="literal">null</span>) <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="comment">// 检查是否为JObject</span></span><br><span class="line">        <span class="keyword">if</span> (anonymousObject <span class="keyword">is</span> JObject jObject)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> ConvertJObjectToScriptObject(jObject);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 检查是否为JToken（处理JValue等）</span></span><br><span class="line">        <span class="keyword">if</span> (anonymousObject <span class="keyword">is</span> JToken jToken)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> ConvertJTokenToObject(jToken);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 创建新的 ScriptObject 来存储转换后的数据</span></span><br><span class="line">        <span class="keyword">var</span> scriptObject = <span class="keyword">new</span> ScriptObject();</span><br><span class="line">        <span class="comment">// 获取匿名对象的实际类型</span></span><br><span class="line">        <span class="keyword">var</span> type = anonymousObject.GetType();</span><br><span class="line">        <span class="comment">// 通过反射获取对象的所有属性</span></span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">var</span> property <span class="keyword">in</span> type.GetProperties())</span><br><span class="line">        &#123;   <span class="comment">// 获取属性值</span></span><br><span class="line">            <span class="keyword">var</span> <span class="keyword">value</span> = property.GetValue(anonymousObject);</span><br><span class="line">            <span class="comment">// 保留模板中的原始属性，并将转换后的属性值添加到ScriptObject</span></span><br><span class="line">            scriptObject[property.Name] = ConvertValue(<span class="keyword">value</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> scriptObject;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 将JObject转换为ScriptObject</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;jObject&quot;&gt;</span>要转换的JObject<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>转换后的ScriptObject<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> ScriptObject <span class="title">ConvertJObjectToScriptObject</span>(<span class="params">JObject jObject</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">var</span> scriptObject = <span class="keyword">new</span> ScriptObject();</span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">var</span> property <span class="keyword">in</span> jObject.Properties())</span><br><span class="line">        &#123;</span><br><span class="line">            scriptObject[property.Name] = ConvertJTokenToObject(property.Value);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> scriptObject;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 将JToken转换object</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;token&quot;&gt;</span>要转换的JToken<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>转换后的对象<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">object</span> <span class="title">ConvertJTokenToObject</span>(<span class="params">JToken token</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (token == <span class="literal">null</span>) <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">return</span> token.Type <span class="keyword">switch</span></span><br><span class="line">        &#123;</span><br><span class="line">            JTokenType.Object =&gt; ConvertJObjectToScriptObject((JObject)token),</span><br><span class="line">            JTokenType.Array =&gt; ConvertJArrayToList((JArray)token),</span><br><span class="line">            JTokenType.Integer =&gt; token.Value&lt;<span class="built_in">long</span>&gt;(),</span><br><span class="line">            JTokenType.Float =&gt; token.Value&lt;<span class="built_in">double</span>&gt;(),</span><br><span class="line">            JTokenType.String =&gt; token.Value&lt;<span class="built_in">string</span>&gt;(),</span><br><span class="line">            JTokenType.Boolean =&gt; token.Value&lt;<span class="built_in">bool</span>&gt;(),</span><br><span class="line">            JTokenType.Null =&gt; <span class="literal">null</span>,</span><br><span class="line">            JTokenType.Date =&gt; token.Value&lt;DateTime&gt;(),</span><br><span class="line">            JTokenType.Guid =&gt; token.Value&lt;Guid&gt;(),</span><br><span class="line">            _ =&gt; token.ToString(),</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 将JArray转换为List</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;jArray&quot;&gt;</span>要转换的JArray<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>转换后的列表<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> List&lt;<span class="built_in">object</span>&gt; <span class="title">ConvertJArrayToList</span>(<span class="params">JArray jArray</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">var</span> list = <span class="keyword">new</span> List&lt;<span class="built_in">object</span>&gt;();</span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">var</span> item <span class="keyword">in</span> jArray)</span><br><span class="line">        &#123;</span><br><span class="line">            list.Add(ConvertJTokenToObject(item));</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> list;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 递归转换属性值</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 处理各种类型的值：基本类型、匿名对象、集合等</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;value&quot;&gt;</span>要转换的值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>转换后的值<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">object</span> <span class="title">ConvertValue</span>(<span class="params"><span class="built_in">object</span> <span class="keyword">value</span></span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 空值检查</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">value</span> == <span class="literal">null</span>) <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="comment">// 获取值类型</span></span><br><span class="line">        <span class="keyword">var</span> valueType = <span class="keyword">value</span>.GetType();</span><br><span class="line">        <span class="comment">// 检查是否为JObject</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">value</span> <span class="keyword">is</span> JObject jObject)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> ConvertJObjectToScriptObject(jObject);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 检查是否为JToken</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">value</span> <span class="keyword">is</span> JToken jToken)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> ConvertJTokenToObject(jToken);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 如果是匿名类型，递归转换</span></span><br><span class="line">        <span class="keyword">if</span> (valueType.IsClass &amp;&amp; valueType.Name.Contains(<span class="string">&quot;AnonymousType&quot;</span>))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> ToScriptObject(<span class="keyword">value</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 如果是数组或集合，就单独处理</span></span><br><span class="line">        <span class="keyword">if</span> (IsCollection(valueType))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> ConvertEnumerable(<span class="keyword">value</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 直接返回值</span></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">value</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 判断是否为集合或数组</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">IsCollection</span>(<span class="params">Type type</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 排除字符串（虽然字符串实现了 IEnumerable&lt;char&gt;，但通常不作为集合处理）</span></span><br><span class="line">        <span class="keyword">if</span> (type == <span class="keyword">typeof</span>(<span class="built_in">string</span>)) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="comment">// 1. 检查是否为数组</span></span><br><span class="line">        <span class="keyword">if</span> (type.IsArray)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 2. 检查是否实现了 IEnumerable&lt;&gt; 泛型接口</span></span><br><span class="line">        <span class="keyword">if</span> (type.IsGenericType)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">var</span> interfaces = type.GetInterfaces();</span><br><span class="line">            <span class="keyword">if</span> (interfaces.Any(i =&gt;</span><br><span class="line">                i.IsGenericType &amp;&amp;</span><br><span class="line">                i.GetGenericTypeDefinition() == <span class="keyword">typeof</span>(IEnumerable&lt;&gt;)))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 3. 检查是否实现了非泛型 IEnumerable 接口</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">typeof</span>(IEnumerable).IsAssignableFrom(type))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 转换可枚举对象</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;enumerable&quot;&gt;</span>要转换的可枚举对象<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>转换后的列表<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">object</span> <span class="title">ConvertEnumerable</span>(<span class="params"><span class="built_in">object</span> enumerable</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 创建列表来存储转换后的元素</span></span><br><span class="line">        <span class="keyword">var</span> list = <span class="keyword">new</span> List&lt;<span class="built_in">object</span>&gt;();</span><br><span class="line">        <span class="comment">// 遍历原始集合中的每个元素</span></span><br><span class="line">        <span class="keyword">foreach</span> (<span class="function"><span class="keyword">var</span> item <span class="title">in</span> (<span class="params">IEnumerable</span>)enumerable)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// 递归转换每个元素并添加到列表</span></span><br><span class="line">            list.Add(ConvertValue(item));</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> list;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用示例：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> 使用样例（仅支持匿名对象和JObject的渲染）</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Test</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 匿名对象</span></span><br><span class="line">    <span class="keyword">var</span> obj = <span class="keyword">new</span></span><br><span class="line">    &#123;</span><br><span class="line">        Name = <span class="string">&quot;时分&quot;</span>,</span><br><span class="line">        Address = <span class="keyword">new</span> &#123; Province = <span class="string">&quot;四川&quot;</span>, City = <span class="string">&quot;成都&quot;</span> &#125;,</span><br><span class="line">        Today = <span class="keyword">new</span> &#123; time = DateTime.Now, luckyNumber = <span class="number">3.1415926525</span> &#125;,</span><br><span class="line">        Scores = <span class="keyword">new</span>[] &#123; <span class="number">80</span>, <span class="number">85</span>, <span class="number">90</span> &#125;,</span><br><span class="line">        爱好 = <span class="keyword">new</span></span><br><span class="line">        &#123;</span><br><span class="line">            音乐 = <span class="string">&quot;燕归巢&quot;</span>,</span><br><span class="line">            游戏 = <span class="string">&quot;原神&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="comment">// 文本处理</span></span><br><span class="line">    <span class="keyword">var</span> textTemplate = <span class="string">&quot;你好，我是&#123;&#123; Name &#125;&#125;。我目前居住在&#123;&#123; Address[&#x27;Province&#x27;] &#125;&#125;&#123;&#123; Address.City &#125;&#125;，我喜欢听&#123;&#123; 爱好.音乐 &#125;&#125;这首歌，偶尔玩玩&#123;&#123; 爱好.游戏 &#125;&#125;&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> text = TemplateUtil.RenderTemplate(textTemplate, obj);</span><br><span class="line">    Console.WriteLine(text); <span class="comment">// 你好，我是时分。我目前居住在四川成都，我喜欢听燕归巢这首歌，偶尔玩玩原神</span></span><br><span class="line">    <span class="comment">// 日期处理 时间参数不能是date，方法date.to_string冲突</span></span><br><span class="line">    <span class="keyword">var</span> dateTemplate = <span class="string">&quot;当前时间: &#123;&#123; Today.time | date.to_string &#x27;%Y-%m-%d&#x27; &#125;&#125;&quot;</span>; <span class="comment">// Y(年)、m(月)、d(日)、H(时)、M(分)、S(秒)</span></span><br><span class="line">    <span class="keyword">var</span> date = TemplateUtil.RenderTemplate(dateTemplate, obj);</span><br><span class="line">    Console.WriteLine(date); <span class="comment">// 当前时间: 2025-11-13 17:15:06</span></span><br><span class="line">    <span class="comment">// 数字处理</span></span><br><span class="line">    <span class="keyword">var</span> number1 = TemplateUtil.RenderTemplate(<span class="string">&quot;&#123;&#123; Today.luckyNumber | math.round 3 &#125;&#125;&quot;</span>, obj); <span class="comment">// 四舍五入并指定小数位数</span></span><br><span class="line">    Console.WriteLine(number1); <span class="comment">// 3.142</span></span><br><span class="line">    <span class="keyword">var</span> number2 = TemplateUtil.RenderTemplate(<span class="string">&quot;&#123;&#123; Today.luckyNumber | math.format &#x27;p2&#x27;&#125;&#125;&quot;</span>, obj); <span class="comment">// 百分数 P(n)表示保留n位小数</span></span><br><span class="line">    Console.WriteLine(number2);  <span class="comment">// 314.16 %</span></span><br><span class="line">    <span class="comment">// 循环处理</span></span><br><span class="line">    <span class="keyword">var</span> scoreTemplate = <span class="string">&quot;分数列表:&#123;&#123; for score in Scores &#125;&#125; &#123;&#123; score &#125;&#125; 分 &#123;&#123; end &#125;&#125;&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> score = TemplateUtil.RenderTemplate(scoreTemplate, obj);</span><br><span class="line">    Console.WriteLine(score); <span class="comment">// 分数列表: 80 分  85 分  90 分</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// JObject对象</span></span><br><span class="line">    <span class="keyword">var</span> jobj = <span class="keyword">new</span> JObject</span><br><span class="line">    &#123;</span><br><span class="line">        [<span class="string">&quot;Name&quot;</span>] = <span class="string">&quot;时秒&quot;</span>,</span><br><span class="line">        [<span class="string">&quot;Address&quot;</span>] = <span class="keyword">new</span> JObject</span><br><span class="line">        &#123;</span><br><span class="line">            [<span class="string">&quot;Province&quot;</span>] = <span class="string">&quot;四川&quot;</span>,</span><br><span class="line">            [<span class="string">&quot;City&quot;</span>] = <span class="string">&quot;成都&quot;</span>,</span><br><span class="line">        &#125;,</span><br><span class="line">        [<span class="string">&quot;座右铭&quot;</span>] = <span class="keyword">new</span> JArray</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">new</span> JObject</span><br><span class="line">                &#123;</span><br><span class="line">                    [<span class="string">&quot;Sentence&quot;</span>] = <span class="string">&quot;长风破浪会有时，直挂云帆济沧海&quot;</span>,</span><br><span class="line">                    [<span class="string">&quot;Author&quot;</span>] = <span class="string">&quot;李白&quot;</span></span><br><span class="line">                &#125;,</span><br><span class="line">                <span class="keyword">new</span> JObject</span><br><span class="line">                &#123;</span><br><span class="line">                    [<span class="string">&quot;Sentence&quot;</span>] = <span class="string">&quot;书中自有颜如玉，书中自有黄金屋&quot;</span>,</span><br><span class="line">                    [<span class="string">&quot;Author&quot;</span>] = <span class="string">&quot;赵恒&quot;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">var</span> textTemplate2 = <span class="string">&quot;你好，我是&#123;&#123; Name &#125;&#125;。我目前居住在&#123;&#123; Address[&#x27;Province&#x27;] &#125;&#125;&#123;&#123; Address.City &#125;&#125;。&quot;</span> +</span><br><span class="line">        <span class="string">&quot;我特别喜欢&#123;&#123; for poem in 座右铭 &#125;&#125; &#123;&#123; poem.Author &#125;&#125;的&#123;&#123; poem.Sentence &#125;&#125; &#123;&#123; end &#125;&#125;&quot;</span>;</span><br><span class="line">    <span class="keyword">var</span> text2 = TemplateUtil.RenderTemplate(textTemplate2, jobj);</span><br><span class="line">    Console.WriteLine(text2); <span class="comment">// 你好，我是时秒。我目前居住在四川成都。我特别喜欢 李白的长风破浪会有时，直挂云帆济沧海  赵恒的书中自有颜如玉，书中自有黄金屋</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/csharp-parses-templates/</id>
    <link href="https://likepoems.com/archives/csharp-parses-templates/"/>
    <published>2025-11-14T16:00:00.000Z</published>
    <summary>通过模板字符串和一个匿名对象来解析字符串，这种需求比较常见，对于比较简单的模板字符串，我们可以直接替换，但对于比较复杂的模板，我们可以通过模板工具来实现。 Scriban简介 Scriban是一个适用于.Net的一款轻量级的脚本引擎。 通过包管理进行安装： 官方案例： var template =</summary>
    <title>csharp通过对象和模板字符串解析模板</title>
    <updated>2025-11-14T16:00:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="服务端" scheme="https://likepoems.com/categories/service-side/"/>
    <category term="C#" scheme="https://likepoems.com/categories/service-side/cshape/"/>
    <category term="csharp" scheme="https://likepoems.com/tags/csharp/"/>
    <category term="netcore" scheme="https://likepoems.com/tags/netcore/"/>
    <content>
      <![CDATA[<blockquote><p>在一些情况下，我们并不清楚匿名对象具备哪些属性，当需要合并两个匿名对象时，手动实现比较复杂，可以直接使用TypeMerger来实现merge</p></blockquote><h3 id="TypeMerger简单使用"><a href="#TypeMerger简单使用" class="headerlink" title="TypeMerger简单使用"></a>TypeMerger简单使用</h3><p><a class="link"   href="https://github.com/kfinley/TypeMerger" >TypeMerger<i class="fas fa-external-link-alt"></i></a>是 .NET Core中的对象合并方法，支持多种合并处理方式，这里只简单的使用一下。</p><p>使用包管理进行安装：</p><p><img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2025/11/nuget_typeMerger.png"                        alt="TypeMerger"                 ></p><p>示例代码：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> config1 = <span class="keyword">new</span> &#123;</span><br><span class="line">    name = <span class="string">&quot;Tom&quot;</span>,</span><br><span class="line">    age = <span class="number">18</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> config2 = <span class="keyword">new</span> &#123;</span><br><span class="line">    age = <span class="number">20</span>,</span><br><span class="line">    desc = <span class="string">&quot;A student in high school&quot;</span>,</span><br><span class="line">    experience = <span class="keyword">new</span></span><br><span class="line">    &#123;</span><br><span class="line">       first = <span class="string">&quot;Grade 6 of primary school won the third prize in football&quot;</span>,</span><br><span class="line">       second = <span class="string">&quot;I was the first in my class in the final exam of the third year of junior high school&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> mergeConfig = TypeMerger.TypeMerger.Merge(config1, config2);</span><br><span class="line"><span class="keyword">var</span> configString = JsonConvert.SerializeObject(mergeConfig);</span><br><span class="line">Console.WriteLine(configString);</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>返回结果：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Tom&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;age&quot;</span><span class="punctuation">:</span> <span class="number">18</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;desc&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A student in high school&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;experience&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;first&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Grade 6 of primary school won the third prize in football&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;second&quot;</span><span class="punctuation">:</span> <span class="string">&quot;I was the first in my class in the final exam of the third year of junior high school&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>直接merge两个对象（JObject或者匿名对象），如果两个对象有相同属性，默认情况下，第二个对象的属性值会被忽略。</p><p>如果想要第二个对象的age，代码微调：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> mergeConfig = TypeMerger.TypeMerger.Ignore(() =&gt; config1.age).Merge(config1, config2);</span><br><span class="line"><span class="keyword">var</span> configString = JsonConvert.SerializeObject(mergeConfig);</span><br><span class="line">Console.WriteLine(configString);</span><br></pre></td></tr></table></figure><p>或者调整object的顺序即可。</p>]]>
    </content>
    <id>https://likepoems.com/archives/csharp-merges-two-objects/</id>
    <link href="https://likepoems.com/archives/csharp-merges-two-objects/"/>
    <published>2025-11-12T09:17:16.000Z</published>
    <summary>在一些情况下，我们并不清楚匿名对象具备哪些属性，当需要合并两个匿名对象时，手动实现比较复杂，可以直接使用TypeMerger来实现merge TypeMerger简单使用 TypeMerger是 .NET Core中的对象合并方法，支持多种合并处理方式，这里只简单的使用一下。 使用包管理进行安装：</summary>
    <title>csharp实现两个对象的合并</title>
    <updated>2025-11-12T09:17:16.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="服务端" scheme="https://likepoems.com/categories/service-side/"/>
    <category term="C#" scheme="https://likepoems.com/categories/service-side/cshape/"/>
    <category term="csharp" scheme="https://likepoems.com/tags/csharp/"/>
    <category term="netcore" scheme="https://likepoems.com/tags/netcore/"/>
    <content>
      <![CDATA[<blockquote><p>最近做了一个.NET Framework 程序，将从远程接口请求的数据同步到sqlserver数据库中；当数据量小的时候，常规的添加操作是没什么问题的。但数据量比较大时（通常1000行及以上），会花费比较多的时间。这时SqlBulkCopy就能显著的解决这个问题。</p></blockquote><h3 id="1、SqlBulkCopy介绍"><a href="#1、SqlBulkCopy介绍" class="headerlink" title="1、SqlBulkCopy介绍"></a>1、SqlBulkCopy介绍</h3><p>SqlBulkCopy是.NET中的一个包，用于将大批量数据添加到sqlserver数据库中，相比逐行插入它的速度更快，并且支持分批处理，失败事务回滚、设置延迟等。</p><h3 id="2、SqlBulkCopy使用"><a href="#2、SqlBulkCopy使用" class="headerlink" title="2、SqlBulkCopy使用"></a>2、SqlBulkCopy使用</h3><p>这里封装了一个<strong>公共方法</strong>，用于将指定的数据插入到表中。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> 使用SqlBulkCopy批量添加数据</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;connStr&quot;&gt;</span>数据库连接字符串<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;tableName&quot;&gt;</span>表名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;datas&quot;&gt;</span>数据<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;batchSize&quot;&gt;</span>大小<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;timeout&quot;&gt;</span>延迟<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">BulkInsert</span>&lt;<span class="title">T</span>&gt;(<span class="params"><span class="built_in">string</span> connStr, <span class="built_in">string</span> tableName, IEnumerable&lt;T&gt; datas, <span class="built_in">int</span> batchSize, <span class="built_in">int</span> timeout</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">var</span> dataList = <span class="keyword">new</span> List&lt;T&gt;(datas);</span><br><span class="line">    <span class="keyword">while</span> (dataList.Count &gt; <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 计算当前批次的实际大小</span></span><br><span class="line">        <span class="built_in">int</span> currentBatchSize = Math.Min(batchSize, dataList.Count);</span><br><span class="line">        <span class="comment">// 获取当前批次的数据</span></span><br><span class="line">        List&lt;T&gt; batchData = dataList.GetRange(<span class="number">0</span>, currentBatchSize);</span><br><span class="line">        <span class="keyword">using</span> (<span class="keyword">var</span> conn = <span class="keyword">new</span> SqlConnection(connStr))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// 打开连接</span></span><br><span class="line">            conn.Open();</span><br><span class="line">            <span class="comment">// 开始事务</span></span><br><span class="line">            SqlTransaction tran = conn.BeginTransaction();</span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="comment">// 创建 SqlBulkCopy 实例，并进行设置</span></span><br><span class="line">                <span class="keyword">using</span> (<span class="keyword">var</span> bulkCopy = <span class="keyword">new</span> SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran))</span><br><span class="line">                &#123;</span><br><span class="line">                    bulkCopy.DestinationTableName = tableName;</span><br><span class="line">                    bulkCopy.BatchSize = batchSize;</span><br><span class="line">                    bulkCopy.BulkCopyTimeout = timeout;</span><br><span class="line">                    <span class="comment">// 启用流式传输</span></span><br><span class="line">                    bulkCopy.EnableStreaming = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">var</span> properties = <span class="keyword">typeof</span>(T).GetProperties().OrderBy(p =&gt; p.MetadataToken).ToArray();</span><br><span class="line">                    <span class="keyword">foreach</span> (<span class="keyword">var</span> prop <span class="keyword">in</span> properties)</span><br><span class="line">                    &#123;</span><br><span class="line">                        bulkCopy.ColumnMappings.Add(prop.Name, prop.Name);</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="comment">// 使用ObjectReader流式读取数据</span></span><br><span class="line">                    <span class="keyword">using</span> (<span class="keyword">var</span> reader = ObjectReader.Create(batchData))</span><br><span class="line">                    &#123;</span><br><span class="line">                        bulkCopy.WriteToServer(reader);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">// 提交事务</span></span><br><span class="line">                tran.Commit();</span><br><span class="line">                <span class="comment">// 成功提交后移除当前批次的数据</span></span><br><span class="line">                dataList.RemoveRange(<span class="number">0</span>, currentBatchSize);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">catch</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="comment">// 发生异常时回滚事务</span></span><br><span class="line">                tran.Rollback();</span><br><span class="line">                <span class="keyword">throw</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意：<strong>在Modal中申明的实体需要和表中的顺序一一对应</strong><br>举个例子：<br>Modal中定义User：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">User</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> Guid UserId &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Username &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Hobby &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>实际User表结构：<br><img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2025/10/test_user_table.png"                        alt="User表"                 ><br>食用方式：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> users = <span class="keyword">new</span> List&lt;User&gt;()&#123;</span><br><span class="line"><span class="keyword">new</span> User()&#123;UserId = Guid.NewGuid(), Username = <span class="string">&quot;小一&quot;</span>, Hobby = <span class="string">&quot;旅游&quot;</span>&#125;,</span><br><span class="line"><span class="keyword">new</span> User()&#123;UserId = Guid.NewGuid(), Username = <span class="string">&quot;小二&quot;</span>, Hobby = <span class="string">&quot;散步&quot;</span>&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">string</span> connStr = GetConnectionString(); <span class="comment">// 自行定义</span></span><br><span class="line">BulkInsert(connStr, <span class="string">&quot;dbo.user&quot;</span>, users, <span class="number">1000</span>, <span class="number">30</span>);</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/csharp-sqlserver-bulk-data-insertion-solution/</id>
    <link href="https://likepoems.com/archives/csharp-sqlserver-bulk-data-insertion-solution/"/>
    <published>2025-10-17T10:02:07.000Z</published>
    <summary>最近做了一个.NET Framework 程序，将从远程接口请求的数据同步到sqlserver数据库中；当数据量小的时候，常规的添加操作是没什么问题的。但数据量比较大时（通常1000行及以上），会花费比较多的时间。这时SqlBulkCopy就能显著的解决这个问题。 1、SqlBulkCopy介绍 S</summary>
    <title>c# sqlserver大量插入数据解决方案</title>
    <updated>2025-10-17T10:02:07.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="服务端" scheme="https://likepoems.com/categories/service-side/"/>
    <category term="C#" scheme="https://likepoems.com/categories/service-side/cshape/"/>
    <category term="netcore" scheme="https://likepoems.com/tags/netcore/"/>
    <content>
      <![CDATA[<p>近期在运行.net项目时，遇到了“GenerateDepsFile”任务意外失败的问题，错误详情如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">严重性代码说明项目文件行禁止显示状态</span><br><span class="line">错误MSB4018“GenerateDepsFile”任务意外失败。</span><br><span class="line">System.IO.FileNotFoundException: 未能加载文件或程序集“System.Text.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。系统找不到指定的文件。</span><br><span class="line">文件名:“System.Text.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”</span><br><span class="line">   在 Microsoft.Extensions.DependencyModel.DependencyContextWriter.Write(DependencyContext context, Stream stream)</span><br><span class="line">   在 Microsoft.NET.Build.Tasks.GenerateDepsFile.WriteDepsFile(String depsFilePath)</span><br><span class="line">   在 Microsoft.NET.Build.Tasks.GenerateDepsFile.ExecuteCore()</span><br><span class="line">   在 Microsoft.NET.Build.Tasks.TaskBase.Execute()</span><br><span class="line">   在 Microsoft.NET.Build.Tasks.TaskWithAssemblyResolveHooks.Execute()</span><br><span class="line">   在 Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()</span><br><span class="line">   在 Microsoft.Build.BackEnd.TaskBuilder.&lt;ExecuteInstantiatedTask&gt;d__26.MoveNext()</span><br><span class="line"></span><br><span class="line">WRN: Assembly binding logging is turned OFF.</span><br><span class="line">To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.</span><br><span class="line">Note: There is some performance penalty associated with assembly bind failure logging.</span><br><span class="line">To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].</span><br><span class="line">BIPortalServiceC:\Program Files\dotnet\sdk\6.0.136\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.targets172</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>根据错误提示安装了System.Text.Json 6.0.0的包，重新运行后还是报相同的错误。</p><p>A few moments later。。。</p><p>最终解决方案：</p><p>1、检查是否安装dotnet环境，是否装了多个sdk</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dotnet --list-sdks</span><br><span class="line">5.0.404 [C:\Program Files\dotnet\sdk]</span><br><span class="line">6.0.136 [C:\Program Files\dotnet\sdk]</span><br></pre></td></tr></table></figure><p>2、如果有多个，则设置默认的sdk</p><ul><li><p>打开用户文件夹，通常是C:\Users\用户名</p></li><li><p>新建global.json，文件内容如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">   &quot;sdk&quot;: &#123;</span><br><span class="line">      &quot;version&quot;: &quot;5.0.404&quot;,</span><br><span class="line">      &quot;rollForward&quot;: &quot;latestFeature&quot;</span><br><span class="line">   &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul>]]>
    </content>
    <id>https://likepoems.com/archives/dotnet-generatedepsfile-ren-wu-yi-wai-shi-bai-jie-jue-fang-an/</id>
    <link href="https://likepoems.com/archives/dotnet-generatedepsfile-ren-wu-yi-wai-shi-bai-jie-jue-fang-an/"/>
    <published>2025-09-09T08:37:07.000Z</published>
    <summary>近期在运行.net项目时，遇到了“GenerateDepsFile”任务意外失败的问题，错误详情如下： 严重性	代码	说明	项目	文件	行	禁止显示状态错误	MSB4018	“GenerateDepsFile”任务意外失败。System.IO.FileNotFoundException 未能加</summary>
    <title>dotnet “GenerateDepsFile”任务意外失败解决方案</title>
    <updated>2025-09-09T08:37:07.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="笔记" scheme="https://likepoems.com/categories/note/"/>
    <category term="blog" scheme="https://likepoems.com/tags/blog/"/>
    <content>
      <![CDATA[<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --single-branch --branch [分支名称] github远程仓库地址</span><br><span class="line">PS: git <span class="built_in">clone</span> --single-branch --branch cds git@github.com:xxx/person.git</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/github-clone-specific-branch-to-local/</id>
    <link href="https://likepoems.com/archives/github-clone-specific-branch-to-local/"/>
    <published>2025-07-07T05:14:55.000Z</published>
    <summary>git clone --single-branch --branch [分支名称] github远程仓库地址PS git clone --single-branch --branch cds git@github.comxxx/person.git</summary>
    <title>github克隆特定分支到本地</title>
    <updated>2025-07-07T05:14:55.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="服务端" scheme="https://likepoems.com/categories/service-side/"/>
    <category term="C#" scheme="https://likepoems.com/categories/service-side/cshape/"/>
    <category term="csharp" scheme="https://likepoems.com/tags/csharp/"/>
    <category term="netcore" scheme="https://likepoems.com/tags/netcore/"/>
    <content>
      <![CDATA[<blockquote><p>在C#中，我们使用Newtonsoft来对JSON对象或字段串进行序列化和反序列化的操作，但在某些场景下，需要在映射过程中需要对属性进行更改。</p></blockquote><h3 id="1、JsonProperty"><a href="#1、JsonProperty" class="headerlink" title="1、JsonProperty"></a>1、JsonProperty</h3><p>JsonProperty用于指定特定字段的名称，将一个字段指定为另一个字段，示例如下：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">UserInfo</span></span><br><span class="line">&#123;</span><br><span class="line">    [<span class="meta">JsonProperty(<span class="string">&quot;用户名&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Name &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">    [<span class="meta">JsonProperty(<span class="string">&quot;年龄&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Age &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> tom = <span class="keyword">new</span> UserInfo&#123;Name = <span class="string">&#x27;Tom&#x27;</span>, Age = <span class="number">20</span>&#125;;</span><br><span class="line"><span class="keyword">var</span> jsonstr = JsonConvert.SerializeObject(tom);</span><br><span class="line"><span class="keyword">var</span> json = JsonConvert.DeserializeObject&lt;UserInfo&gt;(jsonstr);</span><br></pre></td></tr></table></figure><p>这时jsonstr的值就是{“用户名”:”Tom”,”年龄”:20};<br>但是这会有个问题，json对象的Name和Age都是null;<br>原因是指定的字段名不匹配，也就是说json字符串中字段名要与JsonProperty的值相同才能正确的映射。</p><h3 id="2、自定义JsonConverter"><a href="#2、自定义JsonConverter" class="headerlink" title="2、自定义JsonConverter"></a>2、自定义JsonConverter</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">JsonToChineseConverter</span>&lt;<span class="title">T</span>&gt; : <span class="title">JsonConverter</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="built_in">bool</span> <span class="title">CanConvert</span>(<span class="params">Type objectType</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> objectType == <span class="keyword">typeof</span>(T);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="built_in">object</span> <span class="title">ReadJson</span>(<span class="params">JsonReader reader, Type objectType, <span class="built_in">object</span> existingValue, JsonSerializer serializer</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        JObject jsonObject = JObject.Load(reader);</span><br><span class="line">        T targetObject = (T)Activator.CreateInstance(objectType);</span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">var</span> property <span class="keyword">in</span> objectType.GetProperties())</span><br><span class="line">        &#123;</span><br><span class="line">            NameAttribute nameAttribute = property.GetCustomAttribute&lt;NameAttribute&gt;();</span><br><span class="line">            <span class="built_in">string</span> propertyName = nameAttribute != <span class="literal">null</span> ? nameAttribute.ChineseName : property.Name;</span><br><span class="line">            <span class="keyword">if</span> (jsonObject[propertyName] != <span class="literal">null</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                property.SetValue(targetObject, jsonObject[propertyName].ToObject(property.PropertyType, serializer));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> targetObject;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">WriteJson</span>(<span class="params">JsonWriter writer, <span class="built_in">object</span> <span class="keyword">value</span>, JsonSerializer serializer</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        JObject jsonObject = <span class="keyword">new</span> JObject();</span><br><span class="line">        Type objectType = <span class="keyword">value</span>.GetType();</span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">var</span> property <span class="keyword">in</span> objectType.GetProperties())</span><br><span class="line">        &#123;</span><br><span class="line">            NameAttribute nameAttribute = property.GetCustomAttribute&lt;NameAttribute&gt;();</span><br><span class="line">            <span class="built_in">string</span> propertyName = nameAttribute != <span class="literal">null</span> ? nameAttribute.ChineseName : property.Name;</span><br><span class="line">            jsonObject[propertyName] = JToken.FromObject(property.GetValue(<span class="keyword">value</span>), serializer);</span><br><span class="line">        &#125;</span><br><span class="line">        jsonObject.WriteTo(writer);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">[<span class="meta">AttributeUsage(AttributeTargets.Property)</span>]</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">NameAttribute</span> : <span class="title">Attribute</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> ChineseName &#123;</span><br><span class="line">        <span class="keyword">get</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">NameAttribute</span>(<span class="params"><span class="built_in">string</span> chineseName</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        ChineseName = chineseName;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明：</p><ul><li><p>JsonToChineseConverter<T> 是一个泛型的类，继承JsonConverter，用于在 JSON 序列化和反序列化过程中，将 JSON 中的字段名从中文名称映射到 C# 对象的属性名，或者反过来将 C# 对象的属性名映射为中文名称。</p></li><li><p>该类通过自定义特性 [NameAttribute] 来对类的属性进行标记，并指定它的中文名称，如果没有标记，则使用本身的属性。</p></li><li><p>CanConvert：判断当前转换器是否适用于指定的类型 T。<br>ReadJson：在反序列化时，将 JSON 数据转换为 C# 对象。根据 [NameAttribute] 的中文名称找到对应的属性并赋值。<br>WriteJson：在序列化时，将 C# 对象转换为 JSON 数据。根据 [NameAttribute] 的中文名称生成对应的 JSON 字段。</p></li></ul><p>使用方法：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">UserInfo</span></span><br><span class="line">&#123;</span><br><span class="line">    [<span class="meta">Name(<span class="string">&quot;用户名&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Name &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">    [<span class="meta">Name(<span class="string">&quot;年龄&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Age &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> tom = <span class="keyword">new</span> UserInfo&#123;Name = <span class="string">&#x27;Tom&#x27;</span>, Age = <span class="number">20</span>&#125;;</span><br><span class="line"><span class="keyword">var</span> setting = <span class="keyword">new</span> JsonToChineseConverter&lt;UserInfo&gt;();</span><br><span class="line"><span class="keyword">var</span> jsonstr = JsonConvert.SerializeObject(tom, setting);</span><br><span class="line"><span class="keyword">var</span> json = JsonConvert.DeserializeObject&lt;UserInfo&gt;(jsonstr, setting);</span><br><span class="line">Console.WriteLine(jsonstr); <span class="comment">// &#123;&quot;用户名&quot;:&quot;Tom&quot;,&quot;年龄&quot;:20&#125;</span></span><br></pre></td></tr></table></figure><p>json对象：<br>Name：Tom<br>Age: 20</p>]]>
    </content>
    <id>https://likepoems.com/archives/csharp-newtonsoft-custom-json-converter/</id>
    <link href="https://likepoems.com/archives/csharp-newtonsoft-custom-json-converter/"/>
    <published>2025-03-18T08:26:00.000Z</published>
    <summary>在C#中，我们使用Newtonsoft来对JSON对象或字段串进行序列化和反序列化的操作，但在某些场景下，需要在映射过程中需要对属性进行更改。 1、JsonProperty JsonProperty用于指定特定字段的名称，将一个字段指定为另一个字段，示例如下： public class UserIn</summary>
    <title>C# Newtonsoft自定义JsonConverter</title>
    <updated>2025-03-18T08:26:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="笔记" scheme="https://likepoems.com/categories/note/"/>
    <category term="blog" scheme="https://likepoems.com/tags/blog/"/>
    <category term="wordpress" scheme="https://likepoems.com/tags/wordpress/"/>
    <content>
      <![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><blockquote><p>argon主题是一款由<a class="link"   href="https://github.com/solstice23/argon-theme"  title="solstice23">solstice23<i class="fas fa-external-link-alt"></i></a>开发的一款简洁美观的WordPress主题，在使用过程中也发现了几个可以优化的点，在查阅<a class="link"   href="https://argon-docs.solstice23.top/"  title="主题文档">主题文档<i class="fas fa-external-link-alt"></i></a>无果后对其进行以下几点修改。</p></blockquote><h3 id="1、使用子主题"><a href="#1、使用子主题" class="headerlink" title="1、使用子主题"></a>1、使用子主题</h3><p>为了避免修改源文件而引起主题更新后修改丢失的问题，还是尽量使用子主题来进行修改。 在主题文件夹目录下，创建一个文件夹，这里是rushi，打开rushi，创建一个style.css，输入：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">Theme Name:     rushi</span></span><br><span class="line"><span class="comment">Description:    child theme for the argon theme</span></span><br><span class="line"><span class="comment">Author:         likepoems</span></span><br><span class="line"><span class="comment">Author URI:     https://likepoems.com</span></span><br><span class="line"><span class="comment">Template:       argon</span></span><br><span class="line"><span class="comment">Version:        1.0.0</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>Template一定是当前目录下的文件夹的名称。如图： <img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2024/07/Dingtalk_20240720194927.jpg"                                        >我这里名称是argon，所以rushi的模板主题就是argon。 如果需要添加自定义方法，就在子主题文件夹下新建functions.php， 里面添加自己的方法即可，如果要覆盖模版主题的页头或页脚，就添加一个同名的header.php或者footer.php即可。</p><blockquote><p>后面的修改默认是在子主题的functions.php中进行的。</p></blockquote><h3 id="2、友链图片加载优化"><a href="#2、友链图片加载优化" class="headerlink" title="2、友链图片加载优化"></a>2、友链图片加载优化</h3><p>argon主题在加载头像时默认会直接加载，如果图片的链接很慢，比如github的资源，此时效果是白色的背景。或者图片链接无效，直接显示alt的信息。 图片延迟加载（懒加载），在加载图片时会先默认加载一个占位图，在加载完成后占位图会变成图片真实的地址，如果加载出错，会返回一张默认的图片，这里使用lazyload.js库，实现方式如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>图片延迟加载<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="selector-tag">img</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">width</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span>  <span class="attr">class</span>=<span class="string">&quot;lazy&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;lazy.jpg&quot;</span></span></span><br><span class="line"><span class="tag">         <span class="attr">src</span>=<span class="string">&quot;https://gcore.jsdelivr.net/gh/likepoems/rushi/lazyload/inload.svg&quot;</span>  &gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">img</span>  <span class="attr">class</span>=<span class="string">&quot;lazy&quot;</span> <span class="attr">data-src</span>=<span class="string">&quot;https://gcore.jsdelivr.net/gh/likepoems/rushi/lazyload/logo.jpg&quot;</span></span></span><br><span class="line"><span class="tag">         <span class="attr">src</span>=<span class="string">&quot;https://gcore.jsdelivr.net/gh/likepoems/rushi/lazyload/inload.svg&quot;</span>  &gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://gcore.jsdelivr.net/gh/likepoems/rushi/lazyload/lazyload.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">new</span> <span class="title class_">LazyLoad</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">callback_error</span>: <span class="function">(<span class="params">img</span>) =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            img.<span class="title function_">setAttribute</span>(</span></span><br><span class="line"><span class="language-javascript">                <span class="string">&quot;src&quot;</span>,</span></span><br><span class="line"><span class="language-javascript">                <span class="string">&quot;https://gcore.jsdelivr.net/gh/likepoems/rushi/lazyload/Transparent_Akkarin.th.jpg&quot;</span></span></span><br><span class="line"><span class="language-javascript">            );</span></span><br><span class="line"><span class="language-javascript">        &#125;,</span></span><br><span class="line"><span class="language-javascript">    &#125;);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>效果如下： <img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2024/07/lazyloadimg20240720.gif"                                        ></p><h3 id="3、友链短代码优化"><a href="#3、友链短代码优化" class="headerlink" title="3、友链短代码优化"></a>3、友链短代码优化</h3><p>由于argon默认的短代码会将所有分类的链接都显示在页面中，如果要实现不同分类的链接，还需要通过短代码一个一个的添加，比如：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">常用网站</span><br><span class="line"></span><br><span class="line">[sfriendlinks]</span><br><span class="line"></span><br><span class="line">link|https://blog.csdn.net/likepoems|CSDN博客|活的像诗一样|https://static.likepoems.com/uploads/2021/01/favicon.jpg</span><br><span class="line"></span><br><span class="line">[/sfriendlinks]</span><br><span class="line"></span><br><span class="line">我的项目</span><br><span class="line"></span><br><span class="line">[sfriendlinks]</span><br><span class="line"></span><br><span class="line">link|https://blog.likepoems.com/|myblog前台|基于Vue.js的个人博客(personal)|https://static.likepoems.com/uploads/2021/01/favicon.jpg</span><br><span class="line"></span><br><span class="line">[/sfriendlinks]</span><br></pre></td></tr></table></figure><blockquote><p>使用sfriendlinks将link包裹起来即可。</p></blockquote><p>这样不太方便，一旦链接分类过多，这里就会成为负担。 解决方案：改动短代码的实现方式。 在functions.php中，添加以下代码：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_ invoke__">add_shortcode</span>(<span class="string">&#x27;myfriendlinks&#x27;</span>,<span class="string">&#x27;shortcode_friend_links&#x27;</span>);</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">shortcode_friend_links</span>(<span class="params"><span class="variable">$attr</span>,<span class="variable">$content</span>=<span class="string">&quot;&quot;</span></span>)</span>&#123;</span><br><span class="line">    <span class="variable">$result</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="variable">$linkcats</span> = <span class="title function_ invoke__">get_terms</span>(<span class="string">&#x27;link_category&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">empty</span>(<span class="variable">$linkcats</span>)) <span class="keyword">return</span> <span class="title function_ invoke__">rushi_getlinkitems</span>(<span class="variable">$attr</span>,<span class="variable">$content</span>);  <span class="comment">// 友链无分类，直接返回全部列表</span></span><br><span class="line">    <span class="variable">$link_category_need_display</span> = <span class="title function_ invoke__">get_post_meta</span>(<span class="title function_ invoke__">get_queried_object_id</span>(), <span class="string">&#x27;link_category_need_display&#x27;</span>, <span class="literal">false</span>);</span><br><span class="line">    <span class="keyword">foreach</span> (<span class="variable">$linkcats</span> <span class="keyword">as</span> <span class="variable">$linkcat</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="keyword">empty</span>(<span class="variable">$link_category_need_display</span>) &amp;&amp; !<span class="title function_ invoke__">in_array</span>(<span class="variable">$linkcat</span>-&gt;name, <span class="variable">$link_category_need_display</span>, <span class="literal">true</span>)) &#123;</span><br><span class="line">            <span class="keyword">continue</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="variable">$result</span> .= <span class="string">&#x27;&lt;h2&gt;&#x27;</span> . <span class="variable">$linkcat</span>-&gt;name . <span class="string">&#x27;&lt;/h2&gt;&#x27;</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable">$linkcat</span>-&gt;description) &#123;</span><br><span class="line">            <span class="variable">$result</span> .= <span class="string">&#x27;&lt;div&gt;&#x27;</span> . <span class="variable">$linkcat</span>-&gt;description . <span class="string">&#x27;&lt;/div&gt;&#x27;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="variable">$result</span> .= <span class="title function_ invoke__">rushi_getlinkitems</span>(<span class="variable">$attr</span>,<span class="variable">$content</span>,<span class="variable">$linkcat</span>-&gt;term_id);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$result</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">rushi_getlinkitems</span>(<span class="params"><span class="variable">$attr</span>,<span class="variable">$content</span>,<span class="variable">$id</span></span>)</span>&#123;</span><br><span class="line">    <span class="variable">$sort</span> = <span class="keyword">isset</span>( <span class="variable">$attr</span>[<span class="string">&#x27;sort&#x27;</span>] ) ? <span class="variable">$attr</span>[<span class="string">&#x27;sort&#x27;</span>] : <span class="string">&#x27;name&#x27;</span>;</span><br><span class="line">    <span class="variable">$order</span> = <span class="keyword">isset</span>( <span class="variable">$attr</span>[<span class="string">&#x27;order&#x27;</span>] ) ? <span class="variable">$attr</span>[<span class="string">&#x27;order&#x27;</span>] : <span class="string">&#x27;ASC&#x27;</span>;</span><br><span class="line">    <span class="variable">$friendlinks</span> = <span class="title function_ invoke__">get_bookmarks</span>( <span class="keyword">array</span>(</span><br><span class="line">        <span class="string">&#x27;orderby&#x27;</span> =&gt; <span class="variable">$sort</span> ,</span><br><span class="line">        <span class="string">&#x27;order&#x27;</span>   =&gt; <span class="variable">$order</span>,</span><br><span class="line">        <span class="string">&#x27;category&#x27;</span> =&gt; <span class="variable">$id</span></span><br><span class="line">    ));</span><br><span class="line">    <span class="variable">$style</span> = <span class="keyword">isset</span>( <span class="variable">$attr</span>[<span class="string">&#x27;style&#x27;</span>] ) ? <span class="variable">$attr</span>[<span class="string">&#x27;style&#x27;</span>] : <span class="string">&#x27;1&#x27;</span>;</span><br><span class="line">    <span class="keyword">switch</span> (<span class="variable">$style</span>) &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;1&#x27;</span>:</span><br><span class="line">            <span class="variable">$class</span> = <span class="string">&quot;friend-links-style1&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;1-square&#x27;</span>:</span><br><span class="line">            <span class="variable">$class</span> = <span class="string">&quot;friend-links-style1 friend-links-style1-square&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;2&#x27;</span>:</span><br><span class="line">            <span class="variable">$class</span> = <span class="string">&quot;friend-links-style2&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&#x27;2-big&#x27;</span>:</span><br><span class="line">            <span class="variable">$class</span> = <span class="string">&quot;friend-links-style2 friend-links-style2-big&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">default</span>:</span><br><span class="line">            <span class="variable">$class</span> = <span class="string">&quot;friend-links-style1&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable">$out</span> = <span class="string">&quot;&lt;div class=&#x27;friend-links &quot;</span> . <span class="variable">$class</span> . <span class="string">&quot;&#x27;&gt;&lt;div class=&#x27;row&#x27;&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">foreach</span> (<span class="variable">$friendlinks</span> <span class="keyword">as</span> <span class="variable">$friendlink</span>)&#123;</span><br><span class="line">        <span class="variable">$out</span> .= <span class="string">&quot;</span></span><br><span class="line"><span class="string">            &lt;div class=&#x27;link mb-2 col-lg-6 col-md-6&#x27;&gt;</span></span><br><span class="line"><span class="string">                &lt;div class=&#x27;card shadow-sm friend-link-container&quot;</span> . (<span class="variable">$friendlink</span> -&gt; link_image == <span class="string">&quot;&quot;</span> ? <span class="string">&quot; no-avatar&quot;</span> : <span class="string">&quot;&quot;</span>) . <span class="string">&quot;&#x27;&gt;&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable">$friendlink</span> -&gt; link_image != <span class="string">&#x27;&#x27;</span>)&#123;</span><br><span class="line">            <span class="variable">$out</span> .= <span class="string">&quot;</span></span><br><span class="line"><span class="string">        &lt;img src=&#x27;&quot;</span> . <span class="variable">$friendlink</span> -&gt; link_image . <span class="string">&quot;&#x27; class=&#x27;friend-link-avatar bg-gradient-secondary&#x27;&gt; &quot;</span>;&#125;</span><br><span class="line">        <span class="variable">$out</span> .= <span class="string">&quot;  &lt;div class=&#x27;friend-link-content&#x27;&gt;</span></span><br><span class="line"><span class="string">                        &lt;div class=&#x27;friend-link-title title text-primary&#x27;&gt;</span></span><br><span class="line"><span class="string">                            &lt;a target=&#x27;_blank&#x27; href=&#x27;&quot;</span> . <span class="title function_ invoke__">esc_url</span>(<span class="variable">$friendlink</span> -&gt; link_url) . <span class="string">&quot;&#x27;&gt;&quot;</span> . <span class="title function_ invoke__">esc_html</span>(<span class="variable">$friendlink</span> -&gt; link_name) . <span class="string">&quot;&lt;/a&gt;</span></span><br><span class="line"><span class="string">                        &lt;/div&gt;</span></span><br><span class="line"><span class="string">                        &lt;div class=&#x27;friend-link-description&#x27;&gt;&quot;</span> . <span class="title function_ invoke__">esc_html</span>(<span class="variable">$friendlink</span> -&gt; link_description) . <span class="string">&quot;&lt;/div&gt;&quot;</span>;</span><br><span class="line">        <span class="variable">$out</span> .= <span class="string">&quot;      &lt;div class=&#x27;friend-link-links&#x27;&gt;&quot;</span>;</span><br><span class="line">        <span class="keyword">foreach</span> (<span class="title function_ invoke__">explode</span>(<span class="string">&quot;\n&quot;</span>, <span class="variable">$friendlink</span> -&gt; link_notes) <span class="keyword">as</span> <span class="variable">$line</span>)&#123;</span><br><span class="line">            <span class="variable">$item</span> = <span class="title function_ invoke__">explode</span>(<span class="string">&quot;|&quot;</span>, <span class="title function_ invoke__">trim</span>(<span class="variable">$line</span>));</span><br><span class="line">            <span class="keyword">if</span>(<span class="title function_ invoke__">stripos</span>(<span class="variable">$item</span>[<span class="number">0</span>], <span class="string">&quot;fa-&quot;</span>) !== <span class="number">0</span>)&#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="variable">$out</span> .= <span class="string">&quot;&lt;a href=&#x27;&quot;</span> . <span class="title function_ invoke__">esc_url</span>(<span class="variable">$item</span>[<span class="number">1</span>]) . <span class="string">&quot;&#x27; target=&#x27;_blank&#x27;&gt;&lt;i class=&#x27;fa &quot;</span> . <span class="title function_ invoke__">sanitize_html_class</span>(<span class="variable">$item</span>[<span class="number">0</span>]) . <span class="string">&quot;&#x27;&gt;&lt;/i&gt;&lt;/a&gt;&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="variable">$out</span> .= <span class="string">&quot;&lt;a href=&#x27;&quot;</span> . <span class="title function_ invoke__">esc_url</span>(<span class="variable">$friendlink</span> -&gt; link_url) . <span class="string">&quot;&#x27; target=&#x27;_blank&#x27; style=&#x27;float:right; margin-right: 10px;&#x27;&gt;&lt;i class=&#x27;fa fa-angle-right&#x27; style=&#x27;font-weight: bold;&#x27;&gt;&lt;/i&gt;&lt;/a&gt;&quot;</span>;</span><br><span class="line">        <span class="variable">$out</span> .= <span class="string">&quot;</span></span><br><span class="line"><span class="string">                        &lt;/div&gt;</span></span><br><span class="line"><span class="string">                    &lt;/div&gt;</span></span><br><span class="line"><span class="string">                &lt;/div&gt;</span></span><br><span class="line"><span class="string">            &lt;/div&gt;&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable">$out</span> .= <span class="string">&quot;&lt;/div&gt;&lt;/div&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$out</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用方式：</p><blockquote><p>由于注册的是myfriendlinks的短代码，所以在友链的页面中需使用myfriendlinks，参数和friendlinks的一样，如：myfriendlinks style&#x3D;”1”</p></blockquote><p>这样就会先读取链接列表，根据链接分类动态生成标题和相应的链接div，效果如下： <img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2024/07/Dingtalk_20240720204409.jpg"                                        ></p><h3 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h3><p>当然，可以结合懒加载和自定义的短代码实现根据标签分类来生成，这样的效果就更加丝滑了，可以将img中的src改为data-src，并添加src属性，值是加载中图片的链接，最后给img标签的class追究一个lazy即可。最后，文章中的不足或者有疑问欢迎留言。</p>]]>
    </content>
    <id>https://likepoems.com/archives/the-argon-topic-adjustment-diary/</id>
    <link href="https://likepoems.com/archives/the-argon-topic-adjustment-diary/"/>
    <published>2024-07-20T12:45:00.000Z</published>
    <summary>前言 argon主题是一款由solstice23开发的一款简洁美观的WordPress主题，在使用过程中也发现了几个可以优化的点，在查阅主题文档无果后对其进行以下几点修改。 1、使用子主题 为了避免修改源文件而引起主题更新后修改丢失的问题，还是尽量使用子主题来进行修改。 在主题文件夹目录下，创建一个</summary>
    <title>argon主题调整日记</title>
    <updated>2024-07-20T12:45:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="框架" scheme="https://likepoems.com/categories/front-end/web-framework/"/>
    <category term="react" scheme="https://likepoems.com/tags/react/"/>
    <content>
      <![CDATA[<h3 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h3><p>通常情况下，React 子组件使用父组件的方法或值通过props传递，反过来，父组件如果需要子组件的方法就需要子组件将自己的方法暴露出去。以下是一个实例：</p><p>User.tsx</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, &#123; <span class="variable constant_">FC</span>, useEffect, useState, useRef &#125; <span class="keyword">from</span> <span class="string">&#x27;react&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">Button</span>, <span class="title class_">Table</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;antd&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">UserEdit</span>, &#123; <span class="title class_">UserEditRef</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;./UserEdit&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">EditFilled</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;@ant-design/icons&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">User</span> &#123;</span><br><span class="line">  <span class="attr">desc</span>?: <span class="built_in">string</span>;</span><br><span class="line">  <span class="attr">name</span>?: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> <span class="title class_">User</span>: <span class="variable constant_">FC</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> userEditRef = useRef&lt;<span class="title class_">UserEditRef</span>&gt;(<span class="literal">null</span>);</span><br><span class="line">  <span class="keyword">const</span> <span class="attr">columns</span>: <span class="built_in">any</span> = [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&#x27;名称&#x27;</span>,</span><br><span class="line">      <span class="attr">dataIndex</span>: <span class="string">&#x27;name&#x27;</span>,</span><br><span class="line">      <span class="attr">key</span>: <span class="string">&#x27;name&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&#x27;描述&#x27;</span>,</span><br><span class="line">      <span class="attr">dataIndex</span>: <span class="string">&#x27;desc&#x27;</span>,</span><br><span class="line">      <span class="attr">key</span>: <span class="string">&#x27;desc&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&#x27;操作&#x27;</span>,</span><br><span class="line">      <span class="attr">render</span>: <span class="function">(<span class="params"><span class="attr">_</span>: <span class="built_in">string</span>, <span class="attr">record</span>: <span class="title class_">User</span></span>) =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> (</span><br><span class="line">          <span class="language-xml"><span class="tag">&lt;<span class="name">EditFilled</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">onClick</span>=<span class="string">&#123;(e)</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-xml">              userEditRef.current?.open(record);</span></span><br><span class="line"><span class="language-xml">            &#125;&#125;</span></span><br><span class="line"><span class="language-xml">          /&gt;</span></span><br><span class="line">        );</span><br><span class="line">      &#125;,</span><br><span class="line">    &#125;,</span><br><span class="line">  ];</span><br><span class="line">  <span class="keyword">const</span> [datasource, setDatasource] = useState&lt;<span class="title class_">User</span>[]&gt;([</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">desc</span>: <span class="string">&#x27;I am Tom&#x27;</span>,</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;Tom&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">desc</span>: <span class="string">&#x27;I am Marry&#x27;</span>,</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;Marry&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">  ]);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">updateData</span> = (<span class="params"><span class="attr">data</span>?: <span class="title class_">User</span></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> datas = [data, ...datasource];</span><br><span class="line">    <span class="title function_">setDatasource</span>(datas);</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-xml">          userEditRef.current.open();</span></span><br><span class="line"><span class="language-xml">        &#125;&#125;</span></span><br><span class="line"><span class="language-xml">      &gt;</span></span><br><span class="line"><span class="language-xml">        新建</span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">Table</span> <span class="attr">columns</span>=<span class="string">&#123;columns&#125;</span> <span class="attr">dataSource</span>=<span class="string">&#123;datasource&#125;</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">UserEdit</span> <span class="attr">ref</span>=<span class="string">&#123;userEditRef&#125;</span> <span class="attr">onSave</span>=<span class="string">&#123;updateData&#125;</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">User</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>UserEdit.tsx</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; useState, useImperativeHandle, forwardRef &#125; <span class="keyword">from</span> <span class="string">&#x27;react&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">Form</span>, <span class="title class_">Input</span>, <span class="title class_">Drawer</span>, <span class="title class_">Button</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;antd&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">User</span> &#123;</span><br><span class="line">  <span class="attr">userId</span>?: <span class="built_in">number</span>;</span><br><span class="line">  <span class="attr">desc</span>?: <span class="built_in">string</span>;</span><br><span class="line">  <span class="attr">name</span>?: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">PropType</span> &#123;</span><br><span class="line">  <span class="attr">onSave</span>: <span class="title class_">Function</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">interface</span> <span class="title class_">UserEditRef</span> &#123;</span><br><span class="line">  <span class="attr">open</span>: <span class="function">(<span class="params"><span class="attr">currentUser</span>?: <span class="title class_">User</span></span>) =&gt;</span> <span class="built_in">void</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title class_">UserEdit</span> = forwardRef&lt;<span class="title class_">UserEditRef</span>, <span class="title class_">PropType</span>&gt;(<span class="function">(<span class="params">props, ref</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="comment">//props</span></span><br><span class="line">  <span class="keyword">const</span> &#123; onSave &#125; = props;</span><br><span class="line">  <span class="comment">// state</span></span><br><span class="line">  <span class="keyword">const</span> [userEditOpen, setUserEditOpen] = <span class="title function_">useState</span>(<span class="literal">false</span>);</span><br><span class="line">  <span class="keyword">const</span> [currentFormData, setCurrentFormData] = useState&lt;<span class="title class_">User</span>&gt;();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 暴露给父组件的属性，open是打开抽屉的方法</span></span><br><span class="line">  <span class="title function_">useImperativeHandle</span>(ref, <span class="function">() =&gt;</span> (&#123;</span><br><span class="line">    <span class="attr">open</span>: <span class="function">(<span class="params"><span class="attr">currentUser</span>?: <span class="title class_">User</span></span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="title function_">setUserEditOpen</span>(<span class="literal">true</span>);</span><br><span class="line">      <span class="title function_">setCurrentFormData</span>(currentUser);</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;));</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">onCancel</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="title function_">setUserEditOpen</span>(<span class="literal">false</span>);</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">onFinish</span> = (<span class="params"><span class="attr">values</span>: <span class="built_in">any</span></span>) =&gt; &#123;</span><br><span class="line">    <span class="title function_">onSave</span>(values);</span><br><span class="line">    <span class="title function_">setUserEditOpen</span>(<span class="literal">false</span>);</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;<span class="name">Drawer</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">title</span>=<span class="string">&#123;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">currentFormData</span> ? &#x27;<span class="attr">用户</span> | &#x27; + <span class="attr">currentFormData</span>?<span class="attr">.name</span> <span class="attr">:</span> &#x27;<span class="attr">用户</span> | <span class="attr">新建</span>&#x27;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      &#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">width</span>=<span class="string">&quot;auto&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">open</span>=<span class="string">&#123;userEditOpen&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">footer</span>=<span class="string">&#123;null&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">onClose</span>=<span class="string">&#123;onCancel&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">destroyOnClose</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">    &gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">Form</span> <span class="attr">initialValues</span>=<span class="string">&#123;currentFormData&#125;</span> <span class="attr">onFinish</span>=<span class="string">&#123;onFinish&#125;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Form.Item</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">label</span>=<span class="string">&quot;组名&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">name</span>=<span class="string">&quot;name&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">rules</span>=<span class="string">&#123;[&#123;</span> <span class="attr">required:</span> <span class="attr">true</span>, <span class="attr">message:</span> &#x27;<span class="attr">请输入用户名</span>!&#x27; &#125;]&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        &gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Input</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Form.Item</span> <span class="attr">label</span>=<span class="string">&quot;描述&quot;</span> <span class="attr">name</span>=<span class="string">&quot;desc&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Input.TextArea</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Button</span> <span class="attr">type</span>=<span class="string">&quot;primary&quot;</span> <span class="attr">htmlType</span>=<span class="string">&quot;submit&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">            提交</span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">htmlType</span>=<span class="string">&quot;button&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">onClick</span>=<span class="string">&#123;onCancel&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">marginLeft:</span> <span class="attr">8</span> &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          &gt;</span></span></span><br><span class="line"><span class="language-xml">            取消</span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/<span class="name">Form</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/<span class="name">Drawer</span>&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">UserEdit</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="效果预览"><a href="#效果预览" class="headerlink" title="效果预览"></a>效果预览</h3><p><a class="link"   href="https://stackblitz.com/edit/react-hooks-child-to-parent?file=src/User.tsx" >React hooks子组件暴露方法示例<i class="fas fa-external-link-alt"></i></a></p>]]>
    </content>
    <id>https://likepoems.com/archives/react-hooks-example-of-the-subcomponent-exposure-method/</id>
    <link href="https://likepoems.com/archives/react-hooks-example-of-the-subcomponent-exposure-method/"/>
    <published>2024-02-01T09:23:00.000Z</published>
    <summary>说明 通常情况下，React 子组件使用父组件的方法或值通过props传递，反过来，父组件如果需要子组件的方法就需要子组件将自己的方法暴露出去。以下是一个实例： User.tsx import React, { FC, useEffect, useState, useRef } from 'reac</summary>
    <title>React hooks子组件暴露方法示例</title>
    <updated>2024-02-01T09:23:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="服务端" scheme="https://likepoems.com/categories/service-side/"/>
    <category term="C#" scheme="https://likepoems.com/categories/service-side/cshape/"/>
    <category term="csharp" scheme="https://likepoems.com/tags/csharp/"/>
    <category term="netcore" scheme="https://likepoems.com/tags/netcore/"/>
    <content>
      <![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><blockquote><p>本文简单的通过C#的SmtpClient实现发送邮件的功能。</p></blockquote><h3 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System.Net.Mail;</span><br><span class="line"><span class="keyword">using</span> System.Net;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Test</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SendMail</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">private</span> SmtpClient _emailClient;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UserInfo</span> &#123;</span><br><span class="line">            <span class="keyword">public</span> string Email &#123; get; set; &#125; <span class="comment">// 用户的邮箱</span></span><br><span class="line">            <span class="keyword">public</span> string DisplayName &#123; get; set; &#125; <span class="comment">// 用户的显示名称</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="comment">/// &lt;summary&gt;</span></span><br><span class="line">        <span class="comment">/// 发送邮件（邮件主题，邮件内容，接收人，抄送人，密送人，附件）</span></span><br><span class="line">        <span class="comment">/// &lt;/summary&gt;</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> string <span class="title">SendMail</span><span class="params">(</span></span></span><br><span class="line"><span class="params"><span class="function">            string subject,</span></span></span><br><span class="line"><span class="params"><span class="function">            string body,</span></span></span><br><span class="line"><span class="params"><span class="function">            ICollection&lt;UserInfo&gt; tos,</span></span></span><br><span class="line"><span class="params"><span class="function">            ICollection&lt;UserInfo&gt;? ccs = null,</span></span></span><br><span class="line"><span class="params"><span class="function">            ICollection&lt;UserInfo&gt;? bccs = null,</span></span></span><br><span class="line"><span class="params"><span class="function">            ICollection&lt;Attachment&gt;? attachments = null)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 设置smtp配置信息(以QQ邮箱为例)</span></span><br><span class="line">            string host = <span class="string">&quot;smtp.qq.com&quot;</span>; <span class="comment">// 邮件服务器</span></span><br><span class="line">            <span class="type">int</span> port = <span class="number">587</span>; <span class="comment">// 端口号</span></span><br><span class="line">            <span class="type">bool</span> enableSsl = <span class="literal">true</span>; <span class="comment">// 是否开启ssl</span></span><br><span class="line">            string username = <span class="string">&quot;yourqqemail&quot;</span>; <span class="comment">// 你的邮箱</span></span><br><span class="line">            string password = <span class="string">&quot;yourpassword&quot;</span>; <span class="comment">// 你的邮箱授权码</span></span><br><span class="line">            string senderAddress = <span class="string">&quot;yourqqemail&quot;</span>;<span class="comment">// 你的邮箱</span></span><br><span class="line">            string senderDisplayName = <span class="string">&quot;test&quot;</span>; <span class="comment">// 发件人那里展示的名字</span></span><br><span class="line"></span><br><span class="line">            <span class="comment">// 实例化smtp服务器</span></span><br><span class="line">            _emailClient = <span class="keyword">new</span> SmtpClient</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="comment">// 配置好服务器地址，端口和ssl，使用账密验证</span></span><br><span class="line">                Host = host,</span><br><span class="line">                Port = port,</span><br><span class="line">                EnableSsl = enableSsl,</span><br><span class="line">                Credentials = <span class="keyword">new</span> NetworkCredential &#123; UserName = username, Password = password &#125;</span><br><span class="line">            &#125;;</span><br><span class="line">            MailMessage message = <span class="built_in">new</span>()</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="comment">// 设置邮件发送人</span></span><br><span class="line">                From = <span class="keyword">new</span> <span class="built_in">MailAddress</span>(senderAddress, senderDisplayName) </span><br><span class="line">            &#125;;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 接收人</span></span><br><span class="line">            foreach (UserInfo user in tos)</span><br><span class="line">            &#123;</span><br><span class="line">                message.To.<span class="built_in">Add</span>(<span class="keyword">new</span> <span class="built_in">MailAddress</span>(user.Email, user.DisplayName));</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 抄送人</span></span><br><span class="line">            <span class="keyword">if</span> (ccs != null)</span><br><span class="line">            &#123;</span><br><span class="line">                foreach (UserInfo user in ccs)</span><br><span class="line">                &#123;</span><br><span class="line">                    message.CC.<span class="built_in">Add</span>(<span class="keyword">new</span> <span class="built_in">MailAddress</span>(user.Email, user.DisplayName));</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 密送人</span></span><br><span class="line">            <span class="keyword">if</span> (bccs != null)</span><br><span class="line">            &#123;</span><br><span class="line">                foreach (UserInfo user in bccs)</span><br><span class="line">                &#123;</span><br><span class="line">                    message.Bcc.<span class="built_in">Add</span>(<span class="keyword">new</span> <span class="built_in">MailAddress</span>(user.Email, user.DisplayName));</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 附件</span></span><br><span class="line">            <span class="keyword">if</span> (attachments != null)</span><br><span class="line">            &#123;</span><br><span class="line">                foreach (Attachment attachment in attachments)</span><br><span class="line">                &#123;</span><br><span class="line">                    message.Attachments.<span class="built_in">Add</span>(attachment);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 主题/内容/是否是html/默认优先级</span></span><br><span class="line">            message.Subject = subject;</span><br><span class="line">            message.Body = body;</span><br><span class="line">            message.IsBodyHtml = <span class="literal">true</span>;</span><br><span class="line">            message.Priority = MailPriority.Normal;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">            &#123;</span><br><span class="line">                _emailClient.<span class="built_in">Send</span>(message);</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;邮件发送成功&quot;</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="built_in">catch</span> (Exception ex)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">return</span> ex.Message;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/csharp-send-mail/</id>
    <link href="https://likepoems.com/archives/csharp-send-mail/"/>
    <published>2024-02-01T09:17:53.000Z</published>
    <summary>简单的通过C#的SmtpClient实现发送邮件的功能，支持收件人、抄送、密送与附件。</summary>
    <title>C# 发送邮件</title>
    <updated>2024-02-01T09:17:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="javascript" scheme="https://likepoems.com/tags/javascript/"/>
    <content>
      <![CDATA[<h3 id="1、代码实现"><a href="#1、代码实现" class="headerlink" title="1、代码实现"></a>1、代码实现</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">onload</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  (<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">// 自定义右键菜单内容并插入到body最后一个节点前</span></span><br><span class="line">    <span class="keyword">let</span> dom = <span class="string">`</span></span><br><span class="line"><span class="string">      &lt;div id=&quot;rightMenuBars&quot;&gt;</span></span><br><span class="line"><span class="string">          &lt;div class=&quot;rightMenu-group rightMenu-small&quot;&gt;</span></span><br><span class="line"><span class="string">              &lt;div class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-chevron-left&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">              &lt;/div&gt;</span></span><br><span class="line"><span class="string">              &lt;div class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-chevron-right&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">              &lt;/div&gt;</span></span><br><span class="line"><span class="string">              &lt;div class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-refresh&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">              &lt;/div&gt;</span></span><br><span class="line"><span class="string">              &lt;div class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-chevron-up&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">              &lt;/div&gt;</span></span><br><span class="line"><span class="string">          &lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;div id=&quot;rightMenuLinks&quot;&gt;</span></span><br><span class="line"><span class="string">          &lt;div class=&quot;rightMenu-group rightMenu-line&quot;&gt;</span></span><br><span class="line"><span class="string">              &lt;a class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-photo&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">                  &lt;span&gt;蓝猫图床&lt;/span&gt;</span></span><br><span class="line"><span class="string">              &lt;/a&gt;</span></span><br><span class="line"><span class="string">              &lt;a class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-cloud&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">                  &lt;span&gt;个人云盘&lt;/span&gt;</span></span><br><span class="line"><span class="string">              &lt;/a&gt;</span></span><br><span class="line"><span class="string">              &lt;a class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-book&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">                  &lt;span&gt;书籍阅读&lt;/span&gt;</span></span><br><span class="line"><span class="string">              &lt;/a&gt;</span></span><br><span class="line"><span class="string">              &lt;a class=&quot;rightMenu-item&quot;&gt;</span></span><br><span class="line"><span class="string">                  &lt;i class=&quot;fa fa-external-link&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">                  &lt;span&gt;接口文档&lt;/span&gt;</span></span><br><span class="line"><span class="string">              &lt;/a&gt;</span></span><br><span class="line"><span class="string">          &lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;/div&gt;</span></span><br><span class="line"><span class="string">      `</span>;</span><br><span class="line">    <span class="keyword">let</span> rightMenuDiv = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;div&quot;</span>);</span><br><span class="line">    rightMenuDiv.<span class="property">id</span> = <span class="string">&quot;rightMenu&quot;</span>;</span><br><span class="line">    <span class="keyword">let</span> body = <span class="variable language_">document</span>.<span class="property">body</span>;</span><br><span class="line">    rightMenuDiv.<span class="property">innerHTML</span> = dom;</span><br><span class="line">    body.<span class="title function_">insertBefore</span>(rightMenuDiv, body.<span class="property">lastChild</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 引入外部css文件</span></span><br><span class="line">    <span class="keyword">let</span> link = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;link&quot;</span>);</span><br><span class="line">    link.<span class="property">rel</span> = <span class="string">&quot;stylesheet&quot;</span>;</span><br><span class="line">    link.<span class="property">type</span> = <span class="string">&quot;text/css&quot;</span>;</span><br><span class="line">    link.<span class="property">href</span> =</span><br><span class="line">      <span class="string">&quot;https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css&quot;</span>;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">head</span>.<span class="title function_">appendChild</span>(link);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 创建style标签并设置菜单样式 */</span></span><br><span class="line">    <span class="keyword">let</span> rightMenuStyle = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;style&quot;</span>);</span><br><span class="line">    rightMenuStyle.<span class="property">innerHTML</span> =</span><br><span class="line">      <span class="string">&quot;#rightMenu&#123;display:none;font-size:20px;position:fixed;padding:0 0.25rem;width:9rem;height:fit-content;top:10%;left:10%;background-color: rgb(calc(0 + 255 * 0.92), calc(150 + (255 - 150) * 0.92), calc(136 + (255 - 136) * 0.92));;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);transform:translateZ(0);color:#32325d;border-radius:12px;z-index:999;border:1px solid #e3e8f7;user-select:none;box-shadow:0 0 12px 4px rgba(0,0,0,0.05);transition:border 0.3s;font-weight:500;&#125;#rightMenu:hover&#123;border:1px solid #009688;box-shadow:0 8px 12px -3px #4259ef23;&#125;#rightMenu .rightMenu-group&#123;padding:0.35rem 0.3rem;transition:0.3s;&#125;#rightMenu .rightMenu-line&#123;border-top:1px dashed #4259ef23;&#125;#rightMenu .rightMenu-group.rightMenu-small&#123;display:flex;justify-content:space-between;&#125;#rightMenu .rightMenu-group .rightMenu-item&#123;border-radius:8px;transition:0.3s;&#125;#rightMenu .rightMenu-line .rightMenu-item&#123;margin:0.25rem 0;padding:0.25rem 0;&#125;#rightMenu .rightMenu-group a&#123;background-color:transparent;color:#32325d;text-decoration:none;transition:all 0.2s ease 0s;overflow-wrap:break-word;-webkit-user-drag:none;&#125;#rightMenu .rightMenu-group.rightMenu-line .rightMenu-item&#123;display:flex;&#125;#rightMenu .rightMenu-group .rightMenu-item:hover&#123;cursor: pointer !important;background-color:#009688;color:#fff;box-shadow:0 8px 12px -3px #4259ef23;&#125;#rightMenu .rightMenu-group .rightMenu-item i&#123;display:inline-block;text-align:center;line-height:1.5rem;width:1.5rem;padding:0 0.25rem;font-size:18px;color:#32325d;&#125;#rightMenu .rightMenu-line .rightMenu-item i&#123;margin:0 0.25rem;&#125;#rightMenu .rightMenu-group .rightMenu-item span&#123;line-height:1.5rem;&#125;.rightMenu-small .rightMenu-item&#123;width:30px;height:30px;line-height:30px;display:flex;align-items:center;justify-content:center;&#125;&quot;</span>;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementsByTagName</span>(<span class="string">&quot;head&quot;</span>).<span class="title function_">item</span>(<span class="number">0</span>).<span class="title function_">appendChild</span>(rightMenuStyle);</span><br><span class="line">  &#125;)();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 如果菜单已经存在</span></span><br><span class="line">  <span class="keyword">let</span> rightMenu = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightMenu&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (rightMenu) &#123;</span><br><span class="line">    <span class="comment">// 定义菜单显示与隐藏的方法</span></span><br><span class="line">    <span class="keyword">let</span> rm = &#123;&#125;;</span><br><span class="line">    rm.<span class="property">showRightMenu</span> = <span class="keyword">function</span> (<span class="params">e, t = <span class="number">0</span>, l = <span class="number">0</span></span>) &#123;</span><br><span class="line">      <span class="keyword">let</span> o = rightMenu;</span><br><span class="line">      o.<span class="property">style</span>.<span class="property">cssText</span> = <span class="string">`top: <span class="subst">$&#123;t&#125;</span>px; left: <span class="subst">$&#123;l&#125;</span>px`</span>;</span><br><span class="line">      e ? (o.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;block&quot;</span>) : (o.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;none&quot;</span>);</span><br><span class="line">    &#125;;</span><br><span class="line">    rm.<span class="property">hideRightMenu</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">      rm.<span class="title function_">showRightMenu</span>(!<span class="number">1</span>);</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">let</span> rmWidth = <span class="built_in">parseInt</span>(rightMenu.<span class="property">style</span>.<span class="property">width</span>);</span><br><span class="line">    <span class="keyword">let</span> rmHeight = <span class="built_in">parseInt</span>(rightMenu.<span class="property">style</span>.<span class="property">height</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 定义键盘事件（主要用于屏蔽鼠标右键以及禁止打开开发者工具）</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">onkeydown</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">let</span> e = <span class="variable language_">window</span>.<span class="property">event</span> || <span class="variable language_">arguments</span>[<span class="number">0</span>];</span><br><span class="line">      <span class="comment">//屏蔽F12</span></span><br><span class="line">      <span class="keyword">if</span> (e.<span class="property">keyCode</span> == <span class="number">123</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="comment">//屏蔽Ctrl+Shift+I</span></span><br><span class="line">      &#125; <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="property">ctrlKey</span> &amp;&amp; e.<span class="property">shiftKey</span> &amp;&amp; e.<span class="property">keyCode</span> == <span class="number">73</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="comment">//屏蔽Shift+F10</span></span><br><span class="line">      &#125; <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="property">shiftKey</span> &amp;&amp; e.<span class="property">keyCode</span> == <span class="number">121</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 鼠标右键按下的事件</span></span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">oncontextmenu</span> = <span class="keyword">function</span> (<span class="params">e</span>) &#123;</span><br><span class="line">      <span class="comment">// 阻止默认行为</span></span><br><span class="line">      e.<span class="title function_">preventDefault</span>();</span><br><span class="line">      e = e || <span class="variable language_">window</span>.<span class="property">event</span>;</span><br><span class="line">      <span class="comment">// 当可视宽度 &gt; 768时显示菜单</span></span><br><span class="line">      <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">clientWidth</span> &gt; <span class="number">768</span>) &#123;</span><br><span class="line">        <span class="keyword">let</span> t = e.<span class="property">clientY</span>;</span><br><span class="line">        <span class="keyword">let</span> l = e.<span class="property">clientX</span> + <span class="number">10</span>;</span><br><span class="line">        <span class="keyword">return</span> (</span><br><span class="line">          (rmWidth = rmWidth || <span class="number">155</span>),</span><br><span class="line">          (rmHeight = rmHeight || <span class="number">255</span>),</span><br><span class="line">          l + rmWidth &gt; <span class="variable language_">window</span>.<span class="property">innerWidth</span> &amp;&amp; (l -= rmWidth + <span class="number">10</span>),</span><br><span class="line">          t + rmHeight &gt; <span class="variable language_">window</span>.<span class="property">innerHeight</span> &amp;&amp;</span><br><span class="line">            (t -= t + rmHeight - <span class="variable language_">window</span>.<span class="property">innerHeight</span>),</span><br><span class="line">          rm.<span class="title function_">showRightMenu</span>(!<span class="number">0</span>, t, l),</span><br><span class="line">          !<span class="number">1</span></span><br><span class="line">        );</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 鼠标按下事件（点击除去菜单的其它区域）</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;click&quot;</span>, <span class="function">(<span class="params">e</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="comment">// 如果当前元素或祖先元素中存在rightMenu，则隐藏</span></span><br><span class="line">      <span class="keyword">if</span> (!e.<span class="property">target</span>.<span class="title function_">closest</span>(<span class="string">&quot;#rightMenu&quot;</span>)) &#123;</span><br><span class="line">        rightMenu.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;none&quot;</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 点击菜单操作栏图标的事件</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightMenuBars&quot;</span>).<span class="title function_">addEventListener</span>(<span class="string">&quot;click&quot;</span>, <span class="function">(<span class="params">e</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> inner = e.<span class="property">target</span>?.<span class="property">className</span>;</span><br><span class="line">      <span class="keyword">switch</span> (inner) &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;fa fa-chevron-left&quot;</span>:</span><br><span class="line">          <span class="comment">// 向后</span></span><br><span class="line">          history.<span class="title function_">back</span>();</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;fa fa-chevron-right&quot;</span>:</span><br><span class="line">          <span class="comment">// 向前</span></span><br><span class="line">          history.<span class="title function_">forward</span>();</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;fa fa-refresh&quot;</span>:</span><br><span class="line">          <span class="comment">// 刷新</span></span><br><span class="line">          <span class="variable language_">window</span>.<span class="property">location</span>.<span class="title function_">reload</span>();</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;fa fa-chevron-up&quot;</span>:</span><br><span class="line">          <span class="comment">// 回到顶部</span></span><br><span class="line">          <span class="comment">// 获取点击时的scrollTop值</span></span><br><span class="line">          <span class="keyword">let</span> scrollTop = <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">scrollTop</span> - <span class="number">0</span>;</span><br><span class="line">          <span class="keyword">let</span> t = <span class="built_in">setInterval</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="comment">// 缓动动画，每次走剩余距离的一半</span></span><br><span class="line">            scrollTop = scrollTop / <span class="number">2</span>;</span><br><span class="line">            <span class="comment">// 定义临界值</span></span><br><span class="line">            <span class="keyword">if</span> (scrollTop &lt;= <span class="number">5</span>) &#123;</span><br><span class="line">              <span class="built_in">clearInterval</span>(t);</span><br><span class="line">              scrollTop = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">scrollTop</span> = scrollTop + <span class="number">0</span>;</span><br><span class="line">          &#125;, <span class="number">16.666</span>);</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      rm.<span class="title function_">hideRightMenu</span>();</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 点击菜单显示栏文字事件</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;rightMenuLinks&quot;</span>).<span class="title function_">addEventListener</span>(<span class="string">&quot;click&quot;</span>, <span class="function">(<span class="params">e</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> tag = e.<span class="property">target</span>?.<span class="property">tagName</span>?.<span class="title function_">toLowerCase</span>();</span><br><span class="line">      <span class="keyword">const</span> inner = e.<span class="property">target</span>?.<span class="property">innerText</span>;</span><br><span class="line">      <span class="keyword">if</span> (tag === <span class="string">&quot;a&quot;</span> || tag === <span class="string">&quot;span&quot;</span> || tag === <span class="string">&quot;i&quot;</span>) &#123;</span><br><span class="line">        rm.<span class="title function_">hideRightMenu</span>();</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">switch</span> (inner) &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;蓝猫图床&quot;</span>:</span><br><span class="line">          <span class="variable language_">window</span>.<span class="title function_">open</span>(<span class="string">&quot;https://bluecat.likepoems.com&quot;</span>);</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;个人云盘&quot;</span>:</span><br><span class="line">          <span class="variable language_">window</span>.<span class="title function_">open</span>(<span class="string">&quot;https://pan.likepoems.com&quot;</span>);</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;接口文档&quot;</span>:</span><br><span class="line">          <span class="variable language_">window</span>.<span class="title function_">open</span>(<span class="string">&quot;https://api.likepoems.com/&quot;</span>);</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;书籍阅读&quot;</span>:</span><br><span class="line">          <span class="variable language_">window</span>.<span class="title function_">open</span>(<span class="string">&quot;https://reader.likepoems.com/&quot;</span>);</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2、效果演示"><a href="#2、效果演示" class="headerlink" title="2、效果演示"></a>2、效果演示</h3><p><img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2023/11/rightmenu20231122.gif"                        alt="博客右键菜单js实现" title="博客右键菜单js实现"                 ></p>]]>
    </content>
    <id>https://likepoems.com/archives/rightmenu-by-javascript/</id>
    <link href="https://likepoems.com/archives/rightmenu-by-javascript/"/>
    <published>2023-11-22T08:08:00.000Z</published>
    <summary>
      <![CDATA[1、代码实现 window.onload = function () {  (function () {    // 自定义右键菜单内容并插入到body最后一个节点前    let dom = `      <div id="rightMenuBars">          <div cl]]>
    </summary>
    <title>JavaScript实现右键菜单</title>
    <updated>2023-11-22T08:08:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="框架" scheme="https://likepoems.com/categories/front-end/web-framework/"/>
    <category term="react" scheme="https://likepoems.com/tags/react/"/>
    <content>
      <![CDATA[<h3 id="1、React将数据转化成树形结构"><a href="#1、React将数据转化成树形结构" class="headerlink" title="1、React将数据转化成树形结构"></a>1、React将数据转化成树形结构</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">// 初始数据</span></span><br><span class="line"><span class="keyword">let</span> result = [</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="literal">null</span>, <span class="attr">id</span>: <span class="number">1</span>, <span class="attr">name</span>: <span class="string">&quot;书籍&quot;</span>, <span class="attr">count</span>: <span class="number">100</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="number">1</span>, <span class="attr">id</span>: <span class="number">2</span>, <span class="attr">name</span>: <span class="string">&quot;西游记&quot;</span>, <span class="attr">count</span>: <span class="number">50</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="number">1</span>, <span class="attr">id</span>: <span class="number">3</span>, <span class="attr">name</span>: <span class="string">&quot;红楼梦&quot;</span>, <span class="attr">count</span>: <span class="number">10</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="number">1</span>, <span class="attr">id</span>: <span class="number">4</span>, <span class="attr">name</span>: <span class="string">&quot;水浒传&quot;</span>, <span class="attr">count</span>: <span class="number">20</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="number">1</span>, <span class="attr">id</span>: <span class="number">5</span>, <span class="attr">name</span>: <span class="string">&quot;三国演义&quot;</span>, <span class="attr">count</span>: <span class="number">20</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="literal">null</span>, <span class="attr">id</span>: <span class="number">6</span>, <span class="attr">name</span>: <span class="string">&quot;文具&quot;</span>, <span class="attr">count</span>: <span class="number">10</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="number">6</span>, <span class="attr">id</span>: <span class="number">7</span>, <span class="attr">name</span>: <span class="string">&quot;铅笔&quot;</span>, <span class="attr">count</span>: <span class="number">5</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">parentId</span>: <span class="number">6</span>, <span class="attr">id</span>: <span class="number">8</span>, <span class="attr">name</span>: <span class="string">&quot;橡皮&quot;</span>, <span class="attr">count</span>: <span class="number">5</span> &#125;,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getTreeData</span> = (<span class="params">treeData, parentId</span>) =&gt; &#123;</span><br><span class="line">  <span class="comment">// 把数据转化为树型结构</span></span><br><span class="line">  <span class="keyword">let</span> tree = [];</span><br><span class="line">  <span class="keyword">let</span> currentParentId = parentId || <span class="literal">null</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; treeData.<span class="property">length</span>; i += <span class="number">1</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (treeData[i]) &#123;</span><br><span class="line">      <span class="keyword">if</span> (treeData[i].<span class="property">parentId</span> === currentParentId) &#123;</span><br><span class="line">        tree.<span class="title function_">push</span>(treeData[i]);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; tree.<span class="property">length</span>; j += <span class="number">1</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (tree[j]) &#123;</span><br><span class="line">      <span class="keyword">let</span> children = <span class="title function_">getTreeData</span>(treeData, tree[j].<span class="property">id</span>);</span><br><span class="line">      <span class="keyword">if</span> (children &amp;&amp; children.<span class="property">length</span>) &#123;</span><br><span class="line">        tree[j].<span class="property">children</span> = children;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> tree;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 树形数据</span></span><br><span class="line"><span class="keyword">let</span> data = <span class="title function_">getTreeData</span>(result);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(data);</span><br><span class="line"><span class="comment">/*[</span></span><br><span class="line"><span class="comment">    &#123;</span></span><br><span class="line"><span class="comment">        parentId: null,</span></span><br><span class="line"><span class="comment">        id:1,</span></span><br><span class="line"><span class="comment">        name:&#x27;书籍&#x27;,</span></span><br><span class="line"><span class="comment">        count:100,</span></span><br><span class="line"><span class="comment">        children:[</span></span><br><span class="line"><span class="comment">            &#123;parentId:1,id:2,name:&#x27;西游记&#x27;,count: 50&#125;,</span></span><br><span class="line"><span class="comment">            &#123;parentId:1,id:3,name:&#x27;红楼梦&#x27;,count: 10&#125;,</span></span><br><span class="line"><span class="comment">            &#123;parentId:1,id:4,name:&#x27;水浒传&#x27;,count: 20&#125;,</span></span><br><span class="line"><span class="comment">            &#123;parentId:1,id:5,name:&#x27;三国演义&#x27;,count: 20&#125;,</span></span><br><span class="line"><span class="comment">        ]</span></span><br><span class="line"><span class="comment">    &#125;,</span></span><br><span class="line"><span class="comment">    &#123;</span></span><br><span class="line"><span class="comment">        parentId: null,</span></span><br><span class="line"><span class="comment">        id:6,</span></span><br><span class="line"><span class="comment">        name:&#x27;文具&#x27;,</span></span><br><span class="line"><span class="comment">        count:10,</span></span><br><span class="line"><span class="comment">        children:[</span></span><br><span class="line"><span class="comment">            &#123;parentId:6,id:7,name:&#x27;铅笔&#x27;,count:5&#125;,</span></span><br><span class="line"><span class="comment">            &#123;parentId:6,id:8,name:&#x27;橡皮&#x27;,count:5&#125;,</span></span><br><span class="line"><span class="comment">        ]</span></span><br><span class="line"><span class="comment">    &#125;</span></span><br><span class="line"><span class="comment">]*/</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2、实例-react-antd-table树形数据"><a href="#2、实例-react-antd-table树形数据" class="headerlink" title="2、实例(react antd table树形数据)"></a>2、实例(react antd table树形数据)</h3><p>线上地址：<a class="link"   href="https://stackblitz.com/edit/react-table-tree-datas?description=A%20create-react-app%20project%20based%20on%20react%20and%20react-dom&file=src/TableList.js&title=React%20Starter" >react antd table 树形结构数据<i class="fas fa-external-link-alt"></i></a></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, &#123; useState, useEffect &#125; <span class="keyword">from</span> <span class="string">&#x27;react&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">Table</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;antd&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">Test</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> [expandedRowKeys, setExpandedRowKeys] = <span class="title function_">useState</span>([]);</span><br><span class="line">  <span class="keyword">const</span> [dataSource, setDataSource] = <span class="title function_">useState</span>([]);</span><br><span class="line">  <span class="keyword">const</span> columns = [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&#x27;名称&#x27;</span>,</span><br><span class="line">      <span class="attr">key</span>: <span class="string">&#x27;name&#x27;</span>,</span><br><span class="line">      <span class="attr">dataIndex</span>: <span class="string">&#x27;name&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&#x27;描述&#x27;</span>,</span><br><span class="line">      <span class="attr">key</span>: <span class="string">&#x27;desc&#x27;</span>,</span><br><span class="line">      <span class="attr">dataIndex</span>: <span class="string">&#x27;desc&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">  ];</span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">onExpandTable</span> = (<span class="params">expanded, record</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">let</span> arr = expandedRowKeys;</span><br><span class="line">    <span class="keyword">if</span> (expanded) &#123;</span><br><span class="line">      arr.<span class="title function_">push</span>(record.<span class="property">id</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      arr.<span class="title function_">splice</span>(</span><br><span class="line">        arr.<span class="title function_">findIndex</span>(<span class="function">(<span class="params">i</span>) =&gt;</span> i === record.<span class="property">id</span>),</span><br><span class="line">        <span class="number">1</span></span><br><span class="line">      );</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title function_">setExpandedRowKeys</span>(arr);</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">getTreeData</span> = (<span class="params">treeData, parentId</span>) =&gt; &#123;</span><br><span class="line">    <span class="comment">// 把数据转化为树型结构</span></span><br><span class="line">    <span class="keyword">let</span> tree = [];</span><br><span class="line">    <span class="keyword">let</span> currentParentId = parentId || <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; treeData.<span class="property">length</span>; i += <span class="number">1</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (treeData[i]) &#123;</span><br><span class="line">        <span class="keyword">if</span> (treeData[i].<span class="property">parentId</span> === currentParentId) &#123;</span><br><span class="line">          tree.<span class="title function_">push</span>(treeData[i]);</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> j = <span class="number">0</span>; j &lt; tree.<span class="property">length</span>; j += <span class="number">1</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (tree[j]) &#123;</span><br><span class="line">        <span class="keyword">let</span> children = <span class="title function_">getTreeData</span>(treeData, tree[j].<span class="property">id</span>);</span><br><span class="line">        <span class="keyword">if</span> (children &amp;&amp; children.<span class="property">length</span>) &#123;</span><br><span class="line">          tree[j].<span class="property">children</span> = children;</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> tree;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="title function_">useEffect</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> res = [</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">parentId</span>: <span class="literal">null</span>,</span><br><span class="line">        <span class="attr">id</span>: <span class="string">&#x27;0e02f058-65fc-4e47-82d5-3aaf95f816cd&#x27;</span>,</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;中国&#x27;</span>,</span><br><span class="line">        <span class="attr">desc</span>: <span class="string">&#x27;中国陆地面积约9600000平方千米&#x27;</span>,</span><br><span class="line">      &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">parentId</span>: <span class="string">&#x27;0e02f058-65fc-4e47-82d5-3aaf95f816cd&#x27;</span>,</span><br><span class="line">        <span class="attr">id</span>: <span class="string">&#x27;03014a12-3948-4f8a-b182-ed8b6d58a7ea&#x27;</span>,</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;四川&#x27;</span>,</span><br><span class="line">        <span class="attr">desc</span>: <span class="string">&#x27;四川地域面积约486000平方公里&#x27;</span>,</span><br><span class="line">      &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">parentId</span>: <span class="string">&#x27;0e02f058-65fc-4e47-82d5-3aaf95f816cd&#x27;</span>,</span><br><span class="line">        <span class="attr">id</span>: <span class="string">&#x27;201f9c09-f2e8-4bea-917e-b5fdc56d9e24&#x27;</span>,</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;山东&#x27;</span>,</span><br><span class="line">        <span class="attr">desc</span>: <span class="string">&#x27;陆域面积约155800平方公里&#x27;</span>,</span><br><span class="line">      &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">parentId</span>: <span class="string">&#x27;03014a12-3948-4f8a-b182-ed8b6d58a7ea&#x27;</span>,</span><br><span class="line">        <span class="attr">id</span>: <span class="string">&#x27;305d7648-9e3e-4b25-a246-3be08344434e&#x27;</span>,</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;成都&#x27;</span>,</span><br><span class="line">        <span class="attr">desc</span>: <span class="string">&#x27;成都地域面积约14335平方公里&#x27;</span>,</span><br><span class="line">      &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">parentId</span>: <span class="string">&#x27;201f9c09-f2e8-4bea-917e-b5fdc56d9e24&#x27;</span>,</span><br><span class="line">        <span class="attr">id</span>: <span class="string">&#x27;3898961f-7487-46d6-8595-f2dfac59b116&#x27;</span>,</span><br><span class="line">        <span class="attr">name</span>: <span class="string">&#x27;济南&#x27;</span>,</span><br><span class="line">        <span class="attr">desc</span>: <span class="string">&#x27;济南地域面积约10244.45平方公里&#x27;</span>,</span><br><span class="line">      &#125;,</span><br><span class="line">    ];</span><br><span class="line">    <span class="keyword">let</span> data = <span class="title function_">getTreeData</span>(res);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;data: &#x27;</span>, data);</span><br><span class="line">    <span class="title function_">setDataSource</span>(data);</span><br><span class="line">  &#125;, []);</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">Table</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">columns</span>=<span class="string">&#123;columns&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">dataSource</span>=<span class="string">&#123;dataSource&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">rowKey</span>=<span class="string">&#123;(record)</span> =&gt;</span> record.id&#125;</span></span><br><span class="line"><span class="language-xml">        expandedRowKeys=&#123;expandedRowKeys&#125;</span></span><br><span class="line"><span class="language-xml">        onExpand=&#123;onExpandTable&#125;</span></span><br><span class="line"><span class="language-xml">        pagination=&#123;false&#125;</span></span><br><span class="line"><span class="language-xml">      /&gt;</span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">Test</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/react-tree-structure-data/</id>
    <link href="https://likepoems.com/archives/react-tree-structure-data/"/>
    <published>2023-07-03T08:54:00.000Z</published>
    <summary>1、React将数据转化成树形结构 // 初始数据let result = [  { parentId null, id 1, name &quot;书籍&quot;, count 100 },  { parentId 1, id 2, name &quot;西游记&quot;, count 50 },  { p</summary>
    <title>React将数据转化成树形结构</title>
    <updated>2023-07-03T08:54:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="笔记" scheme="https://likepoems.com/categories/note/"/>
    <category term="blog" scheme="https://likepoems.com/tags/blog/"/>
    <content>
      <![CDATA[<h3 id="1、403-Forbidden"><a href="#1、403-Forbidden" class="headerlink" title="1、403 Forbidden"></a>1、403 Forbidden</h3><p>403通常表示没有权限访问某个资源，当资源来源开启了防盗链后，只有白名单下的来源才能访问。</p><h3 id="2、解决方案"><a href="#2、解决方案" class="headerlink" title="2、解决方案"></a>2、解决方案</h3><p>使用图片缓存服务：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">i0/1/2/3.wp.com</span><br><span class="line">cdn.cdnjson.com</span><br><span class="line">https://image.baidu.com/search/down?url=</span><br><span class="line"></span><br><span class="line">使用方式：</span><br><span class="line">比如请求新浪图片https://tvax3.sinaimg.cn/large/a15b4afegy1fmvj9449p8j21hc0u0wqg.jpg</span><br><span class="line">可以直接使用：</span><br><span class="line">https://i3.wp.com/tvax3.sinaimg.cn/large/a15b4afegy1fmvj9449p8j21hc0u0wqg.jpg</span><br><span class="line">https://cdn.cdnjson.com/tvax3.sinaimg.cn/large/a15b4afegy1fmvj9449p8j21hc0u0wqg.jpg</span><br><span class="line">https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/a15b4afegy1fmvj9449p8j21hc0u0wqg.jpg</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/sina-image-403-solution/</id>
    <link href="https://likepoems.com/archives/sina-image-403-solution/"/>
    <published>2023-06-10T07:22:00.000Z</published>
    <summary>1、403 Forbidden 403通常表示没有权限访问某个资源，当资源来源开启了防盗链后，只有白名单下的来源才能访问。 2、解决方案 使用图片缓存服务： i0/1/2/3.wp.comcdn.cdnjson.comhttps//image.baidu.com/search/down?url</summary>
    <title>新浪图片403解决办法</title>
    <updated>2023-06-10T07:22:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="javascript" scheme="https://likepoems.com/tags/javascript/"/>
    <content>
      <![CDATA[<h3 id="比较前后两个数组对象的差异"><a href="#比较前后两个数组对象的差异" class="headerlink" title="比较前后两个数组对象的差异"></a>比较前后两个数组对象的差异</h3><blockquote><p>js比较前后两个数组对象的差异，比如是添加了什么数据或者删除了什么数据。</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 两个数组对象中有相同的键如 id</span></span><br><span class="line"><span class="comment">// 其中, oldData为初始数据, newData为当前数据</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getChangeData</span> = (<span class="params">oldData, newData</span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">let</span> delData = oldData.<span class="title function_">filter</span>(</span><br><span class="line">    <span class="function">(<span class="params">item2</span>) =&gt;</span> !newData.<span class="title function_">some</span>(<span class="function">(<span class="params">item1</span>) =&gt;</span> item2?.<span class="property">id</span> === item1?.<span class="property">id</span>)</span><br><span class="line">  );</span><br><span class="line">  <span class="keyword">let</span> addData = newData.<span class="title function_">filter</span>(</span><br><span class="line">    <span class="function">(<span class="params">item2</span>) =&gt;</span> !oldData.<span class="title function_">some</span>(<span class="function">(<span class="params">item1</span>) =&gt;</span> item2?.<span class="property">id</span> === item1?.<span class="property">id</span>)</span><br><span class="line">  );</span><br><span class="line">  <span class="keyword">let</span> changeData = &#123;</span><br><span class="line">    delData,</span><br><span class="line">    addData,</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">return</span> changeData;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> data01 = [</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">1</span>,</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;直尺&quot;</span>,</span><br><span class="line">    <span class="attr">price</span>: <span class="number">2</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">2</span>,</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;直尺&quot;</span>,</span><br><span class="line">    <span class="attr">price</span>: <span class="number">3</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">3</span>,</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;直尺&quot;</span>,</span><br><span class="line">    <span class="attr">price</span>: <span class="number">4</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">4</span>,</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;直尺&quot;</span>,</span><br><span class="line">    <span class="attr">price</span>: <span class="number">5</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">];</span><br><span class="line"><span class="keyword">let</span> data02 = [</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">2</span>,</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;直尺&quot;</span>,</span><br><span class="line">    <span class="attr">price</span>: <span class="number">3</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">5</span>,</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;文具盒&quot;</span>,</span><br><span class="line">    <span class="attr">price</span>: <span class="number">10</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">6</span>,</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;铅笔&quot;</span>,</span><br><span class="line">    <span class="attr">price</span>: <span class="number">2</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> a = <span class="title function_">getChangeData</span>(data01, data02);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a);</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>输出： { delData: [ { id: 1, type: &#39;直尺&#39;, price: 2 }, { id: 3, type: &#39;直尺&#39;, price: 4 }, { id: 4, type: &#39;直尺&#39;, price: 5 } ], addData: [ { id: 5, type: &#39;文具盒&#39;, price: 10 }, { id: 6, type: &#39;铅笔&#39;, price: 2 } ] }</p>]]>
    </content>
    <id>https://likepoems.com/archives/the-differences-between-the-two-array-objects-before-and-after-the-js-comparison/</id>
    <link href="https://likepoems.com/archives/the-differences-between-the-two-array-objects-before-and-after-the-js-comparison/"/>
    <published>2023-03-07T05:42:00.000Z</published>
    <summary>
      <![CDATA[比较前后两个数组对象的差异 js比较前后两个数组对象的差异，比如是添加了什么数据或者删除了什么数据。 // 两个数组对象中有相同的键如 id// 其中, oldData为初始数据, newData为当前数据const getChangeData = (oldData, newData) => {]]>
    </summary>
    <title>js比较前后两个数组对象的差异</title>
    <updated>2023-03-07T05:42:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="框架" scheme="https://likepoems.com/categories/front-end/web-framework/"/>
    <category term="react" scheme="https://likepoems.com/tags/react/"/>
    <content>
      <![CDATA[<h3 id="功能需求"><a href="#功能需求" class="headerlink" title="功能需求"></a>功能需求</h3><blockquote><p>有这样一个需求，用户点击文字或者按钮，会弹出图片的预览界面，要求图片可旋转，可缩放以及可下载。由于antd组件的Image的预览窗口不包含图片下载的功能，所以这里通过modal对img添加预览模块。</p></blockquote><h3 id="实现过程"><a href="#实现过程" class="headerlink" title="实现过程"></a>实现过程</h3><p>代码如下：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span> <span class="keyword">from</span> <span class="string">&#x27;react&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&#x27;./style.css&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">Button</span>, <span class="title class_">Modal</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;antd&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123;</span><br><span class="line">  <span class="title class_">ZoomInOutlined</span>,</span><br><span class="line">  <span class="title class_">ZoomOutOutlined</span>,</span><br><span class="line">  <span class="title class_">UndoOutlined</span>,</span><br><span class="line">  <span class="title class_">RedoOutlined</span>,</span><br><span class="line">  <span class="title class_">DownloadOutlined</span>,</span><br><span class="line">&#125; <span class="keyword">from</span> <span class="string">&#x27;@ant-design/icons&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">class</span> <span class="title class_">App</span> <span class="keyword">extends</span> <span class="title class_ inherited__">React.Component</span> &#123;</span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params">props</span>) &#123;</span><br><span class="line">    <span class="variable language_">super</span>(props);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">state</span> = &#123;</span><br><span class="line">      <span class="attr">imgSrc</span>:</span><br><span class="line">        <span class="string">&#x27;https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png&#x27;</span>,</span><br><span class="line">      <span class="attr">imageVisible</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">imgScale</span>: <span class="string">&#x27;100%&#x27;</span>,</span><br><span class="line">      <span class="attr">imgTransform</span>: <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">      <span class="attr">imgCurrent</span>: <span class="number">0</span>,</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  closeImagePreviewModel = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setState</span>(&#123;</span><br><span class="line">      <span class="attr">imageVisible</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">imgScale</span>: <span class="string">&#x27;100%&#x27;</span>,</span><br><span class="line">      <span class="attr">imgTransform</span>: <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">      <span class="attr">imgCurrent</span>: <span class="number">0</span>,</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="comment">//放大</span></span><br><span class="line">  imgToBigger = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> a = <span class="built_in">parseInt</span>(<span class="variable language_">this</span>.<span class="property">state</span>.<span class="property">imgScale</span>) + <span class="number">5</span> + <span class="string">&#x27;%&#x27;</span>;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setState</span>(&#123; <span class="attr">imgScale</span>: a &#125;);</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="comment">//缩小</span></span><br><span class="line">  imgToSmaller = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> a = <span class="built_in">parseInt</span>(<span class="variable language_">this</span>.<span class="property">state</span>.<span class="property">imgScale</span>) + -<span class="number">5</span> + <span class="string">&#x27;%&#x27;</span>;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setState</span>(&#123; <span class="attr">imgScale</span>: a &#125;);</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="comment">//左旋转</span></span><br><span class="line">  imgToLeftRoll = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> a = (<span class="variable language_">this</span>.<span class="property">state</span>.<span class="property">imgCurrent</span> - <span class="number">90</span>) % <span class="number">360</span>;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setState</span>(&#123; <span class="attr">imgTransform</span>: <span class="string">&#x27;rotate(&#x27;</span> + a + <span class="string">&#x27;deg)&#x27;</span>, <span class="attr">imgCurrent</span>: a &#125;);</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="comment">//右旋转</span></span><br><span class="line">  imgToRightRoll = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> a = (<span class="variable language_">this</span>.<span class="property">state</span>.<span class="property">imgCurrent</span> + <span class="number">90</span>) % <span class="number">360</span>;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setState</span>(&#123; <span class="attr">imgTransform</span>: <span class="string">&#x27;rotate(&#x27;</span> + a + <span class="string">&#x27;deg)&#x27;</span>, <span class="attr">imgCurrent</span>: a &#125;);</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="comment">// 下载</span></span><br><span class="line">  downloadImage = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> imgUrl = <span class="variable language_">this</span>.<span class="property">state</span>.<span class="property">imgSrc</span>;</span><br><span class="line">    <span class="keyword">const</span> xhr = <span class="keyword">new</span> <span class="title class_">XMLHttpRequest</span>();</span><br><span class="line">    <span class="keyword">let</span> url = imgUrl;</span><br><span class="line">    xhr.<span class="property">responseType</span> = <span class="string">&#x27;blob&#x27;</span>;</span><br><span class="line">    xhr.<span class="property">onload</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">status</span> == <span class="string">&#x27;200&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">let</span> blob = <span class="variable language_">this</span>.<span class="property">response</span>;</span><br><span class="line">        <span class="keyword">let</span> a = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;a&#x27;</span>);</span><br><span class="line">        a.<span class="property">style</span> = <span class="string">&#x27;display:none&#x27;</span>;</span><br><span class="line">        <span class="keyword">const</span> reader = <span class="keyword">new</span> <span class="title class_">FileReader</span>();</span><br><span class="line">        reader.<span class="title function_">readAsDataURL</span>(blob);</span><br><span class="line">        reader.<span class="property">onload</span> = <span class="keyword">function</span> (<span class="params">e</span>) &#123;</span><br><span class="line">          a.<span class="property">download</span> = <span class="string">&#x27;test.jpg&#x27;</span>;</span><br><span class="line">          a.<span class="property">href</span> = e.<span class="property">target</span>.<span class="property">result</span>;</span><br><span class="line">          <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">append</span>(a);</span><br><span class="line">          a.<span class="title function_">click</span>();</span><br><span class="line">          a.<span class="title function_">remove</span>();</span><br><span class="line">        &#125;;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    xhr.<span class="title function_">open</span>(<span class="string">&#x27;get&#x27;</span>, url, <span class="literal">true</span>);</span><br><span class="line">    xhr.<span class="title function_">send</span>();</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  render = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; imgScale, imgSrc, imgTransform, imageVisible &#125; = <span class="variable language_">this</span>.<span class="property">state</span>;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="language-xml"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-xml">            this.setState(&#123; imageVisible: true &#125;);</span></span><br><span class="line"><span class="language-xml">          &#125;&#125;</span></span><br><span class="line"><span class="language-xml">        &gt;</span></span><br><span class="line"><span class="language-xml">          预览图片</span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Modal</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">title</span>=<span class="string">&quot;图片预览&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">visible</span>=<span class="string">&#123;imageVisible&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">onCancel</span>=<span class="string">&#123;this.closeImagePreviewModel&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">style</span>=<span class="string">&#123;&#123;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">top:</span> <span class="attr">0</span>,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">maxWidth:</span> &#x27;<span class="attr">100vw</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">paddingBottom:</span> <span class="attr">0</span>,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">bodyStyle</span>=<span class="string">&#123;&#123;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">textAlign:</span> &#x27;<span class="attr">center</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">height:</span> &#x27;<span class="attr">calc</span>(<span class="attr">100vh</span> <span class="attr">-</span> <span class="attr">118px</span>)&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">overflowY:</span> &#x27;<span class="attr">auto</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">width</span>=<span class="string">&quot;100vw&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          <span class="attr">footer</span>=<span class="string">&#123;[</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            &lt;<span class="attr">div</span> <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">margin:</span> &#x27;<span class="attr">0</span> <span class="attr">auto</span>&#x27;, <span class="attr">textAlign:</span> &#x27;<span class="attr">center</span>&#x27; &#125;&#125;&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">border:</span> &#x27;<span class="attr">none</span>&#x27;, <span class="attr">padding:</span> &#x27;<span class="attr">5px</span> <span class="attr">8px</span>&#x27; &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">title</span>=<span class="string">&quot;放大&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> this.imgToBigger()&#125;</span></span><br><span class="line"><span class="language-xml">              &gt;</span></span><br><span class="line"><span class="language-xml">                <span class="tag">&lt;<span class="name">ZoomInOutlined</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">border:</span> &#x27;<span class="attr">none</span>&#x27;, <span class="attr">padding:</span> &#x27;<span class="attr">5px</span> <span class="attr">8px</span>&#x27; &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">title</span>=<span class="string">&quot;缩小&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> this.imgToSmaller()&#125;</span></span><br><span class="line"><span class="language-xml">              &gt;</span></span><br><span class="line"><span class="language-xml">                <span class="tag">&lt;<span class="name">ZoomOutOutlined</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">border:</span> &#x27;<span class="attr">none</span>&#x27;, <span class="attr">padding:</span> &#x27;<span class="attr">5px</span> <span class="attr">8px</span>&#x27; &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">title</span>=<span class="string">&quot;逆时针旋转&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> this.imgToLeftRoll()&#125;</span></span><br><span class="line"><span class="language-xml">              &gt;</span></span><br><span class="line"><span class="language-xml">                <span class="tag">&lt;<span class="name">UndoOutlined</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">border:</span> &#x27;<span class="attr">none</span>&#x27;, <span class="attr">padding:</span> &#x27;<span class="attr">5px</span> <span class="attr">8px</span>&#x27; &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">title</span>=<span class="string">&quot;顺时针旋转&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> this.imgToRightRoll()&#125;</span></span><br><span class="line"><span class="language-xml">              &gt;</span></span><br><span class="line"><span class="language-xml">                <span class="tag">&lt;<span class="name">RedoOutlined</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">border:</span> &#x27;<span class="attr">none</span>&#x27;, <span class="attr">padding:</span> &#x27;<span class="attr">5px</span> <span class="attr">8px</span>&#x27; &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">title</span>=<span class="string">&quot;下载&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> this.downloadImage()&#125;</span></span><br><span class="line"><span class="language-xml">              &gt;</span></span><br><span class="line"><span class="language-xml">                <span class="tag">&lt;<span class="name">DownloadOutlined</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">              <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span>,</span></span><br><span class="line"><span class="language-xml">          ]&#125;</span></span><br><span class="line"><span class="language-xml">        &gt;</span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">img</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">src</span>=<span class="string">&#123;imgSrc&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">style</span>=<span class="string">&#123;&#123;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">width:</span> &#x27;<span class="attr">auto</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">height:</span> &#x27;<span class="attr">auto</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">maxWidth:</span> &#x27;<span class="attr">100vw</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">maxHeight:</span> &#x27;<span class="attr">calc</span>(<span class="attr">100vh</span> <span class="attr">-</span> <span class="attr">158px</span>)&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">position:</span> &#x27;<span class="attr">relative</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">margin:</span> &#x27;<span class="attr">0</span> <span class="attr">auto</span>&#x27;,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">scale:</span> <span class="attr">imgScale</span>,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">transform:</span> <span class="attr">imgTransform</span>,</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          /&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Modal</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line">    );</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="实现效果"><a href="#实现效果" class="headerlink" title="实现效果"></a>实现效果</h3><p><a class="link"   href="https://stackblitz.com/edit/react-photopreview?file=src/App.js" >React antd 自定义图片预览实现<i class="fas fa-external-link-alt"></i></a></p>]]>
    </content>
    <id>https://likepoems.com/archives/react-antd-photo-preview/</id>
    <link href="https://likepoems.com/archives/react-antd-photo-preview/"/>
    <published>2023-02-10T09:02:00.000Z</published>
    <summary>功能需求 有这样一个需求，用户点击文字或者按钮，会弹出图片的预览界面，要求图片可旋转，可缩放以及可下载。由于antd组件的Image的预览窗口不包含图片下载的功能，所以这里通过modal对img添加预览模块。 实现过程 代码如下： import React from 'react';import</summary>
    <title>react antd 实现图片自定义预览</title>
    <updated>2023-02-10T09:02:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="框架" scheme="https://likepoems.com/categories/front-end/web-framework/"/>
    <category term="react" scheme="https://likepoems.com/tags/react/"/>
    <content>
      <![CDATA[<h3 id="1、需求"><a href="#1、需求" class="headerlink" title="1、需求"></a>1、需求</h3><blockquote><p>最近遇到一个需求，一张表格中需要有个下拉框，antd官网中有相应的Select组件，但是由于数据比较多，用户需要一个全选的需求。即点击全选下拉框数据全部选中，再次点击取消全选即选中的数据清空。然后数据一条一条点击完后全选框会被选中，反之不会被选中。</p></blockquote><h3 id="2、实现代码"><a href="#2、实现代码" class="headerlink" title="2、实现代码"></a>2、实现代码</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span> <span class="keyword">from</span> <span class="string">&#x27;react&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&#x27;antd/dist/antd.css&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&#x27;./index.css&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">Form</span>, <span class="title class_">Select</span>, <span class="title class_">Checkbox</span>, <span class="title class_">Divider</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;antd&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Domo</span> <span class="keyword">extends</span> <span class="title class_ inherited__">React.Component</span> &#123;</span><br><span class="line">  formRef = <span class="title class_">React</span>.<span class="title function_">createRef</span>();</span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params">props</span>) &#123;</span><br><span class="line">    <span class="variable language_">super</span>(props);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">state</span> = &#123;</span><br><span class="line">      <span class="attr">selectStatus</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">selectData</span>: <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="title function_">render</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> data = [];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">12</span>; i++) &#123;</span><br><span class="line">      <span class="keyword">const</span> value = <span class="string">`<span class="subst">$&#123;i.toString(<span class="number">36</span>)&#125;</span><span class="subst">$&#123;i&#125;</span>`</span>;</span><br><span class="line">      data.<span class="title function_">push</span>(&#123;</span><br><span class="line">        <span class="attr">label</span>: value,</span><br><span class="line">        value</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">const</span> &#123; selectStatus &#125; = <span class="variable language_">this</span>.<span class="property">state</span>;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="language-xml"><span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Form</span> <span class="attr">ref</span>=<span class="string">&#123;this.formRef&#125;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Form.Item</span> <span class="attr">name</span>=<span class="string">&quot;selectOptions&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">            <span class="tag">&lt;<span class="name">Select</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">mode</span>=<span class="string">&quot;multiple&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">placeholder</span>=<span class="string">&quot;please choose&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">allowClear</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">options</span>=<span class="string">&#123;data&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">              <span class="attr">onChange</span>=<span class="string">&#123;(value)</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-xml">                this.setState(&#123; selectData: value.join(&#x27;,&#x27;) &#125;);</span></span><br><span class="line"><span class="language-xml">                if (value.length === data.length) &#123;</span></span><br><span class="line"><span class="language-xml">                  this.setState(&#123; selectStatus: true &#125;);</span></span><br><span class="line"><span class="language-xml">                &#125; else &#123;</span></span><br><span class="line"><span class="language-xml">                  this.setState(&#123; selectStatus: false &#125;);</span></span><br><span class="line"><span class="language-xml">                &#125;</span></span><br><span class="line"><span class="language-xml">              &#125;&#125;</span></span><br><span class="line"><span class="language-xml">              dropdownRender=&#123;(menu) =&gt; (</span></span><br><span class="line"><span class="language-xml">                <span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">                  <span class="tag">&lt;<span class="name">div</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                    <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">padding:</span> &#x27;<span class="attr">4px</span> <span class="attr">8px</span> <span class="attr">8px</span> <span class="attr">12px</span>&#x27;, <span class="attr">cursor:</span> &#x27;<span class="attr">pointer</span>&#x27; &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                  &gt;</span></span></span><br><span class="line"><span class="language-xml">                    <span class="tag">&lt;<span class="name">Checkbox</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                      <span class="attr">checked</span>=<span class="string">&#123;selectStatus&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">                      <span class="attr">onChange</span>=<span class="string">&#123;(e)</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-xml">                        const a = data.map((item) =&gt; item.value);</span></span><br><span class="line"><span class="language-xml">                        if (e.target.checked) &#123;</span></span><br><span class="line"><span class="language-xml">                          this.setState(&#123;</span></span><br><span class="line"><span class="language-xml">                            selectStatus: true,</span></span><br><span class="line"><span class="language-xml">                            selectData: a.join(&#x27;,&#x27;),</span></span><br><span class="line"><span class="language-xml">                          &#125;);</span></span><br><span class="line"><span class="language-xml">                          this.formRef.current.setFieldsValue(&#123;</span></span><br><span class="line"><span class="language-xml">                            selectOptions: data?.map((item) =&gt; item.value),</span></span><br><span class="line"><span class="language-xml">                          &#125;);</span></span><br><span class="line"><span class="language-xml">                        &#125; else &#123;</span></span><br><span class="line"><span class="language-xml">                          this.setState(&#123;</span></span><br><span class="line"><span class="language-xml">                            selectStatus: false,</span></span><br><span class="line"><span class="language-xml">                            selectData: &#x27;&#x27;,</span></span><br><span class="line"><span class="language-xml">                          &#125;);</span></span><br><span class="line"><span class="language-xml">                          this.formRef.current.setFieldsValue(&#123;</span></span><br><span class="line"><span class="language-xml">                            selectOptions: [],</span></span><br><span class="line"><span class="language-xml">                          &#125;);</span></span><br><span class="line"><span class="language-xml">                        &#125;</span></span><br><span class="line"><span class="language-xml">                      &#125;&#125;</span></span><br><span class="line"><span class="language-xml">                    &gt;</span></span><br><span class="line"><span class="language-xml">                      全选</span></span><br><span class="line"><span class="language-xml">                    <span class="tag">&lt;/<span class="name">Checkbox</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">                  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">                  <span class="tag">&lt;<span class="name">Divider</span> <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">margin:</span> &#x27;<span class="attr">0</span>&#x27; &#125;&#125; /&gt;</span></span></span><br><span class="line"><span class="language-xml">                  &#123;menu&#125;</span></span><br><span class="line"><span class="language-xml">                <span class="tag">&lt;/&gt;</span></span></span><br><span class="line"><span class="language-xml">              )&#125;</span></span><br><span class="line"><span class="language-xml">            &gt;<span class="tag">&lt;/<span class="name">Select</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;/<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Form</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">h3</span> <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">position:</span> &#x27;<span class="attr">fixed</span>&#x27;, <span class="attr">bottom:</span> &#x27;<span class="attr">100px</span>&#x27; &#125;&#125;&gt;</span></span></span><br><span class="line"><span class="language-xml">          选择的数据是：&#123;this.state.selectData&#125;</span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">h3</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/&gt;</span></span></span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">Domo</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="3、效果预览"><a href="#3、效果预览" class="headerlink" title="3、效果预览"></a>3、效果预览</h3><p><a class="link"   href="https://stackblitz.com/edit/react-d9jv4s?file=domo.js" >react antd select组件添加全选功能<i class="fas fa-external-link-alt"></i></a></p>]]>
    </content>
    <id>https://likepoems.com/archives/react-antd-select-full-selection-of-components/</id>
    <link href="https://likepoems.com/archives/react-antd-select-full-selection-of-components/"/>
    <published>2023-01-04T08:07:00.000Z</published>
    <summary>1、需求 最近遇到一个需求，一张表格中需要有个下拉框，antd官网中有相应的Select组件，但是由于数据比较多，用户需要一个全选的需求。即点击全选下拉框数据全部选中，再次点击取消全选即选中的数据清空。然后数据一条一条点击完后全选框会被选中，反之不会被选中。 2、实现代码 import React</summary>
    <title>react antd select组件添加全选功能</title>
    <updated>2023-01-04T08:07:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="框架" scheme="https://likepoems.com/categories/front-end/web-framework/"/>
    <category term="react" scheme="https://likepoems.com/tags/react/"/>
    <content>
      <![CDATA[<h1 id="React-函数组件"><a href="#React-函数组件" class="headerlink" title="React 函数组件"></a>React 函数组件</h1><h2 id="1、定义方式"><a href="#1、定义方式" class="headerlink" title="1、定义方式"></a>1、定义方式</h2><blockquote><p>React 函数组件是指使用函数方法定义的组件。 定义方式：与函数的定义方式相同，需要将内容 return 出来，需要注意的是最外层只有一个标签或者使用<code>&lt;&gt;&lt;/&gt;</code>(Fragment 标签)包裹起来，方法写在 return 前面。</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">App</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">getData</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>];</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">h1</span>&gt;</span>一级标题<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">h2</span>&gt;</span>二级标题<span class="tag">&lt;/<span class="name">h2</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">h2</span>&gt;</span>&#123;getData()&#125;<span class="tag">&lt;/<span class="name">h2</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">App</span>;</span><br></pre></td></tr></table></figure><h2 id="2、React-Hook"><a href="#2、React-Hook" class="headerlink" title="2、React Hook"></a>2、React Hook</h2><blockquote><p>由于 React 的函数组件没有生命周期。所以我们使用 Hook 来更改变量和进行数据操作。 在项目中最常用的 hook 如 useState、useEffect 以及 useRef。</p></blockquote><h3 id="2-1-useState"><a href="#2-1-useState" class="headerlink" title="2.1 useState"></a>2.1 useState</h3><blockquote><p>点击 add 数字加一，点击 sub 数字减一</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, &#123; useState &#125; <span class="keyword">from</span> <span class="string">&quot;react&quot;</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">App</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> [count, setCount] = <span class="title function_">useState</span>(<span class="number">0</span>);</span><br><span class="line">  <span class="comment">// 这里表示定义一个count变量，初始值为0；setCount表示对改变量进行赋值。</span></span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;count&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">button</span> <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> setCount(count + 1)&#125;&gt;add<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">button</span> <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> setCount(count - 1)&#125;&gt;sub<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><blockquote><p>上述代码等同于</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span> <span class="keyword">from</span> <span class="string">&quot;react&quot;</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">class</span> <span class="title class_">App</span> <span class="keyword">extends</span> <span class="title class_ inherited__">React.Component</span> &#123;</span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params">props</span>) &#123;</span><br><span class="line">    <span class="variable language_">super</span>(props);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">state</span> = &#123;</span><br><span class="line">      <span class="attr">count</span>: <span class="number">0</span>,</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="title function_">render</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; count &#125; = <span class="variable language_">this</span>.<span class="property">state</span>;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="language-xml"><span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;count&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">button</span> <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> this.setState(&#123; count: count + 1 &#125;)&#125;&gt;add<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">button</span> <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> this.setState(&#123; count: count - 1 &#125;)&#125;&gt;sub<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/&gt;</span></span></span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-2-useRef"><a href="#2-2-useRef" class="headerlink" title="2.2 useRef"></a>2.2 useRef</h3><blockquote><p>useRef 可以用于定义一个全局变量或者用于获取 DOM 元素</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, &#123; useRef &#125; <span class="keyword">from</span> <span class="string">&quot;react&quot;</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">App</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> pRef = <span class="title function_">useRef</span>(<span class="string">&quot;0&quot;</span>);</span><br><span class="line">  <span class="keyword">const</span> inputRef = <span class="title function_">useRef</span>(<span class="literal">null</span>);</span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">add</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    pRef.<span class="property">current</span> = pRef.<span class="property">current</span> + <span class="number">1</span>; <span class="comment">// 不生效</span></span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">input</span> <span class="attr">ref</span>=<span class="string">&#123;inputRef&#125;</span> <span class="attr">type</span>=<span class="string">&quot;text&quot;</span> <span class="attr">value</span>=<span class="string">&quot;1&quot;</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;pRef.current&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&#123;add&#125;</span>&gt;</span>add<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="2-3-useEffect"><a href="#2-3-useEffect" class="headerlink" title="2.3 useEffect"></a>2.3 useEffect</h3><blockquote><p>useEffect 可以看作 class 组件中的 componentDidMount 和 componentDidUpdate 函数</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, &#123; useState, useEffect &#125; <span class="keyword">from</span> <span class="string">&quot;react&quot;</span>;</span><br><span class="line"><span class="keyword">const</span> [status, setStatus] = <span class="title function_">useState</span>(<span class="literal">false</span>);</span><br><span class="line"><span class="keyword">const</span> [data, setData] = <span class="title function_">useState</span>([]);</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">App</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> [status, setStatus] = <span class="title function_">useState</span>(<span class="literal">false</span>);</span><br><span class="line">  <span class="keyword">const</span> [data, setData] = <span class="title function_">useState</span>([]);</span><br><span class="line">  <span class="title function_">useEffect</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="title function_">setData</span>([<span class="number">2</span>, <span class="number">3</span>]);</span><br><span class="line">  &#125;, []); <span class="comment">// 在页面刚渲染完成执行（componentDidMount）</span></span><br><span class="line"></span><br><span class="line">  <span class="title function_">useEffect</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;data:&quot;</span>, data);</span><br><span class="line">  &#125;, status); <span class="comment">// 每当status改变时，执行代码</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">change</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="title function_">setStatus</span>(<span class="literal">false</span>);</span><br><span class="line">    <span class="keyword">if</span> (data) &#123;</span><br><span class="line">      <span class="title function_">setData</span>([...data, data.<span class="title function_">push</span>(<span class="number">1</span>)]);</span><br><span class="line">      <span class="title function_">setStatus</span>(<span class="literal">true</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;data&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">button</span> <span class="attr">onClick</span>=<span class="string">&#123;change&#125;</span>&gt;</span>add<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="3、Antd-中-modal-和-form-组件"><a href="#3、Antd-中-modal-和-form-组件" class="headerlink" title="3、Antd 中 modal 和 form 组件"></a>3、Antd 中 modal 和 form 组件</h2><blockquote><p>Modal 和 Form 一起配合使用时，设置 destroyOnClose 也不会在 Modal 关闭时销毁表单字段数据，需要设置 Form 组件的 preserve&#x3D;{false}</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">Table</span>, <span class="title class_">Button</span>, <span class="title class_">Form</span>, <span class="title class_">Input</span>, <span class="title class_">Modal</span> &#125; <span class="keyword">from</span> <span class="string">&quot;antd&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">React</span>, &#123; useState, useEffect &#125; <span class="keyword">from</span> <span class="string">&quot;react&quot;</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">FormButton</span> = (<span class="params">&#123; open, onCancel, record, getData &#125;</span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> [form] = <span class="title class_">Form</span>.<span class="title function_">useForm</span>();</span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">onFinish</span> = (<span class="params">values</span>) =&gt; &#123;</span><br><span class="line">    <span class="title function_">getData</span>(values);</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;<span class="name">Modal</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">open</span>=<span class="string">&#123;open&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">onCancel</span>=<span class="string">&#123;onCancel&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">width</span>=<span class="string">&#123;300&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">footer</span>=<span class="string">&#123;null&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      <span class="attr">destroyOnClose</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">    &gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">Form</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">form</span>=<span class="string">&#123;form&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">onFinish</span>=<span class="string">&#123;onFinish&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">preserve</span>=<span class="string">&#123;false&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">initialValues</span>=<span class="string">&#123;record&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      &gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Form.Item</span> <span class="attr">name</span>=<span class="string">&quot;title&quot;</span> <span class="attr">label</span>=<span class="string">&quot;标题&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Input</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Form.Item</span> <span class="attr">name</span>=<span class="string">&quot;content&quot;</span> <span class="attr">label</span>=<span class="string">&quot;内容&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Input</span> <span class="attr">type</span>=<span class="string">&quot;textarea&quot;</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Button</span> <span class="attr">type</span>=<span class="string">&quot;primary&quot;</span> <span class="attr">htmlType</span>=<span class="string">&quot;submit&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">            提交</span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">htmlType</span>=<span class="string">&quot;button&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">onClick</span>=<span class="string">&#123;onCancel&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">            <span class="attr">style</span>=<span class="string">&#123;&#123;</span> <span class="attr">margin:</span> &quot;<span class="attr">0</span> <span class="attr">8px</span>&quot; &#125;&#125;</span></span></span><br><span class="line"><span class="tag"><span class="language-xml">          &gt;</span></span></span><br><span class="line"><span class="language-xml">            取消</span></span><br><span class="line"><span class="language-xml">          <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;/<span class="name">Form.Item</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/<span class="name">Form</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/<span class="name">Modal</span>&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">App</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> [open, setOpen] = <span class="title function_">useState</span>(<span class="literal">false</span>);</span><br><span class="line">  <span class="keyword">const</span> [data, setData] = <span class="title function_">useState</span>(</span><br><span class="line">    <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&quot;公告&quot;</span>,</span><br><span class="line">      <span class="attr">content</span>: <span class="string">&quot;明天放假一天，注意时间分配&quot;</span>,</span><br><span class="line">    &#125;)</span><br><span class="line">  );</span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">onCancel</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="title function_">setOpen</span>(<span class="literal">false</span>);</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> columns = [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&quot;标题&quot;</span>,</span><br><span class="line">      <span class="attr">dataIndex</span>: <span class="string">&quot;title&quot;</span>,</span><br><span class="line">      <span class="attr">key</span>: <span class="string">&quot;title&quot;</span>,</span><br><span class="line">      <span class="attr">width</span>: <span class="string">&quot;200&quot;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">title</span>: <span class="string">&quot;内容&quot;</span>,</span><br><span class="line">      <span class="attr">dataIndex</span>: <span class="string">&quot;content&quot;</span>,</span><br><span class="line">      <span class="attr">key</span>: <span class="string">&quot;content&quot;</span>,</span><br><span class="line">      <span class="attr">width</span>: <span class="string">&quot;200&quot;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">  ];</span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">getData</span> = (<span class="params">val</span>) =&gt; &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;提交的数据是：&quot;</span>, val);</span><br><span class="line">    <span class="keyword">if</span> (val) &#123;</span><br><span class="line">      <span class="title function_">setOpen</span>(<span class="literal">false</span>);</span><br><span class="line">      <span class="title function_">setData</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>(val));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> data;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="title function_">useEffect</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="title function_">getData</span>();</span><br><span class="line">  &#125;, []);</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    <span class="language-xml"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">Button</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">type</span>=<span class="string">&quot;primary&quot;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">onClick</span>=<span class="string">&#123;()</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-xml">          setOpen(true);</span></span><br><span class="line"><span class="language-xml">        &#125;&#125;</span></span><br><span class="line"><span class="language-xml">      &gt;</span></span><br><span class="line"><span class="language-xml">        修改</span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/<span class="name">Button</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">FormButton</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">open</span>=<span class="string">&#123;open&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">record</span>=<span class="string">&#123;JSON.parse(data)&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">onCancel</span>=<span class="string">&#123;onCancel&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">        <span class="attr">getData</span>=<span class="string">&#123;getData&#125;</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml">      /&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;<span class="name">Table</span> <span class="attr">dataSource</span>=<span class="string">&#123;[JSON.parse(data)]&#125;</span> <span class="attr">columns</span>=<span class="string">&#123;columns&#125;</span> /&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title class_">App</span>;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/react-function-component/</id>
    <link href="https://likepoems.com/archives/react-function-component/"/>
    <published>2022-11-03T10:54:00.000Z</published>
    <summary>
      <![CDATA[React 函数组件 1、定义方式 React 函数组件是指使用函数方法定义的组件。 定义方式：与函数的定义方式相同，需要将内容 return 出来，需要注意的是最外层只有一个标签或者使用<></>(Fragment 标签)包裹起来，方法写在 return 前面。 const App = () =>]]>
    </summary>
    <title>React 函数组件</title>
    <updated>2022-11-03T10:54:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="前端" scheme="https://likepoems.com/categories/front-end/"/>
    <category term="框架" scheme="https://likepoems.com/categories/front-end/web-framework/"/>
    <category term="react" scheme="https://likepoems.com/tags/react/"/>
    <content>
      <![CDATA[<h1 id="React-中的常用方法"><a href="#React-中的常用方法" class="headerlink" title="React 中的常用方法"></a>React 中的常用方法</h1><h2 id="1、合并数组"><a href="#1、合并数组" class="headerlink" title="1、合并数组"></a>1、合并数组</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 合并数组并去重</span></span><br><span class="line">mergeArray = <span class="function">(<span class="params">arr1, arr2</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="title class_">Array</span>.<span class="title function_">from</span>(<span class="keyword">new</span> <span class="title class_">Set</span>([...arr1, ...arr2]));</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="2、合并数组对象"><a href="#2、合并数组对象" class="headerlink" title="2、合并数组对象"></a>2、合并数组对象</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 合并具有相同属性的对象</span></span><br><span class="line">mergeObject = <span class="function">(<span class="params">needObj, neededObj</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">let</span> obj = &#123;&#125;;</span><br><span class="line">  <span class="keyword">return</span> needObj.<span class="title function_">concat</span>(neededObj).<span class="title function_">reduce</span>(<span class="function">(<span class="params">pre, cur</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (!obj[cur.<span class="property">id</span>]) &#123;</span><br><span class="line">      obj[cur.<span class="property">id</span>] = <span class="literal">true</span>;</span><br><span class="line">      pre.<span class="title function_">push</span>(cur);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> pre;</span><br><span class="line">  &#125;, []);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="3、数据格式化"><a href="#3、数据格式化" class="headerlink" title="3、数据格式化"></a>3、数据格式化</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 金额千分位</span></span><br><span class="line">formatNumber = <span class="function">(<span class="params">value</span>) =&gt;</span> &#123;</span><br><span class="line">  value += <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="keyword">const</span> list = value.<span class="title function_">split</span>(<span class="string">&quot;.&quot;</span>);</span><br><span class="line">  <span class="keyword">const</span> prefix = list[<span class="number">0</span>].<span class="title function_">charAt</span>(<span class="number">0</span>) === <span class="string">&quot;-&quot;</span> ? <span class="string">&quot;-&quot;</span> : <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="keyword">let</span> num = prefix ? list[<span class="number">0</span>].<span class="title function_">slice</span>(<span class="number">1</span>) : list[<span class="number">0</span>];</span><br><span class="line">  <span class="keyword">let</span> result = <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="keyword">while</span> (num.<span class="property">length</span> &gt; <span class="number">3</span>) &#123;</span><br><span class="line">    result = <span class="string">`,<span class="subst">$&#123;num.slice(-<span class="number">3</span>)&#125;</span><span class="subst">$&#123;result&#125;</span>`</span>;</span><br><span class="line">    num = num.<span class="title function_">slice</span>(<span class="number">0</span>, num.<span class="property">length</span> - <span class="number">3</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (num) &#123;</span><br><span class="line">    result = num + result;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="string">`<span class="subst">$&#123;prefix&#125;</span><span class="subst">$&#123;result&#125;</span><span class="subst">$&#123;list[<span class="number">1</span>] ? <span class="string">`.<span class="subst">$&#123;list[<span class="number">1</span>]&#125;</span>`</span> : <span class="string">&quot;&quot;</span>&#125;</span>`</span>;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="4、state-的使用"><a href="#4、state-的使用" class="headerlink" title="4、state 的使用"></a>4、state 的使用</h2><blockquote><p>只针对类组件，函数组件使用hook</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Test</span> <span class="keyword">extends</span> <span class="title class_ inherited__">React.Component</span> &#123;</span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params">props</span>) &#123;</span><br><span class="line">    <span class="variable language_">super</span>(props);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">state</span> = &#123;</span><br><span class="line">        str = <span class="string">&#x27;abc&#x27;</span>,</span><br><span class="line">        arr = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>],</span><br><span class="line">        obj = &#123;</span><br><span class="line">            <span class="attr">a</span>:<span class="number">1</span>,</span><br><span class="line">            <span class="attr">b</span>:<span class="number">2</span>,</span><br><span class="line">            <span class="attr">c</span>:<span class="number">3</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="title function_">componentDidMount</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">changeData</span>();</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  changeData = <span class="function">()=&gt;</span>&#123;</span><br><span class="line">    <span class="keyword">const</span> newObj = &#123;</span><br><span class="line">        <span class="attr">a</span>:<span class="number">4</span>,</span><br><span class="line">        <span class="attr">b</span>:<span class="number">5</span>,</span><br><span class="line">        <span class="attr">c</span>:<span class="number">6</span>,</span><br><span class="line">        <span class="attr">d</span>:<span class="number">7</span>,</span><br><span class="line">        <span class="attr">e</span>:[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setState</span>(&#123;</span><br><span class="line">        <span class="attr">str</span>:<span class="string">&#x27;def&#x27;</span>,</span><br><span class="line">        arr = [<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>],</span><br><span class="line">        <span class="attr">obj</span>: <span class="title class_">Object</span>.<span class="title function_">assign</span>(&#123;&#125;, <span class="variable language_">this</span>.<span class="property">state</span>.<span class="property">obj</span>, newObj)</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="title function_">render</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span>&#123;str,arr,obj&#125; = <span class="variable language_">this</span>.<span class="property">state</span></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      <span class="language-xml"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;str&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;arr&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">h1</span>&gt;</span>&#123;obj&#125;<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">      <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="5、dva-的使用"><a href="#5、dva-的使用" class="headerlink" title="5、dva 的使用"></a>5、dva 的使用</h2><blockquote><p>当前项目 src 文件下需要有 models 文件夹</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">// 路由配置</span></span><br><span class="line"></span><br><span class="line">    <span class="string">&#x27;/test&#x27;</span>: &#123;</span><br><span class="line">      <span class="attr">component</span>: <span class="title function_">dynamicWrapper</span>(</span><br><span class="line">        app, [<span class="string">&#x27;testModel&#x27;</span>], <span class="function">() =&gt;</span></span><br><span class="line">        <span class="keyword">import</span>(<span class="string">&#x27;../routes/Test&#x27;</span>)</span><br><span class="line">      ),</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;Test&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line"></span><br><span class="line"><span class="comment">// 页面中</span></span><br><span class="line"><span class="keyword">import</span> &#123; connect &#125; <span class="keyword">from</span> <span class="string">&#x27;dva&#x27;</span>;</span><br><span class="line">@<span class="title function_">connect</span>(<span class="function">(<span class="params">&#123; testModel &#125;</span>) =&gt;</span> (&#123; ...testModel &#125;))</span><br><span class="line"></span><br><span class="line"><span class="comment">//test.js</span></span><br><span class="line"><span class="keyword">import</span> request <span class="keyword">from</span> <span class="string">&#x27;@/utils/request&#x27;</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">GetNameList</span>(<span class="params">params</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="title function_">request</span>(<span class="string">`http://localhost:8000/api/test/GetNameList`</span>, &#123;</span><br><span class="line">    <span class="attr">method</span>: <span class="string">&#x27;POST&#x27;</span>,</span><br><span class="line">    <span class="attr">body</span>: params</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//testModel.js</span></span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> service <span class="keyword">from</span> <span class="string">&#x27;../../services/test&#x27;</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">  <span class="attr">namespace</span>: <span class="string">&quot;testModel&quot;</span>,</span><br><span class="line">  <span class="attr">state</span>: &#123;</span><br><span class="line">    <span class="attr">nameList</span>: [<span class="string">&quot;Jerry&quot;</span>]</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">effects</span>: &#123;</span><br><span class="line">    <span class="comment">// 异步方法</span></span><br><span class="line">    <span class="title function_">getNameList</span>(<span class="params">&#123; payload, callback &#125;, &#123; call, put &#125;</span>) &#123;</span><br><span class="line">      <span class="keyword">const</span> result = <span class="keyword">yield</span> <span class="title function_">call</span>(service.<span class="property">GetNameList</span>, payload);</span><br><span class="line">      <span class="keyword">yield</span> <span class="title function_">put</span>(&#123;</span><br><span class="line">        <span class="attr">type</span>: <span class="string">&#x27;returnData&#x27;</span>,</span><br><span class="line">        <span class="attr">payload</span>: result,</span><br><span class="line">      &#125;);</span><br><span class="line">      <span class="keyword">if</span> (callback) &#123;</span><br><span class="line">        <span class="title function_">callback</span>(result);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">reducers</span>: &#123;</span><br><span class="line">    <span class="comment">// 同步方法（静态方法）</span></span><br><span class="line">    <span class="title function_">returnData</span>(<span class="params">state, action</span>) &#123;</span><br><span class="line">      <span class="keyword">const</span> result = action.<span class="property">payload</span>;</span><br><span class="line">      <span class="keyword">let</span> dataSource = result.<span class="property">data</span>;</span><br><span class="line">      <span class="keyword">return</span> &#123;</span><br><span class="line">        ...state,</span><br><span class="line">        dataSource,</span><br><span class="line">      &#125;;</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/common-methods-in-react/</id>
    <link href="https://likepoems.com/archives/common-methods-in-react/"/>
    <published>2022-10-24T06:47:00.000Z</published>
    <summary>
      <![CDATA[React 中的常用方法 1、合并数组 // 合并数组并去重mergeArray = (arr1, arr2) => {  return Array.from(new Set([...arr1, ...arr2]));}; 2、合并数组对象 // 合并具有相同属性的对象mergeObjec]]>
    </summary>
    <title>React 中的常用方法</title>
    <updated>2022-10-24T06:47:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="笔记" scheme="https://likepoems.com/categories/note/"/>
    <category term="windows" scheme="https://likepoems.com/tags/windows/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote><p>我们平时都是通过一些杀毒软件或者控制面板来对软件进行卸载操作的，但这样卸载并不干净，注册表中存在的条目可能没删除或删除干净。而且杀毒软件还比较占用系统资源。</p></blockquote><h2 id="geek"><a href="#geek" class="headerlink" title="geek"></a>geek</h2><p>根据<a class="link"   href="https://geekuninstaller.com/"  title="geek">geek<i class="fas fa-external-link-alt"></i></a>官方介绍，能够对软件进行清洁去除和强制删除，支持64位的操作系统，而且软件轻量，只有6M左右，支持卸载应用商店的程序。目前支持window操作系统，我很早的时候就在使用了。以前它只有3M左右。(<a class="link"   href="https://share.feijipan.com/s/rtXkZeUB"  title="点我下载">点我进入下载页<i class="fas fa-external-link-alt"></i></a>)</p><p><img                         lazyload                       alt="image"                       data-src="https://static.likepoems.com/uploads/2022/08/geek.gif"                        alt="geek" title="geek"                 ></p>]]>
    </content>
    <id>https://likepoems.com/archives/how-to-uninstall-software-quickly-and-cleanly/</id>
    <link href="https://likepoems.com/archives/how-to-uninstall-software-quickly-and-cleanly/"/>
    <published>2022-08-26T11:17:00.000Z</published>
    <summary>前言 我们平时都是通过一些杀毒软件或者控制面板来对软件进行卸载操作的，但这样卸载并不干净，注册表中存在的条目可能没删除或删除干净。而且杀毒软件还比较占用系统资源。 geek 根据geek官方介绍，能够对软件进行清洁去除和强制删除，支持64位的操作系统，而且软件轻量，只有6M左右，支持卸载应用商店的程</summary>
    <title>如何快速干净的卸载软件</title>
    <updated>2022-08-26T11:17:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="服务端" scheme="https://likepoems.com/categories/service-side/"/>
    <category term="C#" scheme="https://likepoems.com/categories/service-side/cshape/"/>
    <category term="csharp" scheme="https://likepoems.com/tags/csharp/"/>
    <category term="netcore" scheme="https://likepoems.com/tags/netcore/"/>
    <content>
      <![CDATA[<h3 id="model-实体"><a href="#model-实体" class="headerlink" title="model 实体"></a>model 实体</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Test.Models.Book</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">BookModel</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">int</span> BookId &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">string</span> FileName &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="controller-控制器层"><a href="#controller-控制器层" class="headerlink" title="controller 控制器层"></a>controller 控制器层</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Test.BLL.Book;</span><br><span class="line"><span class="keyword">using</span> Test.Models.Book;</span><br><span class="line"><span class="keyword">using</span> Microsoft.AspNetCore.Http;</span><br><span class="line"><span class="keyword">using</span> Microsoft.AspNetCore.Mvc;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Test.Controllers.Book</span></span><br><span class="line">&#123;</span><br><span class="line">    [<span class="meta">Route(<span class="string">&quot;api/book/[controller]/[action]&quot;</span>)</span>]</span><br><span class="line">    [<span class="meta">ApiController</span>]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Book</span> : <span class="title">Controller</span></span><br><span class="line">    &#123;</span><br><span class="line">        [<span class="meta">HttpPost</span>]</span><br><span class="line">        <span class="function"><span class="keyword">public</span> ActionResult <span class="title">ExportBookData</span>(<span class="params">[FromBody] BookModel model</span>)   <span class="comment">// 下载文件</span></span></span><br><span class="line">        &#123;</span><br><span class="line">            BookDal bll = <span class="keyword">new</span> BookDal();</span><br><span class="line">            DataSet ds =  bll.ExportBookData(model.BookId);</span><br><span class="line">            Dictionary&lt;<span class="built_in">string</span>, List&lt;ExcelColumn&gt;&gt; dc = <span class="keyword">new</span> Dictionary&lt;<span class="built_in">string</span>, List&lt;ExcelColumn&gt;&gt;();</span><br><span class="line">            ds.Tables[<span class="number">0</span>].TableName = <span class="string">&quot;sheet1&quot;</span>;</span><br><span class="line">            List&lt;ExcelColumn&gt; listColumns = bll.ExportBookColumns(); <span class="comment">// xlsx文件的表头</span></span><br><span class="line">            dc.Add(<span class="string">&quot;sheet1&quot;</span>, listColumns);</span><br><span class="line">            MemoryStream ms = <span class="keyword">new</span> ExcelUtils().GetStreamByData(ds, dc);</span><br><span class="line">            <span class="built_in">byte</span>[] buffer = ms.ToArray();  <span class="comment">//转化为byte格式存储</span></span><br><span class="line">            MemoryStream ms1 = <span class="keyword">new</span> MemoryStream(buffer);</span><br><span class="line">            <span class="keyword">return</span> File(ms1, System.Net.Mime.MediaTypeNames.Application.Octet, model.FileName);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="bll-业务逻辑层"><a href="#bll-业务逻辑层" class="headerlink" title="bll 业务逻辑层"></a>bll 业务逻辑层</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Test.DAL.Book;</span><br><span class="line"><span class="keyword">using</span> Test.Models.Book;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Test.BLL.Book</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Book</span></span><br><span class="line">    &#123;</span><br><span class="line">        BookDal bll = <span class="keyword">new</span> BookDal();</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">public</span> DataSet <span class="title">ExportBookData</span>(<span class="params"><span class="built_in">int</span> BookId</span>) <span class="comment">// 导出的数据</span></span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> bll.ExportBookData(BookId);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">public</span> List&lt;ExcelColumn&gt; <span class="title">ExportBookColumns</span>() <span class="comment">// 导出的表头</span></span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> bll.ExportBookColumns();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="dal-数据操作层"><a href="#dal-数据操作层" class="headerlink" title="dal 数据操作层"></a>dal 数据操作层</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Test.BLL;</span><br><span class="line"><span class="keyword">using</span> Test.Models.Book;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Test.DAL.Book</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Book</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">public</span> DataSet <span class="title">ExportBookData</span>(<span class="params"><span class="built_in">int</span> BookId</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            IDbConnection sqlconn = SqlUtil.SqlConnection(ConfigUtil.GetSysSettings().Book);</span><br><span class="line">            <span class="keyword">try</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="built_in">string</span> sql = <span class="string">@&quot;SELECT * FROM book WHERE BookId = @BookId&quot;</span></span><br><span class="line">                sqlconn.Open();</span><br><span class="line">                SqlCommand sqlcomm = <span class="keyword">new</span> SqlCommand();</span><br><span class="line">                sqlcomm.CommandType = CommandType.Text;</span><br><span class="line">                sqlcomm.Connection = sqlconn;</span><br><span class="line">                sqlcomm.CommandText = sql;</span><br><span class="line">                sqlcomm.Parameters.Add(<span class="keyword">new</span> SqlParameter(<span class="string">&quot;@BookId&quot;</span>, BookId));</span><br><span class="line">                SqlDataAdapter sqlda = <span class="keyword">new</span> SqlDataAdapter(sqlcomm);</span><br><span class="line">                DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line">                sqlda.Fill(ds);</span><br><span class="line">                <span class="keyword">return</span> ds;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">catch</span> (Exception ex)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> Exception(<span class="string">&quot;查询失败&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">finally</span></span><br><span class="line">            &#123;</span><br><span class="line">                sqlconn.Close();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">public</span> List&lt;ExcelColumn&gt; <span class="title">ExportBookColumns</span>()</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">string</span>[] columns =</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="string">&quot;BookId&quot;</span></span><br><span class="line">                ,<span class="string">&quot;BookName&quot;</span></span><br><span class="line">                ,<span class="string">&quot;BookDetail&quot;</span></span><br><span class="line">                ,<span class="string">&quot;BookDate&quot;</span></span><br><span class="line">                ,<span class="string">&quot;SaleNumber&quot;</span></span><br><span class="line">                ,<span class="string">&quot;BookPrice&quot;</span></span><br><span class="line">                ,<span class="string">&quot;SaleCity&quot;</span></span><br><span class="line">            &#125;;</span><br><span class="line">            List&lt;ExcelColumn&gt; listColumns = <span class="keyword">new</span> List&lt;ExcelColumn&gt;();</span><br><span class="line">            <span class="keyword">foreach</span> (<span class="keyword">var</span> column <span class="keyword">in</span> columns)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="built_in">string</span> headName = column;</span><br><span class="line">                <span class="keyword">switch</span> (column)</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">case</span> <span class="string">&quot;BookId&quot;</span>:</span><br><span class="line">                        headName = <span class="string">&quot;BookId&quot;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    <span class="keyword">case</span> <span class="string">&quot;BookName&quot;</span>:</span><br><span class="line">                        headName = <span class="string">&quot;BookName&quot;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    <span class="keyword">case</span> <span class="string">&quot;BookDetail&quot;</span>:</span><br><span class="line">                        headName = <span class="string">&quot;BookDetail&quot;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    <span class="keyword">case</span> <span class="string">&quot;BookDate&quot;</span>:</span><br><span class="line">                        headName = <span class="string">&quot;BookDate&quot;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    <span class="keyword">case</span> <span class="string">&quot;SaleNumber&quot;</span>:</span><br><span class="line">                        headName = <span class="string">&quot;SaleNumber&quot;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    <span class="keyword">case</span> <span class="string">&quot;BookPrice&quot;</span>:</span><br><span class="line">                        headName = <span class="string">&quot;BookPrice&quot;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    <span class="keyword">case</span> <span class="string">&quot;SaleCity&quot;</span>:</span><br><span class="line">                        headName = <span class="string">&quot;SaleCity&quot;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                listColumns.Add(<span class="keyword">new</span> ExcelColumn(headName, column, <span class="number">200</span>));</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> listColumns;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/csharp-implements-xlsx-file-export/</id>
    <link href="https://likepoems.com/archives/csharp-implements-xlsx-file-export/"/>
    <published>2022-08-17T08:05:00.000Z</published>
    <summary>model 实体 namespace Test.Models.Book{    public class BookModel    {        public int BookId { get; set; }        public string FileName { get; s</summary>
    <title>C#实现xlsx文件导出</title>
    <updated>2022-08-17T08:05:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>likepoems</name>
    </author>
    <category term="笔记" scheme="https://likepoems.com/categories/note/"/>
    <category term="blog" scheme="https://likepoems.com/tags/blog/"/>
    <content>
      <![CDATA[<ul><li><p>在视频的播放页地址栏最前面添加<code>wn.run/</code>跳转到在线工具页面，然后选择播放工具，复制视频地址即可进行解析和播放。</p></li><li><p>或者在浏览器输入以下地址，将要播放的视频地址复制解析框中，选择解析方式，进行解析和播放。</p></li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://v.1314.in/ https://vip.huayao88.com/ https://video.stkey.top/</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://likepoems.com/archives/watch-tencent-youku-iqiyi-video-vip-movies-for-free/</id>
    <link href="https://likepoems.com/archives/watch-tencent-youku-iqiyi-video-vip-movies-for-free/"/>
    <published>2022-08-11T08:30:00.000Z</published>
    <summary>在视频的播放页地址栏最前面添加wn.run/跳转到在线工具页面，然后选择播放工具，复制视频地址即可进行解析和播放。 或者在浏览器输入以下地址，将要播放的视频地址复制解析框中，选择解析方式，进行解析和播放。   https//v.1314.in/  https//vip.huayao88.com</summary>
    <title>免费观看腾讯视频/优酷/爱奇艺/VIP影片</title>
    <updated>2022-08-11T08:30:00.000Z</updated>
  </entry>
</feed>
