# Passing signals through dumb components
```typescript=
import { component$, useStore, QRL } from "@builder.io/qwik";
export const App = component$(() => {
const store1 = useStore({ count: 0 });
const store2 = useStore({ count: 0 });
return (
<button onClick$={() => store1.count++}>
// PROBLEM: Root should always re-render
// because we don't know that `store` is constant
<CountStore store={Math.random() > 0.5 ? store1 : store2} />
<CountStore store{store1} />
<PassThrough value$={() => store1.count + 1} />
</button>
);
});
export const PassThrough = component$(
(props: { valueQrl?: QRL<() => number> }) => {
return <CountRef valueQrl={props.valueQrl} />;
}
);
export const CountStore = component$((props: { store: { count: number } }) => {
useTrack(props, 'store');
return <span>{props.store.count}</span>;
});
export const CountRef = component$(
(props: { store?: { count: number }; valueQrl?: QRL<() => number> }) => {
return <span>{props.valueQrl?.invoke()}</span>;
}
);
```
Options:
- *mutable*: you must always re-render the template because there is just no way of knowing if re-rendering will produce the same values.
- *marking mutable*: If marked than same as above.
- *passing signals*:
- SolidJS can cheat because it can create getters (which are not serializable) We can explore what would it mean to make getters serializable.
- *immutable*: all component props are always immutable! Must pass stores or QRL for computed values.
# Solutions Space
- The callee of the component (not the component itself) knows if a binding is constant or not and should be the one determining it through syntax.
- All bindings are `const` by default
- A binding can become `var` through marker
```typescript=
<ChildComponent title={mutable(expr)}/>
```