🧩 基本组件

jsx
// 函数组件
function Greeting(props) {
  return <h1>Hello, {props.name}!</h1>;
}

// 使用
<Greeting name="World" />

💡 与 React 的区别

  • 组件只执行一次(无重渲染)
  • Props 是响应式的(函数形式)
  • 无 useEffect、useState 等

📋 Props

jsx
import { splitProps } from 'solid-js';

function Button(props) {
  // 分离属性
  const [local, others] = splitProps(props, ['class', 'children']);
  
  return (
    <button 
      class={`btn ${local.class || ''}`}
      {...others}
    >
      {local.children}
    </button>
  );
}

// 使用
<Button class="primary" onClick={handleClick}>
  Click me
</Button>

默认 Props

jsx
function Card(props) {
  return (
    <div class="card">
      <h2>{props.title || 'Untitled'}</h2>
      <p>{props.description}</p>
    </div>
  );
}

// 或者使用 mergeProps
import { mergeProps } from 'solid-js';

function Card(props) {
  const merged = mergeProps({ title: 'Untitled' }, props);
  return <h2>{merged.title}</h2>;
}

🔄 控制流

Show - 条件渲染

jsx
import { Show } from 'solid-js';

function Profile({ user }) {
  return (
    <div>
      <Show 
        when={user()} 
        fallback={<p>Loading...</p>}
      >
        {(userData) => (
          <h1>Hello, {userData.name}!</h1>
        )}
      </Show>
    </div>
  );
}

For - 列表渲染

jsx
import { For } from 'solid-js';

function TodoList({ todos }) {
  return (
    <ul>
      <For each={todos()}>
        {(todo, index) => (
          <li>
            {index()}. {todo.text}
            <button onClick={() => remove(todo.id)}>
              Delete
            </button>
          </li>
        )}
      </For>
    </ul>
  );
}

Switch/Match - 多条件

jsx
import { Switch, Match } from 'solid-js';

function Status({ status }) {
  return (
    <Switch fallback={<p>Unknown status</p>}>
      <Match when={status() === 'loading'}>
        <p>Loading...</p>
      </Match>
      <Match when={status() === 'error'}>
        <p>Error!</p>
      </Match>
      <Match when={status() === 'success'}>
        <p>Success!</p>
      </Match>
    </Switch>
  );
}

⏳ 生命周期

SolidJS 没有 React 的生命周期方法,使用 onMount 和 onCleanup:

jsx
import { onMount, onCleanup } from 'solid-js';

function Timer() {
  let interval;
  
  onMount(() => {
    console.log('Component mounted');
    interval = setInterval(() => {
      console.log('Tick');
    }, 1000);
  });
  
  onCleanup(() => {
    console.log('Component unmounted');
    clearInterval(interval);
  });
  
  return <div>Timer running...</div>;
}

🎭 Portal

jsx
import { Portal } from 'solid-js/web';

function Modal(props) {
  return (
    <Portal mount={document.getElementById('modal-root')}>
      <div class="modal-overlay">
        <div class="modal-content">
          {props.children}
        </div>
      </div>
    </Portal>
  );
}

⚠️ Error Boundary

jsx
import { ErrorBoundary } from 'solid-js';

function App() {
  return (
    <ErrorBoundary 
      fallback={(err, reset) => (
        <div>
          <p>Error: {err.message}</p>
          <button onClick={reset}>Retry</button>
        </div>
      )}
    >
      <MyComponent />
    </ErrorBoundary>
  );
}