Vue.js+bulma로 대화상자 보이기 시도

15157 단어 BulmaJavaScriptVue.js

목표


대화 상자를 표시하려면 JavaScript 프레임워크Vue.js와 CSS 프레임워크bulma를 사용하십시오.

견본


Vue.js에bulmadialog-component 구성 요소를 추가합니다.
그리고 언제든지 부모 측에서 구성 요소를 실행하는 방법 showDialog.
다음 속성이 있는 객체가 매개변수로 지정됩니다.
  • title: 대화 상자 제목
  • contents: 대화 상자의 내용입니다.HTML 태그 비활성화
  • html: 대화 상자 내용.유효한 HTML 태그
  • buttons: 단추 정보의 배열
  • caption: 버튼 제목
  • callback: 리셋 함수
  • 구성 요소 끝


    IE11로 이동합니다.
    bulma_dialog.js
    /**
     * bulma + vue.jsでダイアログを表示します。
     * html: vue.jsの管理下に以下を追加します
     *   <bulmadialog-component ref="dialog"></bulmadialog-component>
     * js:Vue.jsを作成するときにコンポーネントを追加する
     *  components: {
          'bulmadialog-component': BulmaDialog,
        },        
     * js:Vue.jsの親のメソッドにて以下を実行
     *  this.$refs.dialog.showDialog({
            title:'わっふるる',
            //contents:'わっふるぼでぃ0\nsadfasfd',
            html : 'あたえたt<br>awrawtあたえたt<br>',
            buttons : [
              {
                caption : 'はい',
                callback : function () {
                  console.log('はい');
                }
              },
              {
                caption : 'いいえ',
                callback : function () {
                  console.log('いいえ');
                }
              }
            ]
          });
     */
    // eslint-disable-next-line no-unused-vars
    const BulmaDialog = {
      /* eslint-disable max-len */
      template: (function() {/*
          <div v-bind:class="{ 'is-active': isShow }" class="modal">
            <div class="modal-background"></div>
              <div class="modal-card">
                  <header class="modal-card-head">
                      <p class="modal-card-title">{{data.title}}</p>
                  </header>
                  <div >
                  </div>
                  <section v-if="data.html" v-html="data.html" class="modal-card-body"></section>
                  <section v-else class="modal-card-body">{{data.contents}}</section>
                  <footer class="modal-card-foot"  style="justify-content: flex-end;">
                      <button v-for="btnObj in data.buttons" type="button" class="button" @click="btnObj.callback(); isShow = false;">{{btnObj.caption}}</button>
                  </footer>
              </div>
          </div>
          </div>
        */}).toString().match(/\/\*([^]*)\*\//)[1],
      /* eslint-enable */
      data: function() {
        return {
          isShow: false,
          data: {
            title: '',
            body: '',
            html: '',
            buttons: [],
          },
        };
      },
      methods: {
        showDialog: function(data) {
          this.isShow = true;
          this.data.title = data.title;
          this.data.contents = data.contents;
          this.data.html = data.html;
          this.data.buttons = data.buttons;
        },
      },
    };
    
    

    사용처

    <!doctype html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Hello Bulma!</title>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css">
        <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script src="/phptest/codeview/js/bulma_dialog.js"></script>
      </head>
      <body>
      <div id="app">
        <bulmadialog-component ref="dialog"></bulmadialog-component>
        <button class="button is-primary" @click="test1">ダイアログA</button>
        <button class="button is-primary" @click="test2">ダイアログB</button>
      </div>
    <script>
    var app = new Vue({
      el: '#app',
      components: { //Scopedが使える
        'bulmadialog-component': BulmaDialog,
      },
      data: function() {
          return {
          }
      },
      methods: {
        test1 : function () {
          this.$refs.dialog.showDialog({
            title:'確認(TEXT)', 
            contents: "ふんぐるい むぐるうなふ くとぅるう るるいえ うがふなぐる ふたぐん<br>Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn",
            buttons : [
              {
                caption : 'はい',
                callback : function () {
                  console.log('test1 はい');
                }
              },
              {
                caption : 'いいえ',
                callback : function () {
                  console.log('test2 いいえ');
                }
              }
            ]
          });
        },
        test2 : function () {
          this.$refs.dialog.showDialog({
            title:'確認(HTML)', 
            html: "ふんぐるい むぐるうなふ くとぅるう るるいえ うがふなぐる ふたぐん<br>Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn",
            buttons : [
              {
                caption : 'YES',
                callback : function () {
                  console.log('Yes');
                }
              },
              {
                caption : 'No',
                callback : function () {
                  console.log('No');
                }
              }
            ]
          });
        }
      }
    })
    </script>
    
      </body>
    </html>
    

    참고 자료


    Safari도 틀리지 않는 Javascript의 투명한 문서 작성
    https://qiita.com/ampersand/items/c6c773ba7ae9115856d0

    메모


    Bulma 자체는 IE를 부분적으로 지원하기 때문에 템플릿 문자로 IE를 포기하는 것이 좋다
    Bulma uses autoprefixer to make (most) Flexbox features compatible with earlier browser versions. According to Can I use, Bulma is compatible with recent versions of:
  • Chrome
  • Edge
  • Firefox
  • Opera
  • Safari
  • Internet Explorer (10+) is only partially supported.

    좋은 웹페이지 즐겨찾기