Vue.js3.0의 새로운 기능을 시도합니다.~텔레포트 편~

10019 단어 TypeScriptVue.js
2020/05/04 추기portal 이름이 변경된 것 같습니다.
글의 내용도 수정되었다.
--
2020년 Q1 출시 예정인 Vue.나는 js3.0의 새로운 기능teleport을 시도했기 때문에 총괄해 보았다.
(참조)
다음은 Vue3.0(vue-next)의 환경 구조와 기타 새로운 기능도 정리했다.
  • vue-next(Vue.js3.0wip)+TypeScript+webpack에서 개발 환경 구축
  • Vue.js3.0의 새로운 기능을 시도합니다.~서스펜스 편~
  • Teleport란 무엇입니까?


    정의된 구성 요소가 속한 DOM 트리와 달리 구성 요소를 원격 전송처럼 다른 위치로 이동할 수 있습니다.
    지정된 위치에 바로 표시할 수 있기 때문에
  • 모달, Tooltip 등 요소의 상부에 표시하고자 하는 내용이라도 z-index의 CSS 하크
  • 는 필요 없다
  • 독립형 어셈블리(예: Modal)에 대한 부모 요소의 스타일 간섭 방지
  • 등 장점.
    Vue.js2계라도 제3자 플러그인LinusBorg/portal-vue을 사용하여 실현할 수 있다.
    Vue.js3.0은 가상 DOM 수준을 지원하는 것 같습니다.(설치 세부 사항은 잘 모름)

    (PortalVue의 로고입니다. 개념이 매우 좋다는 뜻입니다.)

    Teleport 쓰기

    Teleport 구성 요소에 target을 지정한 후 다른 곳에서 묘사하고 싶은 요소만 내부에 기재하면 됩니다.단, <Teleport> 내부의 요소는 target에서 지정한 선택기 요소 내부에서 이동하고 그려집니다.
    선택기에서 지정한 요소는 Vue의 DOM 트리 외부의 요소일 수도 있습니다.
    sample.vue
    <teleport target="セレクタ">
      <!-- 以下がtargetで指定した要素に移動して描画される -->
      <MyModal />
    </teleport>
    

    Teleport 예제 응용 프로그램 구현


    다음 그림을 만드는 샘플 프로그램입니다.
    이미지 오른쪽에 있는 장치 컨트롤러에서 볼 수 있듯이 모드 요소는 설치<teleport>가 아니라 App.vue 내부에 표시됩니다.
    동작 코드는 여기 자료 라이브러리에 있습니다.
    https://github.com/kawamataryo/vue-next-ts-webpack-preview/tree/portal-demo

    App.vue


    먼저 Teleport의 App을 정의합니다.vue의 실현.<div id="app"> 어셈블리의 요소로 지정<div id="myModal">됩니다.
    그리고 내부 설정<teleport>에 제어의 패턴 요소를 표시합니다.
    App.vue
    <template>
      <div class="container">
        <img src="./logo.png" />
        <h1>Modal demo</h1>
        <button @click="toggleModal">toggle modal</button>
        <teleport to="#teleport-target">
        <!-- 以下要素がid="teleport-target"内に描画される -->
          <div v-if="isVisible" id="myModal" class="modal">
            <div class="modal-content">
              <span class="close" @click="toggleModal">&times;</span>
              <p>modall content</p>
            </div>
          </div>
        </teleport>
      </div>
    </template>
    
    <script lang="ts">
    import { defineComponent, ref } from "vue";
    
    export default defineComponent({
      setup() {
        const isVisible = ref(false);
    
        const toggleModal = () => {
          isVisible.value = !isVisible.value;
        };
        return {
          isVisible,
          toggleModal
        };
      }
    });
    </script>
    

    main.ts


    다음은 App입니다.vue의main을 마운트합니다.네, ts.
    샘플 응용 프로그램에서 to="#teleport-target" 을 App으로 설정합니다.vue를 마운트하는 중입니다.
    main.ts
    import { createApp } from 'vue'
    import App from './App.vue'
    
    createApp(App).mount('#app')
    

    index.html


    마지막으로 Teleport의 이동 목적지인 index입니다.html입니다.
    App.vuev-if, Teleport의 targetid="app"을 불러옵니다.<div id="app"> 그 자체는 일반적인 DOM 요소이고 여기는 App입니다.vue<div id="teleport-target"> 내부에서 지정한 요소를 이동하여 묘사합니다.
    index.html
    <doctype html>
    <html lang="ja">
    <head>
      <link rel="stylesheet" href="/dist/main.css">
      <meta charset="UTF-8">
      <meta name="viewport"
            content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Vue3.0 demo</title>
    </head>
    <body>
      <div id="app"></div>
      <div id="teleport-target"></div>
      <script src="/dist/main.js"></script>
    </body>
    </html>
    

    끝날 때


    이상, Vue.js3.0의 새로운 기능을 시도합니다.~텔레포트 편
    z-index와 부모 스타일의 방해를 방지하기 위해서 하크 CSS를 사용하지 않는 것이 매우 편리하다.나는 코드를 매우 예쁘게 유지할 수 있을 것 같다.
    portal-vue를 사용하면 Vue2계의 현행 프로젝트에서도 사용할 수 있기 때문에 적극적으로 사용하고 싶습니다.

    참고 자료

  • https://speakerdeck.com/kazupon/mamonakuyatutekuru-vue-dot-js-3
  • https://vueschool.io/articles/vuejs-tutorials/portal-a-new-feature-in-vue-3/
  • 좋은 웹페이지 즐겨찾기