🔧 开发问题
Q: 为什么 Signal 值不更新?
A: 检查是否正确调用 Signal:
jsx
// ❌ 错误 - 不会建立依赖
const value = count;
<p>{value}</p>
// ✅ 正确 - 建立依赖
<p>{count()}</p>
Q: Effect 不执行?
A: 确保在 Effect 中访问了 Signal:
javascript
// ❌ 错误 - 没有依赖
createEffect(() => {
console.log('No dependency');
});
// ✅ 正确 - 有依赖
createEffect(() => {
console.log(count()); // 追踪 count
});
Q: 如何处理异步操作?
A: 使用 createResource:
javascript
const [data] = createResource(async () => {
const res = await fetch('/api/data');
return res.json();
});
🔄 React 迁移
Q: useState 替代方案?
javascript
// React
const [count, setCount] = useState(0);
// SolidJS
const [count, setCount] = createSignal(0);
Q: useEffect 替代方案?
javascript
// React
useEffect(() => {
console.log(count);
}, [count]);
// SolidJS
createEffect(() => {
console.log(count());
});
Q: useMemo 替代方案?
javascript
// React
const double = useMemo(() => count * 2, [count]);
// SolidJS
const double = createMemo(() => count() * 2);
⚠️ 常见陷阱
1. 解构 Signal 失去响应性
javascript
// ❌ 错误
const { value } = props;
<p>{value}</p>
// ✅ 正确
<p>{props.value}</p>
2. 条件分支改变依赖
javascript
createEffect(() => {
if (condition()) {
console.log(a()); // 条件依赖
}
});
// condition 变化会改变依赖图
3. 在渲染函数外访问 Signal
javascript
// ❌ 错误 - 没有响应式上下文
const value = count();
console.log(value);
// ✅ 正确 - 在 Effect 中
createEffect(() => {
console.log(count());
});