Q1: 如何替代React Context?
// React Context 方案
const ThemeContext = createContext('light')
function App() {
return (
<ThemeContext.Provider value="dark">
<Child />
</ThemeContext.Provider>
)
}
// SolidJS Context 方案
const ThemeContext = createContext('light')
function App() {
ThemeContext.Provider({ value: 'dark', children: <Child /> })
}
function Child() {
const theme = useContext(ThemeContext)
return <div>{theme}</div>
}
核心差异:
无需在组件树中包裹Provider组件
支持多级Context覆盖(类似React的行为)
Context值本身可以是响应式Signal
Q2: 是否需要手动优化memoization?
不需要! SolidJS的响应式系统已内置优化:
// ✅ 自动优化示例
const FullName = () => {
const user = useUserStore()
return <div>{user.firstName + ' ' + user.lastName}</div>
}
优化原理:
仅当
firstName
或lastName
变化时才会更新其他user属性修改不会触发重新渲染
组件函数本身不会重复执行
Q3: 如何处理第三方React组件库?
迁移策略:
直接替代方案:
@mui/material → @suid/material
react-spring → @solid-spring/core
包装方案(针对无替代库):
function ReactWrapper(props) {
const [el, setEl] = createSignal(null)
onMount(() => {
// 使用ReactDOM渲染React组件
ReactDOM.render(<ReactComp {...props} />, el())
})
onCleanup(() => ReactDOM.unmountComponentAtNode(el()))
return <div ref={setEl} />
}
Q4: 为什么组件函数只执行一次?
执行机制解析:
function Counter() {
const [count, setCount] = createSignal(0)
console.log('初始化执行') // 只打印一次
// JSX闭包捕获响应式关系
return <button onClick={() => setCount(count()+1)}>
{count()} // 每次点击仅更新文本节点
</button>
}
优势:
避免重复创建组件内部闭包
DOM节点保持稳定(无需
key
强制刷新)天然防内存泄漏设计
Q5: 如何处理表单双向绑定?
推荐方案:
// 基础实现
const [form, setForm] = createStore({
name: '',
email: ''
})
<input
type="text"
value={form.name}
onInput={(e) => setForm('name', e.target.value)}
/>
// 高阶封装(类似Vue v-model)
function ModelInput(props) {
return <input
value={props.model[0]()}
onInput={e => props.model[1](e.target.value)}
/>
}
// 使用示例
<ModelInput model={createSignal('')} />
Q6: 如何调试响应式依赖?
开发工具链:
Chrome扩展:
查看组件依赖图谱
追踪Signal更新路径
调试API:
import { debug } from 'solid-js'
const [count] = createSignal(0, { name: 'counter' })
debug(count) // 控制台输出依赖关系
性能分析:
import { startBenchmark, endBenchmark } from 'solid-js/bench'
startBenchmark('todoUpdate')
// 执行操作...
endBenchmark('todoUpdate') // 输出详细耗时
Q7: 如何实现组件懒加载?
// React.lazy 方案
const LazyComp = lazy(() => import('./HeavyComponent'))
// SolidJS方案
const LazyComp = lazy(() => import('./HeavyComponent'))
function App() {
return (
<Suspense fallback={<Loading />}>
<LazyComp />
</Suspense>
)
}
关键差异:
SolidJS的
lazy
支持SSRSuspense
边界可嵌套使用错误边界自动捕获加载异常
Q8: 测试策略有何不同?
测试重点转移:
// React典型测试(渲染次数断言)
test('按钮点击更新状态', () => {
render(<Counter />)
fireEvent.click(screen.getByRole('button'))
expect(screen.getByText('1')).toBeInTheDocument()
})
// SolidJS测试(DOM更新精准断言)
test('信号更新触发DOM变化', () => {
const [count, setCount] = createSignal(0)
render(() => <div>{count()}</div>)
expect(screen.getByText('0')).toBeInTheDocument()
setCount(1) // 直接触发DOM更新
expect(screen.getByText('1')).toBeInTheDocument()
})
推荐工具:
@solidjs/testing-library
vitest
+@solidjs/ssr
测试SSR场景cypress-component
组件E2E测试
Q9: 如何实现动画效果?
推荐方案对比:
// 使用solid-spring示例
import { useSpring } from '@solid-spring/core'
function AnimatedBox() {
const props = useSpring({
from: { opacity: 0 },
to: { opacity: 1 }
})
return <div style={props()}>Hello Animation</div>
}
Q10: 如何选择状态管理方案?
决策树:
是否需要全局共享?
├─ 否 → createSignal/createStore
└─ 是 → 选择层级:
├─ 组件树层级 → Context API
├─ 应用全局状态 → Solid Stores
└─ 需要DevTools → 集成Valtio/Zustand
状态共享模式对比:
// 跨组件通信方案
const [store, setStore] = createStore({ data: null })
// 响应式事件总线
const [bus, setBus] = createSignal()
// 类Redux模式
createRoot(() => {
// 独立Store作用域
})
✅ 迁移自查清单:
已替换所有条件渲染为
<Show>
/<Switch>
验证所有动态属性使用函数形式(
class={getClass()}
)已安装
eslint-plugin-solid
并修复所有警告使用
<For>
重构列表渲染并移除手动key
测试覆盖率包含响应式更新路径