本記事は、自分向けに書いたCycle.jsの備忘録です。他の人が読んで†圧倒的成長†ができるようなものにはしていません。ただ、全くの初心者が勉強しながら悩んだことなどを箇条書きで記しているので、もしかしたら初学者の手助けになるかもしれません。また、どんどん追記していく予定です。
makeDOMdriverって何
function main(sources) { return sinks; } const drivers = { DOM: makeDOMDriver('#app-container'), }; run(main, drivers);
みたいな感じでrun
に投げると、引数のdriversに渡したidとかclass(ここでは、'#app-container'
)に対応する<div>
内に操作できるコンテナ?とDriver
を作ってくれる。
ちなみに、#hoge
でidを、.fuga
でclassを表す。
sourcesとかsinks
sources
とかsinks
の型は、
type Request = { url: string, categoly: string, method: string } type Sources = { DOM: DOMSource, HTTP: HTTPSource } type Sinks = { DOM: Stream<VNode>, HTTP: Stream<Request> }
みたいな感じで定義できる。
DOMSource
は、.select(
#id.class')`でどのコンポーネントについて値を受け取るのか選べる。
http通信を扱う
import HTTPSource from @cycle/http
で良いいらしい。
sources.HTTP.select('category').flattten().map(res => ...)
みたいに、flatten
で受け取ったレスポンスをならしてやる必要があるらしい。
drivers、Sink、Sourcesの話
Sinks
とdrivers
の型は一致している必要があるっぽい(それはそう)。Sinks
(drivers
)に好きなStream
をぶち込むと、それはDriver
に渡った後戻ってくる。すなわち、sources
として受け取ることができる。
inputについて
`input(`.class`, {attrs: { type: 'range'}});
のように、attrs
プロパティでinput
を指定できる。値を取り出したいときは、
const value$: Stream<number> = input$ .map((ev: Event) => parseInt((ev.target as HTMLInputElement).value));
みたいな感じでやれるが、value
自体はどうやらstring
らしく、number
として取り出すにはparseInt
とかが必要っぽい。
後、'range'
(slider)の場合はstartWith(DEFAULT_VALUE)
で初期値を与えてやらないと表示されない。
combineについて
Stream.combine(a$,b$)
とすると、a$
とb$
のそれぞれをリストの組みとする新しい配列が返る。つまり、combineしたものから値を取り出すには、Stream.combine(a$,b$).map(([a,b]) => {})
とすれば良い。