iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
Modern Web

小白的JavaScript讀書日記系列 第 27

Day27:Vue.js(九)

  • 分享至 

  • xImage
  •  

動態元件(Dynamic Component)

可以透過在component裡面加入一個is屬性,依據傳入的參數不同,再對應的元件間進行動態的切換。

<body>
  <div id="app">
    <button v-for='tab in tabs' v-bind:key='tab' v-on:click="currentTab = tab">
      {{tab}}
    </button>
    
    <!-- 元件會在currentComponent改變時改變 -->
    <component v-bind:is="currentTabComponent"></component>
  </div>
  <script>
    Vue.component('tab-home', {
      template: `<div>Home component</div>`
    });
    Vue.component('tab-posts', {
      template: `<div>Posts component</div>`
    });
    Vue.component('tab-archive', {
      template: `<div>Archive component</div>`
    });
    new Vue({
      el: '#app',
      data: {
        currentTab: 'Home',
        tabs: ['Home', 'Posts', 'Archive']
      },
      computed: {
        currentTabComponent: function () {
          return "tab-" + this.currentTab.toLowerCase();
        }
      }
    })
  </script>
</body>

我們可以看到component會依照is帶入的值來動態決定載入哪個元件

keep-alive

我們在切換的過程可能會希望能保存原本元件的狀態,這時候可以用keep-alive將想要保存的包起來,來達到效果:

<style>
  ul {
    display: flex;
    list-style: none;
  }

  a {
    text-decoration: none;
  }

  li {
    background: #e0e0e0;
    margin: 0 5px;
    padding: 10px;
    list-style: none;
  }

  li:hover {
    background: red;
  }
</style>
<body>
  <div id="app">
    <ul>
      <li><a href="#" @click.prevent="changeView('home')">Home</a></li>
      <li><a href="#" @click.prevent="changeView('posts')">Posts</a></li>
      <li><a href="#" @click.prevent="changeView('archive')">Archive</a></li>
    </ul>
    <div>
      <h3>With keep-alive</h3>
      <keep-alive>
        <component :is="view"></component>
      </keep-alive>
    </div>
    <div>
      <h3>Without keep-alive</h3>
      <component :is="view"></component>
    </div>

  </div>
  <script>
    new Vue({
      el: '#app',
      data: {
        view: 'home'
      },
      methods: {
        changeView(viewName) {
          this.view = viewName;
        }
      },
      components: {
        home: {
          template: '<p>This is home <input type="text" placeholder="Text me!"></p>'
        },
        posts: {
          template: '<p>This is Posts <input type="text" placeholder="Text me!"></p>'
        },
        archive: {
          template: '<p>This is Archive <input type="text" placeholder="Text me!"></p>'
        }
      }
    })
  </script>
</body>

上述範例可以試看看在Home的With keep-alive 和 Without keep-alive都輸入一些東西,然後切換到Posts在切換回Home看是哪邊還有你剛剛輸入的~

keep-alive也提供了如果要切換的子元件太多的屬性:

  • :include:保留你選定的子元件
  <div>
      <keep-alive :include="'posts,archive'">
        <component :is="view"></component>
      </keep-alive>
    </div>

我們修改了上面的範例,只針對postsarchive的值做保留。

  • :exclude:除了這個子元件的內容,其他都保留
<div>
      <keep-alive :exclude="'posts'">
        <component :is="view"></component>
      </keep-alive>
    </div>

除了posts以外的都做保留

  • :max:最多保留幾個子元件內容,只取最後引入的X個
    <div>
      <keep-alive :max="2">
        <component :is="view"></component>
      </keep-alive>
    </div>

這邊我們設定2個,當你在HomePostsArchive依序輸入一些東西,再回頭看他只會保留PostsArchive內的值。


今日總結:

  • 如何動態切換元件 :is=""(v-bind:is=""的縮寫)
  • keep-alive與他的小夥伴如何使用

這邊也幫自己複習一下縮寫(可以幫助在撰寫上少打幾個字
v-bind = :
v-on = @


上一篇
Day26:Vue.js(八)
下一篇
Day28:Vue.js(十)
系列文
小白的JavaScript讀書日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言