8개의 경량급 VanillaJS 웹 구성 요소를 사용하여 이벤트 구동 TodoMVC 응용 프로그램 구축

데모


먼저 TodoMVC 애플리케이션을 사용해 무엇을 할 수 있는지 알아보십시오.https://mits-gossau.github.io/event-driven-web-components-todomvc-app/src/
브라우저 호환성에 대한 고려 사항: 이 예에서는 IOS가 지원되지 않는 경우attribute "is"를 사용합니다.웹 구성 요소 포장 요소를 사용하면 이 문제를 간단하게 피할 수 있습니다.우리 사이트Real World Example에서 볼 수 있습니다.

HTML 개요


todomvc 응용 프로그램 템플릿부터 HTML:https://github.com/tastejs/todomvc-app-template/blob/master/index.html#attr-is 표시가 있는 확장 HTML:https://github.com/mits-gossau/event-driven-web-components-todomvc-app/blob/master/src/index.html를 살펴보고 어떤 요소가 논리를 가지고 있는지 알아보자.
  • "input. new todo"필드는 프로그램의 맨 위에 있고 이벤트 new todo를 보냅니다. 이 이벤트는 새로운 todo 항목을 만드는 값을 가지고 있습니다.
  • "section.main"은 "input.toggle all"과 "ul.todo list"를 포함하고 항목이 없으면 숨겨야 합니다.숨김과 표시 사이를 전환할 수 있도록 모든 항목을 정탐합니다.
  • "input.toggle all"는 "input.new todo"왼쪽에서 아래로 향하는 화살표입니다.전체 전환 이벤트를 실행하여 모든 항목을 선택 또는 선택 해제(완료 또는 미완료)로 전환합니다.또한 이벤트 '모든 항목' 을 정탐하여 자신을 선택하거나 선택하지 않은 것으로 전환합니다.
  • "ul 대기사항 목록"은 모든 대기사항을 포함한다.항목의 이벤트인 편집, 전환, 제거를 수신합니다.또한 new todo(Todo Item.js를 로드하고 하위 항목으로 추가), toggle all,clear completed 등의 이벤트도 살펴봅니다.상황이 바뀌면 '모든 항목' 이벤트를 보내고 로컬 저장소에 저장합니다.
  • "footer.footer"는 항목 2와 같은 웹 구성 요소를 계승합니다.섹션.main 은 입니다.항목이 없으면 숨겨야 합니다.숨김과 표시 사이를 전환할 수 있도록 모든 항목을 정탐합니다.
  • "span.todo count"은 사건의 모든 항목을 감청하고 해당하는 계수를 한다.
  • "ul.filters"는 전역hashchange 이벤트를 정탐하고 선택한 클래스를 전환합니다.
  • "button.clear completed"는 이벤트clear completed를 보내고 전환할 모든 항목을 탐색합니다. (숨기거나 보일 경우)
  • 위의 목록은 8개의 웹 구성 요소 중 7개(요소 2.와 5. 같은 웹 구성 요소를 공유)를 대체적으로 기술했다.여덟 번째 웹 구성 요소는 TodoItem입니다.js.이것은 "ul.todo list"에서 만들고, 이벤트를 탐색하여 all와 전역hashchange로 전환합니다.이것은 전환, 삭제, 편집을 보냅니다. (편집은 새로운 todo 웹 구성 요소를 다시 사용하고 todo item 웹 구성 요소를 통해 기포를 생성합니다.)

    웹 구성 요소 로드



    웹 구성 요소를 불러오는 것은 상당히 간단합니다.
    import('./es/components/TodoList.js').then(module => ['todo-list', module.default, { extends: 'ul' }])
    
    JavaScript 파일을 가져옵니다.그리고 모듈러 대상을 받을 것입니다. 이 대상에서 모듈러 클래스를 찾을 수 있습니다.기본값으로 내보낼 때마다 기본값으로 내보냅니다.
    export default class TodoList extends HTMLUListElement {
    
    노드 태그 이름 #attr-is 의 용례에 대해 옵션을 추가해서 DOM이 어떤 HTML Element을 확장해야 하는지 알려 줍니다.이 옵션은 클래스 extends HtmleElement과 일치해야 합니다.모든 수입 상품은 약속으로 포장할 수 있다.그리고 우리는 그것을 향해 던졌다customElements.define.현재, 우리의 일곱 개의 노드는 웹 구성 요소 클래스와 연결되어 있습니다.TodoItem.js는 필요할 때TodoList.js에 불러옵니다. 예를 들어 실제 항목/항목이 있습니다.

    이벤트 구동


    이벤트 구동 시스템 구조는 이러한 웹 구성 요소가 이벤트를 통해만 통신하는 것을 의미한다.TodoList.js를 불러오고 값을 구조 함수에 전달할 때 TodoItem.js에서 두 가지 이상만 발견됩니다.
    this.appendChild(new TodoItem(event.detail.value))
    
    그리고 TodoItem.js 자체로 입력 필드를 편집할 때 NewTodo.js 불러옵니다.그런 다음 일부 속성을 웹 구성 요소에 전달합니다.
    <input class="edit" value="${this.value}" is="new-todo" new-todo="edit" allow-empty allow-escape>
    
    사건의 묘미는 다음과 같습니다.
  • 구성 요소는 독립적입니다
  • .
  • connectedCallback
  • 에서 그들이 들은 내용에 대한 상세한 개술을 찾을 수 있다
  • FireFox 개발 도구를 사용하면 이벤트 탐지기를 검사할 수 있습니다
  • 웹 구성 요소 다시 사용하기
  • 대규모 아키텍처로 확장
  • 자체DOM와 동일한 아키텍처 사용
  • 의존항/프레임 필요 없음=> 순수 표준
  • 사용 편이성
  • 상태 관리 노후화
  • 초고속, 초경량
  • 각 웹 구성 요소에 대한 개요


    1. "input. new todo"는 New Todo를 받습니다.js가 그것에 적용됩니다.


    connectedCallback () {
      this.addEventListener('blur', this.valueListener)
      this.addEventListener('keyup', this.valueListener)
    }
    
    이 구성 요소에 포함된 모든 논리는valueListener에 있습니다. 기본적으로 몇 개의 로고가 있고, 일부 로고는 수신 속성을 결정하며, 이벤트 'new todo' 를 언제 보낼지 결정합니다.'new todo' 이벤트는 'new todo' 라는 속성을 전달해서 이름을 바꾸고 TodoItem.js 에서 사용할 수 있으며, 'new todo' 대신 이벤트 'edit' 를 보낼 수 있습니다.

    2. "section.main"은 제한되지 않습니다.js가 그것에 적용됩니다.


    connectedCallback () {
      self.addEventListener('all-items', this.allItemsListener)
    }
    
    allItemsListener는 이 웹 구성 요소의 논리를 저장합니다.allItemsListener 이벤트가 발생하면 hide=true가 표시됩니다.세부 사항.프로젝트길이가 너무 길어요.

    3. "input.toggle all" Toggall에 들어갑니다.js가 그것에 적용됩니다.


    connectedCallback () {
      this.addEventListener('click', this.clickListener)
      self.addEventListener('all-items', this.allItemsListener)
    }
    
    클릭 리스트는 클릭 중인 입력 확인란을 탐색하고 부울 값 checked as 이벤트가 있는 이벤트 "toggle all"을 보냅니다.세부 사항.또한 allItemsListener와 함께 "모든 프로젝트"이벤트를 청취합니다.그곳에서, 그것은 여전히 검사를 하고 있는지 여부를 결정한다.

    4. "ul 대기사항 목록"은 대기사항 목록이 됩니다.js가 그것에 적용됩니다.


    connectedCallback () {
      this.addEventListener('edit', this.updateListener)
      this.addEventListener('toggle', this.updateListener)
      this.addEventListener('destroy', this.updateListener)
      self.addEventListener('new-todo', this.newTodoListener)
      self.addEventListener('toggle-all', this.toggleAllListener)
      self.addEventListener('clear-completed', this.clearCompletedListener)
      this.loadAllItems().then(() => this.dispatchAllItems())
    }
    
    보내기 및 편집 구성 요소의 보내기 및 삭제 구성 요소의 보내기 구성 요소는 보내기 및 삭제 구성 요소의 삭제 이벤트에 의해 삭제됩니다."toggle all"과 "clear completed"에서 같은 것을 실행하고 추가 논리를 추가합니다.그것 또한 '새로운 대기 사항' 을 위해 새로운 child 을 만들었다.업데이트 관리자에서 변경 사항은local Storage에 저장되며, 이것은connected Callback에 저장됩니다.물건을 싣다.

    오늘 오후가 좋아요.js 5. "경계 대기 사항 계수"는 대기 사항을 획득한다.js가 그것에 적용됩니다.


    connectedCallback () {
      self.addEventListener('all-items', this.allItemsListener)
    }
    
    이것은 이벤트 'all items' 를 정탐하고, 최신 계수에 따라 inner HTML을 업데이트합니다.

    6. "ul 필터"가 삭제됩니다.js가 그것에 적용됩니다.


    connectedCallback () {
      self.addEventListener('hashchange', this.hashchangeListener)
      this.hashchangeListener()
    }
    
    전역 "hashchange"이벤트를 탐색하고 선택한 CSS를 전역 루트에 따라 업데이트합니다.

    7. "button.clear completed(버튼 지우기 완료)"에서 ToDoFilter(필터)를 가져옵니다.js가 그것에 적용됩니다.


    connectedCallback () {
      this.addEventListener('click', this.clickListener)
      self.addEventListener('all-items', this.allItemsListener)
    }
    
    클릭한 버튼을 검색하고 이벤트 "clear completed"를 보냅니다.또한 allItemsListener와 함께 "모든 프로젝트"이벤트를 청취합니다.거기서 숨길지 표시할지 결정합니다.

    8. 정리 작업이 완료되었습니다.js 통과 loadAllItems가 localStorage에서 로드되거나 new todo 이벤트에서 로드될 때


    connectedCallback () {
      if (this.shouldComponentRender()) this.render()
      this.hashchangeListener()
      this.addEventListener('input', this.inputListener)
      this.addEventListener('click', this.clickListener)
      this.addEventListener('dblclick', this.dblclickListener)
      this.addEventListener('edit', this.editListener)
      self.addEventListener('toggle-all', this.toggleAllListener)
      self.addEventListener('hashchange', this.hashchangeListener)
    }
    
    이벤트 입력 이 확인란에 적용되고 선택한 이벤트 전환 이 할당됩니다.'클릭' 이벤트는 '삭제' 단추에 적용되고 '삭제' 이벤트를 보냅니다.이벤트'dblclick'설정 클래스 편집.이벤트'편집'이 스케줄링되고 TodoItem.js 입력 필드TodoList.js를 통해 거품이 발생합니다.editListener에서 새 값을 적용합니다.이벤트 "toggle all"(모두 전환)는 자신을 선택하거나 선택하지 않은 것으로 설정합니다.전역 이벤트 "hashchange"는 이 업무를 숨기거나 표시할지 여부를 결정합니다.hashchange Listener 자체의 선택 상태가 변경될 때,connected Callback과 input Listener에서 터치합니다.

    아이. ShadowDOM 및 캡슐화된 CSS


    너는 반드시 이 용어NewTodo.js를 만났을 것이다. 이것은 CSS를 봉인하는 가장 좋은 기능이다.TodoMVC 응용 프로그램 템플릿은 전역 CSS를 제공합니다.이러한 정신에 따라 CSS를 분해하여 웹 구성 요소에 봉인하는 것은 무의미하다.예를 들어 다음과 같은 기능을 사용했습니다.
  • ShadowDOM
  • 이것은 의심할 여지없이 모든 다른 방법과 구별되는 부분이다. 이 새로운 환경에서 CSS를 어떻게 새로 처리하는지 단독으로 글을 한 편 쓸 만하다.

    https://github.com/mits-gossau/web-components 결론


    나는 본고가 https://github.com/mits-gossau/web-components-cms-template와 그것을 어떻게 구축하는지 개술하기를 바란다.나는 이벤트 구동의 체계 구조가 모든 전단 창고/응용 프로그램의 미래라고 믿는다. 그리고 이것은 일반적으로 일부 프레임워크 논리적인 프레임워크에서 응용되고 있다. 만약 당신이 DOM에 몰입하는 방법을 배운다면 이것은 쓸데없는 것일 수도 있다.

    관련 비디오 자습서


    https://github.com/mits-gossau/event-driven-web-components-todomvc-app

    좋은 웹페이지 즐겨찾기