zoukankan      html  css  js  c++  java
  • [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);
    
      
  • 相关阅读:
    算法:归并排序
    算法:希尔排序
    算法:插入排序
    算法:冒泡排序
    算法:选择排序
    jQuery
    (二)多线程之开启线程的两种方式
    (一)多线程之线程理论
    (四)多进程之队列与生产者消费者模型
    (三)多进程之守护进程与互斥锁
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5185665.html
Copyright © 2011-2022 走看看