[Cycle.js] Making our toy DOM Driver more flexible

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Cycle.js] Making our toy DOM Driver more flexible相关的知识,希望对你有一定的参考价值。

Our previous toy DOM Driver is still primitive. We are only able to sends strings as the textContent of the container element. We cannot yet create headers and inputs and all sorts of fancy DOM elements. In this lesson we will see how to send objects that describe what elements should exist, instead of strings as the DOM sink.

 

// Logic (functional)
function main(sources) {
  const click$ = sources.DOM;
  const sinks = {
    DOM: click$
      .startWith(null)
      .flatMapLatest(() => 
        Rx.Observable.timer(0, 1000)
         //describe what element should exist
         .map(i => {
            return {
              tagName: ‘h1‘,
              children: [
                {
                  tagName: ‘span‘,
                  children: [
                    `time esplsed: ${i}`
                  ]
                }
              ] 
            }
         })           
      ),
    Log: Rx.Observable.timer(0, 2000).map(i => 2*i),
  };
  return sinks;
}





// source: input (read) effects
// sink: output (write) effects

// Effects (imperative)
function DOMDriver(obj$) {
  
  function createElement(obj) {
    const element = document.createElement(obj.tagName);
    obj.children
      .filter(c => typeof c === ‘object‘)
      // if it is object, then we need to create another element
      .map(createElement)
      .forEach(c => element.appendChild(c));
    
    obj.children
      .filter(c => typeof c === ‘string‘)
      .forEach(c => element.innerhtml += c);
    return element;
  }
  
  obj$.subscribe(obj => {
    const container = document.querySelector(‘#app‘);
    container.innerHTML = ‘‘;
    const element = createElement(obj);
    container.appendChild(element);
  });
  
  const DOMSource = Rx.Observable.fromEvent(document, ‘click‘);
  return DOMSource;
}

function consoleLogDriver(msg$) {
  msg$.subscribe(msg => console.log(msg));
}

const drivers = {
  DOM: DOMDriver,
  Log: consoleLogDriver,
}

Cycle.run(main, drivers);

  

 

以上是关于[Cycle.js] Making our toy DOM Driver more flexible的主要内容,如果未能解决你的问题,请参考以下文章

[Cycle.js] Hello World in Cycle.js

[Cycle.js] The Cycle.js principle: separating logic from effects

学习RxJS:Cycle.js

学习RxJS:Cycle.js

替换 cycle2.js 中的 <img> 标签

在 Cycle.js 中呈现所有 dom 后运行 js 代码