<?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/%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86/</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/%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>Vue组件通信方式及应用场景</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-21/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-21/</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;strong>核心能力维度&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>组件化设计能力（通信机制选择合理性）&lt;/li>
&lt;li>状态管理方案选型能力（不同场景技术适配）&lt;/li>
&lt;li>框架原理理解深度（响应式系统/依赖注入机制）&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Props/emit的单项数据流控制&lt;/li>
&lt;li>全局事件总线的发布订阅模式实现&lt;/li>
&lt;li>状态管理库的响应式原理差异&lt;/li>
&lt;li>Provide/inject的上下文穿透特性&lt;/li>
&lt;li>Refs操作DOM的边界场景处理&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" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vue响应式系统 &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>Props/emit&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>基于组件树结构的单向数据流，通过v-bind传递响应式数据，通过$emit触发自定义事件&lt;/li>
&lt;li>父组件更新触发子组件重新渲染，但直接修改prop会触发警告&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>全局事件总线&lt;/strong>&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="7547c4f" class="language-javascript ">
 &lt;code>// 实现示例
const bus = new Vue()
// 组件A发送
bus.$emit(&amp;#39;custom-event&amp;#39;, payload)
// 组件B接收
bus.$on(&amp;#39;custom-event&amp;#39;, handler)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>基于Vue内置的发布订阅模式，适合非父子组件通信&lt;/li>
&lt;li>需手动维护事件监听与卸载，否则易导致内存泄漏&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Vuex/Pinia&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Vuex基于Flux架构，通过Store集中管理状态，Mutation同步修改&lt;/li>
&lt;li>Pinia采用Composition API风格，取消Mutation直接暴露actions&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Provide/inject&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>通过组件链隐式传递数据，适用于深层嵌套组件&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="6624f4e" class="language-javascript ">
 &lt;code>// 祖先组件
provide() {
 return { userLocation: this.location }
}
// 后代组件
inject: [&amp;#39;userLocation&amp;#39;]&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>默认非响应式，需配合Vue.observable实现响应式传递&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$refs&lt;/strong>&lt;/p></description></item><item><title>组件data状态重置方法</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-41/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-41/</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;strong>核心能力维度&lt;/strong>：Vue响应式原理理解、状态管理能力、安全操作意识&lt;/p>
&lt;ul>
&lt;li>&lt;strong>响应式系统机制&lt;/strong>：理解Vue如何通过Object.defineProperty/Proxy实现数据劫持&lt;/li>
&lt;li>&lt;strong>引用类型操作风险&lt;/strong>：识别直接替换对象导致的响应式丢失问题&lt;/li>
&lt;li>&lt;strong>安全状态重置方案&lt;/strong>：掌握通过属性合并或重建数据源的方法&lt;/li>
&lt;li>&lt;strong>API使用规范&lt;/strong>：正确使用$options.data获取初始状态&lt;/li>
&lt;li>&lt;strong>框架特性边界&lt;/strong>：区分Vue 2与Vue 3在响应式实现上的差异&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" 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; Object.assign工作模式 &amp;gt; data函数执行机制&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;p>Vue在组件初始化时通过&lt;code>Object.defineProperty&lt;/code>（Vue 2）或&lt;code>Proxy&lt;/code>（Vue 3）递归转换data对象为响应式。直接赋值&lt;code>this.data = newData&lt;/code>会导致：&lt;/p>
&lt;ol>
&lt;li>破坏已建立的getter/setter绑定&lt;/li>
&lt;li>新增属性未经过响应式处理&lt;/li>
&lt;li>移除原有属性可能引发内存泄漏&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>安全方案原理&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Object.assign合并&lt;/strong>：保持对象引用，仅覆盖属性值，响应式属性得以保留&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="e59d49a" class="language-javascript ">
 &lt;code>Object.assign(this.$data, this.$options.data())&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ul>
&lt;li>&lt;strong>重建data函数&lt;/strong>：通过工厂函数生成新对象，逐个属性赋值触发setter&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="46125b9" class="language-javascript ">
 &lt;code>const initialData = this.$options.data()
Object.keys(initialData).forEach(key =&amp;gt; {
 this[key] = initialData[key]
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&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;code>this.data&lt;/code>是普通JavaScript对象&lt;/li>
&lt;li>错误使用&lt;code>=&lt;/code>直接替换整个data对象&lt;/li>
&lt;li>忽略嵌套对象的响应式维护&lt;/li>
&lt;/ul>
&lt;hr>
&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>直接赋值破坏响应式的原因在于Vue的响应式系统依赖初始化时建立的属性访问拦截。当替换整个data对象时，新对象未经过&lt;code>observe&lt;/code>处理，导致：&lt;/p>
&lt;ol>
&lt;li>已存在的响应式绑定丢失&lt;/li>
&lt;li>新增属性无法触发视图更新&lt;/li>
&lt;li>被替换对象可能无法被垃圾回收&lt;/li>
&lt;/ol>
&lt;p>安全方案通过保留原始对象引用或逐个属性赋值，确保所有变更都经过响应式系统：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ec2b636" class="language-javascript ">
 &lt;code>// 方法1：对象属性合并
resetData() {
 Object.assign(this.$data, this.$options.data())
}

// 方法2：递归重置（处理嵌套对象）
resetDeep() {
 const traverse = (target, source) =&amp;gt; {
 Object.keys(source).forEach(key =&amp;gt; {
 if (_.isObject(source[key])) {
 traverse(target[key], source[key])
 } else {
 target[key] = source[key]
 }
 })
 }
 traverse(this.$data, this.$options.data())
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&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="#%e7%bc%96%e7%a0%81%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="6ec023c" class="language-javascript ">
 &lt;code>export default {
 data() {
 return {
 user: { name: &amp;#39;John&amp;#39;, permissions: [&amp;#39;read&amp;#39;] },
 counter: 0
 }
 },
 methods: {
 // 标准重置方案
 reset() {
 // 保持对象引用，仅更新属性值
 Object.assign(this.$data, this.$options.data.call(this))
 
 // 处理数组引用丢失问题
 this.user.permissions = [...this.$options.data().user.permissions]
 },
 
 // 防御性重置（处理嵌套结构）
 deepReset() {
 const initial = this.$options.data()
 const queue = [[this.$data, initial]]
 
 while (queue.length) {
 const [target, source] = queue.pop()
 Object.keys(source).forEach(key =&amp;gt; {
 if (typeof source[key] === &amp;#39;object&amp;#39; &amp;amp;&amp;amp; !Array.isArray(source[key])) {
 queue.push([target[key], source[key]])
 } else {
 target[key] = Array.isArray(source[key]) 
 ? [...source[key]] 
 : source[key]
 }
 })
 }
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%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;strong>大数据量&lt;/strong>：采用分片重置策略，避免主线程阻塞&lt;/li>
&lt;li>&lt;strong>低端设备&lt;/strong>：使用&lt;code>requestIdleCallback&lt;/code>分批处理&lt;/li>
&lt;li>&lt;strong>TypeScript支持&lt;/strong>：通过泛型约束保证类型安全&lt;/li>
&lt;/ul>
&lt;hr>
&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>Vue3使用Proxy后是否还存在此问题？&lt;/strong>&lt;br>
答：Proxy代理整个对象，直接替换仍会丢失响应式，需使用&lt;code>reactive&lt;/code>重新包装&lt;/p></description></item><item><title>组合式API常用方法解析</title><link>https://fe-interview.pangcy.cn/docs/framework/vue3/vue3-07/</link><pubDate>Tue, 04 Mar 2025 07:00:31 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue3/vue3-07/</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>：核心API的适用场景与实现差异&lt;/li>
&lt;li>&lt;strong>异步状态管理&lt;/strong>：事件循环与响应式更新的协同机制&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>ref与reactive的响应式实现差异&lt;/li>
&lt;li>computed的缓存特性与依赖收集机制&lt;/li>
&lt;li>provide/inject的跨层级通信原理&lt;/li>
&lt;li>微任务队列与DOM更新时机的关联性&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" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>响应式基础（ref/reactive） &amp;gt; 计算属性（computed） &amp;gt; 依赖注入（provide/inject） &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;strong>ref&lt;/strong>：通过&lt;code>Object.defineProperty&lt;/code>实现基本类型值的响应式包装，内部值存储在&lt;code>.value&lt;/code>属性中。当操作&lt;code>.value&lt;/code>时触发依赖收集与更新通知。&lt;/li>
&lt;li>&lt;strong>reactive&lt;/strong>：基于Proxy代理对象，实现深层次响应式。直接操作属性即可触发更新，但解构会丢失响应性。&lt;/li>
&lt;li>&lt;strong>computed&lt;/strong>：惰性求值的响应式引用，依赖变更时缓存失效。内部通过&lt;code>effect&lt;/code>实现依赖追踪。&lt;/li>
&lt;li>&lt;strong>异步陷阱&lt;/strong>：Vue的响应式更新在同步代码中自动批处理，但在异步回调（如&lt;code>setTimeout&lt;/code>或Promise）中直接赋值&lt;code>.value&lt;/code>可能导致更新未及时触发，需配合&lt;code>nextTick&lt;/code>确保DOM更新队列执行。&lt;/li>
&lt;/ol>
&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>误将reactive用于基本类型导致性能浪费&lt;/li>
&lt;li>异步回调中遗漏&lt;code>.value&lt;/code>操作引发更新丢失&lt;/li>
&lt;li>混淆computed与methods的使用场景&lt;/li>
&lt;/ul>
&lt;hr>
&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>&lt;strong>核心API作用&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>ref&lt;/code>：包装基本类型值为响应式对象，通过&lt;code>.value&lt;/code>访问&lt;/li>
&lt;li>&lt;code>reactive&lt;/code>：创建深层次响应式对象，适用于复杂数据结构&lt;/li>
&lt;li>&lt;code>computed&lt;/code>：创建依赖其他响应式状态的计算属性，具有缓存优化&lt;/li>
&lt;li>&lt;code>provide/inject&lt;/code>：实现跨组件层级的状态注入，解决prop逐层传递问题&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>异步场景注意点&lt;/strong>：
在异步回调中直接修改&lt;code>.value&lt;/code>可能错过Vue的批量更新时机 。由于Vue的响应式更新在同步任务中合并处理，而异步任务处于新的调用栈（Call Stack），此时赋值操作会立即触发渲染队列，可能导致重复计算或视图更新不同步。需在修改后调用&lt;code>nextTick&lt;/code>确保更新时序正确。&lt;/p>
&lt;hr>
&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="#%e7%bc%96%e7%a0%81%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="d4f228e" class="language-javascript ">
 &lt;code>// 异步请求中的正确用法
const dataRef = ref(null);

fetchData().then((response) =&amp;gt; {
 dataRef.value = response; // 正确触发响应式更新
}).catch(() =&amp;gt; {
 dataRef.value = null; // 边界条件处理
});

// 组件卸载时取消请求（示例）
onBeforeUnmount(() =&amp;gt; {
 abortController.abort();
});&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="优化建议">优化建议 &lt;a href="#%e4%bc%98%e5%8c%96%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;strong>低端设备优化&lt;/strong>：对大型响应式对象使用&lt;code>shallowRef&lt;/code>减少代理开销&lt;/li>
&lt;li>&lt;strong>高并发场景&lt;/strong>：结合&lt;code>watchEffect&lt;/code>自动清理副作用，避免内存泄漏&lt;/li>
&lt;/ul>
&lt;hr>
&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>reactive处理Map/Set的局限？&lt;/strong>
回答提示：需使用&lt;code>reactive&lt;/code>包装容器+自定义拦截器&lt;/p></description></item><item><title>类组件与函数组件区别</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-05/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-05/</guid><description>&lt;h2 id="类组件与函数组件区别解析">类组件与函数组件区别解析 &lt;a href="#%e7%b1%bb%e7%bb%84%e4%bb%b6%e4%b8%8e%e5%87%bd%e6%95%b0%e7%bb%84%e4%bb%b6%e5%8c%ba%e5%88%ab%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="#%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;/h3>&lt;p>本题考察对React两种组件形态的深层次理解，核心评估以下维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>生命周期管理能力&lt;/strong>：对比传统生命周期方法与Hooks的等效实现&lt;/li>
&lt;li>&lt;strong>状态逻辑模式差异&lt;/strong>：类组件实例属性与函数组件闭包状态的运作机制&lt;/li>
&lt;li>&lt;strong>优化策略演进&lt;/strong>：Hooks时代性能优化方案的范式转变&lt;/li>
&lt;li>&lt;strong>编程范式差异&lt;/strong>：面向对象与函数式编程在React中的具体表现&lt;/li>
&lt;li>&lt;strong>内存管理机制&lt;/strong>：实例持久化与闭包捕获变量的存储方式&lt;/li>
&lt;/ol>
&lt;h3 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;/h3>&lt;h4 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;/h4>&lt;p>Hooks执行机制 &amp;gt; 类组件生命周期 &amp;gt; 闭包状态管理 &amp;gt; Fiber架构优化策略&lt;/p>
&lt;h4 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;/h4>&lt;ol>
&lt;li>&lt;strong>生命周期映射&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;code>componentDidMount&lt;/code> → &lt;code>useEffect(..., [])&lt;/code>&lt;/li>
&lt;li>&lt;code>componentDidUpdate&lt;/code> → &lt;code>useEffect(..., [deps])&lt;/code>&lt;/li>
&lt;li>&lt;code>componentWillUnmount&lt;/code> → &lt;code>useEffect(() =&amp;gt; { return cleanup })&lt;/code>&lt;/li>
&lt;li>&lt;code>getDerivedStateFromProps&lt;/code> → &lt;code>useMemo&lt;/code>+状态对比&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>状态管理差异&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="172f9ff" class="language-javascript ">
 &lt;code>// 类组件（合并式更新）
this.setState({ count: 1 }) // 自动合并状态对象

// 函数组件（替换式更新）
const [state, setState] = useState({ count: 0 })
setState(prev =&amp;gt; ({ ...prev, count: 1 })) // 需手动合并&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="3">
&lt;li>&lt;strong>优化策略对比&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>类组件：&lt;code>shouldComponentUpdate&lt;/code>手动比对、&lt;code>PureComponent&lt;/code>浅比较&lt;/li>
&lt;li>函数组件：&lt;code>React.memo&lt;/code>包裹、&lt;code>useMemo&lt;/code>缓存计算值、&lt;code>useCallback&lt;/code>缓存函数引用&lt;/li>
&lt;/ul>
&lt;h4 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;/h4>&lt;ol>
&lt;li>误以为&lt;code>useState&lt;/code>立即更新状态（实际是异步批量更新）&lt;/li>
&lt;li>在&lt;code>useEffect&lt;/code>中遗漏依赖项导致闭包陷阱&lt;/li>
&lt;li>错误地在条件语句中使用Hooks破坏调用顺序&lt;/li>
&lt;/ol>
&lt;h3 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;/h3>&lt;p>类组件通过继承机制维护组件实例，使用生命周期方法管理副作用，状态存储在&lt;code>this.state&lt;/code>中通过合并策略更新。函数组件借助Hooks实现状态持久化，利用闭包捕获渲染时的状态快照，依赖顺序保证来管理副作用。&lt;/p></description></item><item><title>React组件通信方式</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-08/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-08/</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;strong>核心能力维度&lt;/strong>：React组件化设计能力、状态管理策略选择、框架API运用水平&lt;br>
&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>Props单向数据流机制的理解深度&lt;/li>
&lt;li>跨组件通信方案的场景适配能力&lt;/li>
&lt;li>状态管理工具选型的技术判断力&lt;/li>
&lt;li>对React设计哲学（单向数据流、组件隔离）的掌握程度&lt;/li>
&lt;li>性能优化意识（避免不必要的渲染、状态存储位置合理性）&lt;/li>
&lt;/ol>
&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" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Props传参 &amp;gt; Context API &amp;gt; 状态提升 &amp;gt; Redux&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;strong>Props传参&lt;/strong>：基于React单向数据流设计，父组件通过属性绑定传递数据，子组件通过props接收。函数作为prop可实现逆向通信（子调父）。&lt;/li>
&lt;li>&lt;strong>状态提升&lt;/strong>：将共享状态提升到最近的共同祖先组件，通过props向下分发，适用于中等复杂度的兄弟组件通信。&lt;/li>
&lt;li>&lt;strong>Context API&lt;/strong>：通过Provider组件注入全局数据，Consumer组件或useContext钩子消费数据，避免多层透传props。&lt;/li>
&lt;li>&lt;strong>Redux&lt;/strong>：采用单一数据源，通过dispatch action触发状态更新，适用于复杂应用状态管理，配合中间件处理异步逻辑。&lt;/li>
&lt;/ol>
&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>在子组件直接修改props属性（应使用回调函数）&lt;/li>
&lt;li>Context滥用导致组件过度渲染（缺乏memoization优化）&lt;/li>
&lt;li>Redux过早优化导致架构复杂化（简单场景使用本地状态即可）&lt;/li>
&lt;/ul>
&lt;hr>
&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;h3 id="父子组件通信">父子组件通信 &lt;a href="#%e7%88%b6%e5%ad%90%e7%bb%84%e4%bb%b6%e9%80%9a%e4%bf%a1" 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>：父组件通过JSX属性传递数据，子组件通过props对象接收&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="96c47c7" class="language-jsx ">
 &lt;code>// 父组件
&amp;lt;ChildComponent data={stateValue} /&amp;gt; 

// 子组件
function ChildComponent({ data }) {
 return &amp;lt;div&amp;gt;{data}&amp;lt;/div&amp;gt;
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>子传父&lt;/strong>：父组件传递回调函数作为prop，子组件触发回调&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="2985f01" class="language-jsx ">
 &lt;code>// 父组件
const handleChildEvent = (data) =&amp;gt; {...}
&amp;lt;ChildComponent onEvent={handleChildEvent} /&amp;gt;

// 子组件
&amp;lt;button onClick={() =&amp;gt; onEvent(payload)}&amp;gt;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;/ol>
&lt;h3 id="跨级组件通信">跨级组件通信 &lt;a href="#%e8%b7%a8%e7%ba%a7%e7%bb%84%e4%bb%b6%e9%80%9a%e4%bf%a1" 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;/p></description></item><item><title>Redux设计思想与工作流程</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-10/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-10/</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;strong>状态管理架构设计&lt;/strong>和&lt;strong>异步流程控制&lt;/strong>的掌握程度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>核心设计原则理解&lt;/strong>：单一数据源与纯函数Reducer如何构建可预测状态系统&lt;/li>
&lt;li>&lt;strong>工作流程机制&lt;/strong>：从Action分发到状态更新的数据流闭环&lt;/li>
&lt;li>&lt;strong>中间件原理&lt;/strong>：如何通过中间件机制扩展Redux处理异步场景&lt;/li>
&lt;li>&lt;strong>不可变数据管理&lt;/strong>：状态更新的正确方式与常见误区&lt;/li>
&lt;li>&lt;strong>副作用处理&lt;/strong>：同步与异步操作在Flux架构中的合理位置&lt;/li>
&lt;/ol>
&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;p>Redux三原则 &amp;gt; 单向数据流 &amp;gt; 中间件机制 &amp;gt; 异步Action处理&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;strong>单一数据源&lt;/strong>：整个应用状态存储在唯一store对象中，配合combineReducers实现模块化状态管理（类比应用数据库）&lt;/li>
&lt;li>&lt;strong>纯函数Reducer&lt;/strong>：&lt;code>(prevState, action) =&amp;gt; newState&lt;/code> 的确定性转换，确保时间旅行调试可行性&lt;/li>
&lt;li>&lt;strong>中间件链&lt;/strong>：通过&lt;code>applyMiddleware&lt;/code>形成的函数组合管道，可拦截并处理action（类似安检通道的多级过滤）&lt;/li>
&lt;/ol>
&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;ol>
&lt;li>直接修改state副本导致引用未变更，视图不更新&lt;/li>
&lt;li>在Reducer中执行API调用等副作用操作&lt;/li>
&lt;li>混淆Action与Action Creator的界限&lt;/li>
&lt;/ol>
&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>Redux通过&lt;strong>单一store&lt;/strong>保证状态全局唯一，&lt;strong>纯函数Reducer&lt;/strong>确保状态变更可追溯。当调用&lt;code>dispatch(action)&lt;/code>时：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Action派发&lt;/strong>：Store将普通对象格式的action传递给中间件链&lt;/li>
&lt;li>&lt;strong>中间件处理&lt;/strong>：redux-thunk检测到函数类型action时，暂停默认派发流程，注入&lt;code>dispatch&lt;/code>和&lt;code>getState&lt;/code>参数执行异步逻辑&lt;/li>
&lt;li>&lt;strong>Reducer执行&lt;/strong>：经过所有中间件处理的action到达Reducer，生成新状态树&lt;/li>
&lt;li>&lt;strong>状态更新&lt;/strong>：Store用新状态替换旧状态，触发订阅者更新（如React的connect）&lt;/li>
&lt;/ol>
&lt;p>示例异步流程：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8329e80" class="language-javascript ">
 &lt;code>// Action Creator返回函数（需redux-thunk支持）
const fetchData = () =&amp;gt; (dispatch, getState) =&amp;gt; {
 dispatch({ type: &amp;#39;REQUEST_START&amp;#39; })
 fetchAPI.then(res =&amp;gt; {
 dispatch({ type: &amp;#39;REQUEST_SUCCESS&amp;#39;, payload: res })
 }).catch( dispatch({ type: &amp;#39;REQUEST_FAIL&amp;#39; })
}

// Reducer保持纯净
const reducer = (state = initState, { type, payload }) =&amp;gt; {
 switch(type) {
 case &amp;#39;REQUEST_START&amp;#39;: return { ...state, loading: true }
 case &amp;#39;REQUEST_SUCCESS&amp;#39;: return { ...state, data: payload }
 // 始终返回新对象
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&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="#%e7%bc%96%e7%a0%81%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="da7f3a9" class="language-javascript ">
 &lt;code>// 配置store
import { createStore, applyMiddleware } from &amp;#39;redux&amp;#39;;
import thunk from &amp;#39;redux-thunk&amp;#39;;

const store = createStore(
 rootReducer,
 applyMiddleware(thunk) // 启用异步支持
);

// 异步action
const login = (credentials) =&amp;gt; async (dispatch) =&amp;gt; {
 try {
 dispatch({ type: &amp;#39;LOGIN_START&amp;#39; });
 const user = await authService.login(credentials);
 dispatch({ type: &amp;#39;LOGIN_SUCCESS&amp;#39;, payload: user });
 } catch (error) {
 dispatch({ type: &amp;#39;LOGIN_FAILURE&amp;#39;, error });
 }
};

// 优化建议：使用redux-toolkit简化模板代码&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%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;ol>
&lt;li>&lt;strong>性能优化&lt;/strong>：使用reselect避免冗余计算&lt;/li>
&lt;li>&lt;strong>调试扩展&lt;/strong>：集成redux-devtools实现状态快照&lt;/li>
&lt;li>&lt;strong>异步增强&lt;/strong>：使用redux-saga处理复杂异步流&lt;/li>
&lt;/ol>
&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;strong>如何防止Reducer代码膨胀？&lt;/strong>
&lt;ul>
&lt;li>模块化Reducer后用combineReducers组合&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>redux-thunk与redux-saga的主要区别？&lt;/strong>
&lt;ul>
&lt;li>thunk用函数封装异步逻辑，saga用Generator处理复杂异步流&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>服务端渲染时需要注意什么？&lt;/strong>
&lt;ul>
&lt;li>为每个请求创建独立store实例&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol></description></item><item><title>React Hooks核心原理</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-13/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-13/</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>Hooks实现机制&lt;/strong>：理解闭包与链表在状态持久化中的关键作用&lt;/li>
&lt;li>&lt;strong>函数组件更新原理&lt;/strong>：掌握Hooks如何与React调度机制结合实现状态更新&lt;/li>
&lt;li>&lt;strong>设计模式对比&lt;/strong>：分析Hooks方案相较类组件生命周期的优势与实现差异&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>闭包在保持状态引用中的运用&lt;/li>
&lt;li>链表结构维护Hooks执行顺序的实现原理&lt;/li>
&lt;li>useEffect与生命周期方法的对应关系&lt;/li>
&lt;li>Hooks规则（如不可条件调用）的底层原因&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;p>闭包作用域 &amp;gt; 链表存储结构 &amp;gt; Fiber节点关联 &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;p>React通过&lt;strong>闭包&lt;/strong>捕获函数组件的执行上下文，每个Hook在组件Fiber节点中对应一个Hook对象形成&lt;strong>单向链表&lt;/strong>。组件首次渲染时构建链表，后续通过&lt;code>currentHook&lt;/code>指针按顺序访问。例如&lt;code>useState&lt;/code>的state值存储在对应Hook对象的&lt;code>memoizedState&lt;/code>属性中。&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="3d328a5" class="language-text ">
 &lt;code>Fiber节点
┌─────────────┐
| memoizedState → Hook (useState)
| ↓
| Hook (useEffect)
| ↓
| Hook (自定义Hook)
└─────────────┘&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>组件更新时通过&lt;code>Dispatcher&lt;/code>（类似仓库管理员）访问当前Hook对象，实现：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>状态持久化&lt;/strong>：闭包捕获当前渲染闭包的dispatch函数&lt;/li>
&lt;li>&lt;strong>状态隔离&lt;/strong>：不同组件实例对应独立Fiber节点&lt;/li>
&lt;li>&lt;strong>执行保障&lt;/strong>：严格顺序保证链表节点正确对应&lt;/li>
&lt;/ol>
&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;ol>
&lt;li>误以为Hooks直接使用闭包保存状态（实际存储在Fiber节点）&lt;/li>
&lt;li>认为useEffect等同于componentDidMount（实际执行时机在layout阶段之后）&lt;/li>
&lt;li>错误地在条件语句中使用Hooks（破坏链表顺序一致性）&lt;/li>
&lt;/ol>
&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>React Hooks通过闭包捕获当前渲染上下文，配合Fiber架构的链表结构实现状态持久化。具体机制：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>闭包封装&lt;/strong>：每个Hook闭包保存对应当前dispatch的引用，确保状态更新能触发正确渲染&lt;/li>
&lt;li>&lt;strong>链表存储&lt;/strong>：组件Fiber节点维护Hook对象链表，确保多次渲染时Hooks执行顺序严格一致&lt;/li>
&lt;li>&lt;strong>生命周期替代&lt;/strong>：
&lt;ul>
&lt;li>&lt;code>useEffect(()=&amp;gt;{}, [deps])&lt;/code> 通过依赖比对实现&lt;code>componentDidMount&lt;/code>/&lt;code>DidUpdate&lt;/code>的复合效果&lt;/li>
&lt;li>&lt;code>useLayoutEffect&lt;/code> 对应DOM更新同步执行场景&lt;/li>
&lt;li>自定义Hook实现逻辑复用，替代高阶组件模式&lt;/li>
&lt;/ul>
&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;div class="prism-codeblock ">
 &lt;pre id="6582f16" class="language-javascript ">
 &lt;code>// 模拟简化版useState实现
let currentHook = null; // 当前处理的Hook指针

function useState(initial) {
 const hook = {
 memoizedState: initial, // 实际存储值
 queue: [], // 更新队列
 next: null // 下一个Hook
 };

 // 链表连接
 if (!currentHook) {
 currentHook = hook;
 } else {
 currentHook.next = hook;
 currentHook = hook;
 }

 const dispatch = (action) =&amp;gt; {
 hook.queue.push(action);
 scheduleUpdate(); // 触发React调度更新
 };

 const state = hook.memoizedState;
 return [state, dispatch];
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>可扩展性优化&lt;/strong>：&lt;/p></description></item><item><title>常用Hooks使用场景</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-14/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-14/</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>Hooks核心机制理解&lt;/strong>：对React函数式组件状态管理与副作用处理机制的掌握程度&lt;/li>
&lt;li>&lt;strong>生命周期映射能力&lt;/strong>：将类组件生命周期概念转化为Hooks实现方案的能力&lt;/li>
&lt;li>&lt;strong>组件通信模式运用&lt;/strong>：理解跨层级组件通信的Context解决方案&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>useState的闭包特性与批量更新机制&lt;/li>
&lt;li>useEffect依赖数组的精确控制与清理函数必要性&lt;/li>
&lt;li>Context的Provider/Consumer模式与渲染优化陷阱&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;ol>
&lt;li>useEffect执行时机 &amp;gt; 2. 状态更新批处理 &amp;gt; 3. Context穿透更新&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>&lt;strong>useState&lt;/strong>：基于闭包的离散状态管理，通过队列机制实现异步批量更新。当调用setState时，新的状态值会被存储在组件对应的Fiber节点中，触发协调过程。&lt;/p>
&lt;p>&lt;strong>useEffect&lt;/strong>：基于调度器的异步执行策略，在浏览器完成布局绘制后执行副作用。清理函数遵循&amp;quot;先清理旧&amp;quot;原则，保证每次effect执行前清理上次副作用。&lt;/p>
&lt;p>&lt;strong>useContext&lt;/strong>：基于发布订阅模式的跨层级数据传递，当Provider的value变化时，所有消费组件强制重新渲染（可通过memo优化）。&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;ol>
&lt;li>在useEffect中遗漏依赖项导致闭包陷阱&lt;/li>
&lt;li>误用空依赖数组模拟componentDidMount，但后续无法获取状态更新&lt;/li>
&lt;li>未正确使用清理函数导致内存泄漏（如事件监听、定时器）&lt;/li>
&lt;/ol>
&lt;hr>
&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>&lt;strong>useState&lt;/strong>：管理组件内部状态，如表单输入值。示例：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="647b705" class="language-javascript ">
 &lt;code>const [count, setCount] = useState(0) // 计数器状态&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>useEffect&lt;/strong>：处理副作用与清理。典型场景：组件挂载时请求数据，卸载时取消请求：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="865f5ae" class="language-javascript ">
 &lt;code>useEffect(() =&amp;gt; {
 const controller = new AbortController()
 fetchData(controller.signal)
 return () =&amp;gt; controller.abort() // 清理函数取消请求
}, []) // 空依赖表示仅执行一次&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>useContext&lt;/strong>：实现主题切换等跨组件通信：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8b87d74" class="language-javascript ">
 &lt;code>const ThemeContext = createContext(&amp;#39;light&amp;#39;)
// 顶层组件
&amp;lt;ThemeContext.Provider value=&amp;#34;dark&amp;#34;&amp;gt;
 &amp;lt;ChildComponent/&amp;gt;
&amp;lt;/ThemeContext.Provider&amp;gt;
// 子组件
const theme = useContext(ThemeContext)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&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="#%e6%95%b0%e6%8d%ae%e8%af%b7%e6%b1%82%e5%ae%8c%e6%95%b4%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="50755e7" class="language-javascript ">
 &lt;code>function UserList() {
 const [data, setData] = useState([])
 const [loading, setLoading] = useState(false)

 useEffect(() =&amp;gt; {
 const controller = new AbortController()
 
 const fetchData = async () =&amp;gt; {
 try {
 setLoading(true)
 const res = await fetch(&amp;#39;/api/users&amp;#39;, { signal: controller.signal })
 setData(await res.json())
 } catch (e) {
 if (!e.name === &amp;#39;AbortError&amp;#39;) console.error(e)
 } finally {
 setLoading(false)
 }
 }

 fetchData()
 return () =&amp;gt; controller.abort()
 }, []) // 空依赖确保只执行一次

 return loading ? &amp;lt;Spinner/&amp;gt; : &amp;lt;List data={data}/&amp;gt;
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性优化">可扩展性优化 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e4%bc%98%e5%8c%96" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>请求失败处理：添加错误边界包裹组件&lt;/li>
&lt;li>节流请求：使用AbortController取消冗余请求&lt;/li>
&lt;li>低端设备优化：请求时降级展示骨架屏替代加载动画&lt;/li>
&lt;/ol>
&lt;hr>
&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>如何避免useContext导致的无效渲染？&lt;/strong>&lt;/p></description></item><item><title>Immutable.js在React中的作用</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-19/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-19/</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>React性能优化机制&lt;/strong>：掌握虚拟DOM Diff算法的工作原理及不可变数据结构的优化原理&lt;/li>
&lt;li>&lt;strong>状态管理规范&lt;/strong>：理解Redux架构中状态更新的约束条件及中间件适配方案&lt;/li>
&lt;li>&lt;strong>数据结构认知&lt;/strong>：区分可变(mutable)与不可变(immutable)数据结构的核心差异及应用场景&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点包括：&lt;/p>
&lt;ul>
&lt;li>Immutable.js的结构共享(Structural Sharing)原理&lt;/li>
&lt;li>虚拟DOM的引用比对优化机制&lt;/li>
&lt;li>combineReducers对状态变化的检测逻辑&lt;/li>
&lt;li>不可变数据在Redux reducer中的正确使用姿势&lt;/li>
&lt;li>状态树异构数据结构的管理规范&lt;/li>
&lt;/ul>
&lt;h1 id=""> &lt;a href="#" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h1>&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;p>不可变数据结构 &amp;gt; 结构共享 &amp;gt; React.memo优化 &amp;gt; Redux状态更新检测&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;p>Immutable.js通过&lt;strong>结构共享&lt;/strong>实现高效更新：当修改深层节点时，仅变更路径上的节点并创建新根节点，未修改分支保持引用不变。这种特性使得React在&lt;code>shouldComponentUpdate&lt;/code>阶段通过&lt;code>prevProps === nextProps&lt;/code>即可快速判断数据变更。&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="e9f67ec" class="language-text ">
 &lt;code>原始树 新树
 A A&amp;#39;
 / \ / \
 B C =&amp;gt; B&amp;#39; C
 \ \
 D D&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>在Redux中，&lt;code>combineReducers&lt;/code>默认通过严格相等判断(&lt;code>===&lt;/code>)检测子状态变更。当配合Immutable.js使用时：&lt;/p>
&lt;ol>
&lt;li>必须保证每个子reducer返回完整的Immutable对象&lt;/li>
&lt;li>根状态应该是Immutable.Map类型&lt;/li>
&lt;li>需要替换默认的combineReducers为支持Immutable的版本（如redux-immutable）&lt;/li>
&lt;/ol>
&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;ol>
&lt;li>混合使用普通对象与Immutable对象导致引用断裂&lt;/li>
&lt;li>在reducer中直接修改原状态（违反纯函数原则）&lt;/li>
&lt;li>错误配置导致combineReducers无法检测子状态变化&lt;/li>
&lt;/ol>
&lt;h1 id=""> &lt;a href="#" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h1>&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>Immutable.js通过结构共享生成新数据时保持未修改部分的引用，使React只需比对对象引用即可判断数据变化，避免昂贵的深层次比对。在Redux中需确保每个reducer返回完整Immutable对象，并使用专为Immutable设计的combineReducers实现，同时严格避免直接修改原状态树。&lt;/p>
&lt;h1 id=""> &lt;a href="#" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h1>&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="#%e7%bc%96%e7%a0%81%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="fa3925c" class="language-javascript ">
 &lt;code>// 使用redux-immutable的combineReducers
import { combineReducers } from &amp;#39;redux-immutable&amp;#39;;
import { Map } from &amp;#39;immutable&amp;#39;;

// 子reducer示例
const todoReducer = (state = Map(), action) =&amp;gt; {
 switch(action.type) {
 case &amp;#39;ADD&amp;#39;:
 // 正确方式：返回新对象
 return state.set(&amp;#39;items&amp;#39;, state.get(&amp;#39;items&amp;#39;).push(action.payload));
 default:
 return state; // 保持Immutable类型
 }
};

// 组合reducer时保证根状态为Immutable结构
const rootReducer = combineReducers({
 todos: todoReducer
});&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%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;ol>
&lt;li>&lt;strong>性能敏感场景&lt;/strong>：对超过10层嵌套的数据使用fromJS转换时启用reviver函数&lt;/li>
&lt;li>&lt;strong>类型混合场景&lt;/strong>：使用Immutable.Record定义强类型结构&lt;/li>
&lt;li>&lt;strong>兼容性需求&lt;/strong>：通过toJS()在组件边界进行数据转换，但需注意性能损耗&lt;/li>
&lt;/ol>
&lt;h1 id=""> &lt;a href="#" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h1>&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;h3 id="如何检测immutable数据变化">如何检测Immutable数据变化？ &lt;a href="#%e5%a6%82%e4%bd%95%e6%a3%80%e6%b5%8bimmutable%e6%95%b0%e6%8d%ae%e5%8f%98%e5%8c%96" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>通过Immutable.is()进行值相等性检查，避免深层对象比对开销&lt;/p></description></item><item><title>Redux状态持久化方案</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-26/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-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>：评估对Redux生态工具的掌握程度，能否通过中间件增强状态持久化能力&lt;/li>
&lt;li>&lt;strong>浏览器存储机制理解&lt;/strong>：区分LocalStorage/SessionStorage的适用场景及技术边界&lt;/li>
&lt;li>&lt;strong>数据序列化认知&lt;/strong>：考察对JSON序列化局限性的应对方案，包括特殊数据类型处理与版本控制&lt;/li>
&lt;/ol>
&lt;p>具体评估点：&lt;/p>
&lt;ul>
&lt;li>Redux-persist核心配置流程&lt;/li>
&lt;li>存储引擎适配层实现原理&lt;/li>
&lt;li>非标准JSON数据转换策略&lt;/li>
&lt;li>持久化数据生命周期管理&lt;/li>
&lt;li>浏览器存储配额与性能优化&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" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Redux-persist &amp;gt; Storage引擎适配 &amp;gt; 数据变换流水线 &amp;gt; 状态水合(Hydration)&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;/p>
&lt;ul>
&lt;li>&lt;strong>持久化&lt;/strong>：通过store订阅机制监听状态变化，通过&lt;code>storage&lt;/code>引擎异步写入&lt;/li>
&lt;li>&lt;strong>恢复&lt;/strong>：应用启动时通过&lt;code>REHYDRATE&lt;/code>动作分片加载持久化数据&lt;/li>
&lt;li>&lt;strong>水合机制&lt;/strong>：将磁盘数据安全注入Redux store的过程，需处理异步加载与状态合并&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>存储引擎适配&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="7e675f6" class="language-javascript ">
 &lt;code>import { createSyncStorage } from &amp;#39;redux-persist/lib/storage/sync&amp;#39; // 内存同步存储
import { getStorage } from &amp;#39;storage-module&amp;#39; // 自定义存储引擎&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>库通过抽象Storage接口（&lt;code>getItem&lt;/code>/&lt;code>setItem&lt;/code>）兼容多种后端，包括AsyncStorage、LocalForage等&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>数据转换&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>使用&lt;code>Transform&lt;/code>插件链式处理数据（加密/压缩/类型转换）&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="5ff4fff" class="language-javascript ">
 &lt;code>const dateTransform = createTransform(
 (state) =&amp;gt; JSON.stringify(state),
 (raw) =&amp;gt; ({...JSON.parse(raw), date: new Date()})
)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>常见误区&lt;/strong>：&lt;/p></description></item></channel></rss>