<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>代码重构 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84/</link><description>Recent content in 代码重构 on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>过滤器(filter)的现代化替代方案</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-36/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-36/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>框架机制理解&lt;/strong>：对Vue3破坏性变更的认知及迁移策略&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>：不同替代方案的技术选型决策能力&lt;/li>
&lt;li>&lt;strong>代码设计能力&lt;/strong>：格式化逻辑的合理抽象与封装&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>全局属性(globalProperties)的适用场景与污染风险&lt;/li>
&lt;li>组合式函数(Composable Function)的模块化优势&lt;/li>
&lt;li>计算属性(Computed)的响应式特性适用边界&lt;/li>
&lt;li>Vue2/Vue3兼容方案的实现原理&lt;/li>
&lt;li>代码可维护性与TypeScript支持考量&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>组合式函数 &amp;gt; 计算属性 &amp;gt; 全局属性 &amp;gt; 自定义指令&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>全局属性&lt;/strong>：通过&lt;code>app.config.globalProperties&lt;/code>挂载方法，类似Vue2的全局过滤器&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="be69549" class="language-javascript ">
 &lt;code>// 配置
app.config.globalProperties.$filters = {
 currency: (v) =&amp;gt; formatCurrency(v)
}

// 使用
{{ $filters.currency(price) }}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>组合式函数&lt;/strong>：基于Composition API的逻辑复用&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="413a15b" class="language-javascript ">
 &lt;code>// useFormatter.js
export function useFormatter() {
 const currency = (v) =&amp;gt; `${v.toFixed(2)} $`
 return { currency }
}

// 组件内
const { currency } = useFormatter()&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>计算属性&lt;/strong>：适用于依赖响应式数据的场景&lt;/p></description></item><item><title>Vue3移除API的替代方案</title><link>https://fe-interview.pangcy.cn/docs/framework/vue3/vue3-26/</link><pubDate>Tue, 04 Mar 2025 07:00:31 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue3/vue3-26/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>框架演进理解&lt;/strong>：是否掌握Vue3的设计理念与破坏性变更&lt;/li>
&lt;li>&lt;strong>API迁移能力&lt;/strong>：针对已废弃特性能否给出官方推荐替代方案&lt;/li>
&lt;li>&lt;strong>架构设计思维&lt;/strong>：理解不同状态管理方案的适用场景及优劣对比&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>过滤器（Filters）的现代化替代方案&lt;/li>
&lt;li>$children的替代实现方式&lt;/li>
&lt;li>事件总线（Event Bus）模式的问题分析&lt;/li>
&lt;li>状态管理方案的选型依据&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Composition API &amp;gt; 过滤器替代&lt;/li>
&lt;li>ref/scoped slots &amp;gt; $children替代&lt;/li>
&lt;li>Provide/estore &amp;gt; 事件总线替代&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vue3移除过滤器的核心逻辑在于提升模板的JavaScript表达能力。通过方法调用（{{ formatDate(date) }}）或计算属性，开发者可以获得类型安全与更好的TS支持。$children的移除源于其不可靠的组件树遍历特性，改用ref获取具体子组件实例可避免隐式依赖。&lt;/p>
&lt;p>事件总线的问题突出表现在响应式追踪失效和内存泄漏风险。基于Provide/Inject的依赖注入模式通过清晰的组件层级关系进行通信，而Pinia等状态库通过集中式store管理跨组件状态，配合Vue Devtools可实现完整的状态变更追溯。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>错误地在组合式函数中尝试使用过滤器&lt;/li>
&lt;li>通过$parent逆向操作破坏组件封装性&lt;/li>
&lt;li>在大型项目中滥用事件总线导致调试困难&lt;/li>
&lt;/ul>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vue3官方推荐的API替代方案如下：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>过滤器（Filter）&lt;/strong>：改用方法调用或计算属性。例如将&lt;code>{{ text | uppercase }}&lt;/code>改写为&lt;code>{{ uppercase(text) }}&lt;/code>，或在setup中使用computed处理复杂逻辑&lt;/li>
&lt;li>&lt;strong>$children&lt;/strong>：使用模板ref获取特定子组件引用，或通过作用域插槽传递数据。跨层级通信推荐provide/inject&lt;/li>
&lt;li>&lt;strong>事件总线&lt;/strong>：改用provide/inject传递回调函数，或采用Pinia进行状态管理。事件总线因缺乏响应式追踪、易引发内存泄漏，且不利于维护而被废弃&lt;/li>
&lt;/ol>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="事件总线替代示例">事件总线替代示例 &lt;a href="#%e4%ba%8b%e4%bb%b6%e6%80%bb%e7%ba%bf%e6%9b%bf%e4%bb%a3%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="4e4fad9" class="language-javascript ">
 &lt;code>// 使用Pinia状态管理
import { defineStore } from &amp;#39;pinia&amp;#39;

const eventStore = defineStore(&amp;#39;events&amp;#39;, {
 state: () =&amp;gt; ({
 listeners: {}
 }),
 actions: {
 on(event, callback) {
 (this.listeners[event] ||= []).push(callback)
 },
 emit(event, ...args) {
 this.listeners[event]?.forEach(fn =&amp;gt; fn(...args))
 }
 }
})

// 组件中使用
const store = eventStore()
store.on(&amp;#39;refresh&amp;#39;, () =&amp;gt; {...})
store.emit(&amp;#39;refresh&amp;#39;)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="扩展建议">扩展建议 &lt;a href="#%e6%89%a9%e5%b1%95%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>低端设备：采用事件节流并及时清理监听器&lt;/li>
&lt;li>超大应用：结合Pinia的模块化store进行状态拆分&lt;/li>
&lt;li>SSR场景：使用Symbol作为provide的key避免命名冲突&lt;/li>
&lt;/ul>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何防止provide/inject的滥用导致组件耦合？&lt;/strong>
采用类型约束与接口声明，通过TS确保注入内容的契约性&lt;/p></description></item></channel></rss>