새로운 웹 컴포넌트 프레임워크를 사용하는 Todo 앱

Tatva.js을 사용하여 만든 데모 앱. Tatva는 빌드 단계가 필요 없는 웹 구성 요소 프레임워크입니다. 가상 돔의 작은 구현을 사용합니다.

Stencil.js와 어떻게 다른가요?


  • 빌드 단계가 필요하지 않습니다. CDN에서 직접 프레임워크를 로드합니다.
  • JSX를 사용하지 않습니다. 대신 하이퍼스크립트 기능을 사용합니다.
  • 비표준 데코레이터를 사용하지 않습니다. 순수한 Javascript로 웹 구성 요소를 작성합니다.

  • 다른 프레임워크와의 유사점


  • React와 유사하지만 웹 구성 요소와 같은 방식으로 수명 주기 이벤트를 사용합니다. componentDidMountcomponentDidUnmount 대신 componentDidConnectcomponentDidDisconnect 를 사용하십시오.
  • 가상 DOM 사용
  • 상태 관리는 React 클래스 구성 요소와 유사합니다
  • .
  • 구성 요소에 설정된 속성을 자동으로 변환하기 위한 최소 PropTypes 구현입니다.

  • 독특한 기능


  • Tatva는 자체 구현 대신 웹 구성 요소 API를 사용하여 소품 및 수명 주기 이벤트를 처리합니다. 가상 DOM을 이미 존재하는 Web Component API와 결합할 뿐입니다.
  • 속성이 변경될 때 구성 요소를 업데이트하려면 속성 이름을 observedAttributes 목록에 넣기만 하면 됩니다.

  • Todo 앱 데모




    import { Component, h, text } from "https://unpkg.com/tatva@latest";
    
    class TodoApp extends Component {
    
        state = {
            todo: '',
            todos: []
        }
    
        setTodo(e) {
            this.setState(state => ({
                ...state,
                todo: e.target.value
            }))
        }
    
        addTodo(id, todo) {
            this.setState(state => ({ 
                ...state, 
                todos: [...this.state.todos, { id, todo }],
                todo: ''
            }))
        }
    
        removeTodo(todoId) {
            this.setState(state => ({
                ...state,
                todos: this.state.todos.filter(({ id }) => id !== todoId)
            }));
        }
    
        handleFormSubmit(e) {
            e.preventDefault();
    
            this.addTodo(crypto.randomUUID(), this.state.todo);
        }
    
        render() {
            return (
                h('main', {},
                    h('form', { onsubmit: e => this.handleFormSubmit(e) },
                        h('input', {
                            oninput: e => this.setTodo(e),
                            placeholder: 'Enter Todo',
                            value: this.state.todo
                        })
                    ),
                    !this.state.todos.length
                        ? h('p', {}, text('No Todos.'))
                        : h('ul', {},
                            ...this.state.todos.map(({ id, todo }) => 
                                h('li', { key: id },
                                    text(todo),
                                    h('button', 
                                        { onclick: () => this.removeTodo(id) }, 
                                        text('Remove')
                                    )
                                )
                            )
                        )
                )
            )
        }
    
    }
    
    customElements.define('todo-app', TodoApp);
    

    좋은 웹페이지 즐겨찾기