Vue.js布局

2020-12-14 CSDN技術社區

動態Vue.js布局組件

前言

  • vue.js是漸進增強的視圖庫,可以作為.html頁面部分使用,也可以結合vue-router、vuex、axios用來構建單頁面或多頁面應用。以開發單頁面為例,開發過程中為遇到,不同的頁面需要使用不同的頁面布局情況,下面我們將探索Vue.js中處理布局的多種方式。
  • 構建Vue Router驅動的Vue應用程式.(基本結構如下),它能很好的工作。(但假設有一個結帳流程,您不想顯示導航。或者您可能有帶側邊欄的產品頁面和沒有側邊欄的其他頁面等等)面對這種多樣性要求,我們要怎麼做來滿足業務需求的同時,保持代碼的可維護、易擴展呢?下面一起來探討。

<template> <div class="App"> <nav class="App__nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </nav> <router-view/> <footer> &copy; Awesome Company </footer> </div></template>

實現方式

  1. 條件渲染:最基本和最直接的方法是有條件地渲染布局的某些部分。因此,您可以將v-if指令添加到布局的某些部分,並根據需要切換可見性。

<template> <div class="App"> <nav v-if="showNav" class="App__nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </nav> <router-view/> <footer v-if="showFooter"> &copy; Awesome Company </footer> </div> </template>

-說明:這種方法的一個問題是,您必須控制應用程式中某些元素的可見性,通過在Vue.js中處理全局狀態。雖然如果您不需要非常複雜的布局並且只是想在某些上下文中隱藏某些元素,這可能是正確的方法,但隨著應用程式的增長,這種方法可能會成為維護的噩夢。

  1. 靜態布局包裝器組件:使用普通組件(包含布局不同部分的一個或多個插槽)作為視圖的包裝器,它提供了很大的靈活性,並且感覺不像條件渲染方法那麼髒。

// app.vue<template> <div class="App"> <router-view/> </div></template>// LayoutDefault.vue<template> <div class="LayoutDefault"> <nav class="LayoutDefault__nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </nav> <main class="LayoutDefault__main"> <slot/> </main> <footer class="LayoutDefault__footer"> &copy; Awesome Company </footer> </div></template// home.vue<template> <layout-default> <div class="Home"> <h1>Home</h1> <p> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </p> <h2>Amet sit</h2> <p> Eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </p> </div> </layout-default></template><script>import LayoutDefault from '../layouts/LayoutDefault.vue';export default { name: 'Home', components: { LayoutDefault, },};</script>

  • 說明:
  • Home.vue組件實現LayoutDefault包裝器組件以包裝其內容。
  • 雖然在靈活性方面,這種方法具有我們所需的一切,但是在靜態布局組件中包裝我們的視圖有一個巨大的缺點:每次路由更改時,組件都會被銷毀並重新創建。
  • 這不僅會對性能產生負面影響,因為客戶端必須在每次路由更改時一次又一次地重新創建布局組件(以及嵌套在其中的所有其他組件),但這也意味著您必須獲取某些數據,您在布局的某個組件中使用的每個路徑更改。
  • 靜態布局包裝器組件非常強大且靈活,但它們也帶來了成本。讓我們一起探討一下,如果我們能夠提出一種方法,它具有靜態包裝器組件的所有積極特性,但沒有一個是負面的,那麼它就是最佳解決方案
  1. 動態布局包裝器組件
  • 在我們開始之前,先介紹一下Vue.js中的組件系統的一個非常強大的功能動態組件

<component :is="SomeComponent"/>

  • 在上面的示例中,SomeComponent是一個變量,可以動態分配給任何組件,每次分配不同的組件時,模板都會在您定義標記的位置呈現新組件。
  • 我們可以使用動態組件來構建一個非常靈活且高性能的動態布局系統。代碼如下:

// app.vue<template> <component :is="layout"> <router-view :layout.sync="layout"/> </component></template><script>export default { name: 'App', data() { return { layout: 'div', }; },};</script>// home.vue<template> <div class="Home"> <h1>Home</h1> <!-- ... --> </div></template><script>import LayoutDefault from '../layouts/LayoutDefault.vue';export default { name: 'Home', created() { this.$emit('update:layout', LayoutDefault); },};</script>

  • 上面你可以看到我們不再將Layout視圖的模板包裝在LayoutDefault組件中,但我們加載組件並將其作為我們在App基礎組件中定義的layout屬性的新值發出。這意味著,一旦創建Home組件,包裝呈現Home組件的的動態組件將被重新呈現,以呈現我們在created()鉤子中發出的組件。
  • 為什麼說這比靜態包裝器組件更好?主要區別在於,布局組件不是路由器視圖組件的一部分,而是包裹它。這意味著,如果視圖組件使用與先前視圖組件不同的布局,則僅==重新呈現布局組件==。
  1. 繼續重構代碼使得使用動態布局更加直觀

// 修改home.vue<template> <layout name="LayoutDefault"> <div class="Home"> <h1>Home</h1> <!-- ... --> </div> </layout></template> <script> import Layout from '../layouts/Layout'; export default { name: 'Home', components: { Layout, }, };</script>// src/layouts/Layout.jsimport Vue from 'vue';export default { name: 'Layout', props: { name: { type: String, required: true, }, }, created() { // Check if the layout component // has already been registered. if (!Vue.options.components[this.name]) { Vue.component( this.name, () => import(`../layouts/${this.name}.vue`), ); } this.$parent.$emit('update:layout', this.name); }, render() { return this.$slots.default[0]; },};<templat

參考連結

相關焦點

  • Vue.js布局
    動態Vue.js布局組件前言vue.js是漸進增強的視圖庫,可以作為.html頁面部分使用,也可以結合vue-router、vuex、axios用來構建單頁面或多頁面應用。
  • vue.js的Scoped Slot詳解
    譯者:李冰作用域插槽(Scoped Slots)是vue.js中一個非常有用的特性,它可以使組件更加通用和復用。唯一的問題是理解起來比較困難。試圖去讓你理解父與子作用域的交織關係,像解決一道數學難題。app.jsvue.component('my-list',{template:'#my-list',data(){return {title:'Shapes',
  • 可能是目前最完整的前端框架 Vue.js 全面介紹
    摘要2016年最火的前端框架當屬Vue.js了,很多使用過vue的程式設計師這樣評價它,「vue.js兼具angular.js和react.js的優點,並剔除了它們的缺點」。授予了這麼高的評價的vue.js,也是開源世界華人的驕傲,因為它的作者是位中國人–尤雨溪(Evan You)。
  • Vue.js系列:生命周期鉤子
    開發人員提供了一個Web開發人員可以在Vue.js應用程式的整個生命周期中使用的各種方法的討論。生命周期鉤子是在Vue對象生命周期的某個階段執行的已定義方法。從初始化開始到它被破壞時,對象都會遵循不同的生命階段。這是一個著名的圖表,表示掛鈎順序。
  • 5分鐘帶你入門vuex(vue狀態管理)
    如果你之前使用過vue.js,你一定知道在vue中各個組件之間傳值的痛苦,在vue中我們可以使用vuex來保存我們需要管理的狀態值,值一旦被修改,所有引用該值的地方就會自動更新,那麼接下來我們就來學習一下vuex是如何修改狀態值的:我們新建一個vue項目(這裡由於我們是講解vuex,所以對於vue項目的創建我們不會講解太詳細
  • vue-router│基本入門
    vue-router是vue的路由管理系統。我們都知道vue是單頁面應用(SPA),通過路由的映射從而切換到指定組件。區別:傳統的頁面跳轉是通過a連結的target屬性,指定是否在本窗口打開新頁面,每次跳轉都是頁面的重新刷新。而vue應用的路由會指定組件切換,無須重新刷新頁面,提高用戶體驗。
  • vue指南: Router路由基本使用
    ;vue Router路由組件安裝;我們用vue-cli初始化的時候,可以選擇添加vue Router;也可以單獨 執行 npm install vue-router --save 來安裝;我們首先建兩個目錄 router和pages,分別放路由路由模塊配置文件和組件文件再建兩個組件Index.vue和Menu1.vue;
  • 一張圖教你快速玩轉vue-cli3
    添加瀏覽器支持如何配置scss/stylus共享全局變量如何整合eleemntUI等第三方框架並實現按需引入配置單/多頁面如何配置自定義環境變量如何在vue.config.js最後可以在vue.config.js做webpack自定義配置2.添加瀏覽器支持browserslist我們可以通過package.json 文件裡的 browserslist欄位或一個單獨的 .browserslistrc
  • vue 布局尺寸 - CSDN
    本文實例講述了JS實現左右布局的resizeLayout公共組件,供大家參考,具體如下:特點:① 拖動尺寸線可以調節左右區域的大小;② 點擊按鈕可以對左邊區域展開和收起;③ 限制拖動的最小寬度;④ 使用vue插槽,可復用的組件
  • vue-router 使用方法
    $mount('#app')複製代碼js這部分做了4件事情:定義匹配到路由時候的組件定義路由列表。每一個路由是對應一個渲染的組件。用VueRouter創建router實例。其中第二步的路由列表作為參數創建vue實例並且掛載router對象到這裡,路由基本使用方式就差不多了。
  • SPA單頁面應用優化VUE性能優化
    Spa單頁面應用比如vue、react、angular都是屬於單頁面應用,那麼如何優化呢?咱們拿vue舉例。/a.js'),讓它的 JavaScritp 被執行。那麼require.ensure如何在vue中使用呢?require.ensure主要是在vue的路由中使用,如果不使用代碼分割隨著頁面的增多build之後app.727c5a981063de8a5ac8.js會越來越大。
  • @vue/composition-api 與 Vue3 的前生今世
    通過本文你將會 GET@vue/composition-api 和 vue3 的『姻緣』@vue/composition-api 實現原理@vue/composition-api 的優勢與劣勢Why @vue/compositions-api?
  • Vue 3.0 終於正正正式發布了!
    原文:https://github.com/vuejs/vue-next/releases作者:Vue 團隊譯文:https://zhuanlan.zhihu.com/p/254219538譯者:QC-L今天,我們非常自豪地宣布 Vue.js 3.0 "One Piece" 發布。
  • 如何在vue項目中使用sass並設置元素樣式
    那麼,如何在vue項目中使用sass?新建項目,選擇vue模板2、在項目中src/components文件夾下,新建vue文件,輸入文件名稱,點擊創建npm i element-ui -S,安裝element4、打開項目中的main.js文件,導入element相關的模塊和樣式文件,然後使用Vue.use(ElementUI)
  • Egg + Vue + MongoDB 實踐開發在線文檔管理平臺
    技術棧開發 2、了解 koa3、了解 egg4、了解 mongodb技術棧前端:vue: 模塊化開發少不了angular,react,vue三選一,這裡選擇了vue。vuex: 狀態管理sass: css預編譯器element-ui:不造輪子,有現成的優秀的vue組件庫當然要用起來。服務端:egg.js:企業級框架,按照一套統一的約定進行應用開發,開發十分高效。mongodb:一個基於分布式文件存儲的資料庫,比較靈活。
  • 在vue項目中使用vuex實現狀態管理的案例
    並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。準備工作:a.在vue項目中安裝vuex: npm install vuex -S。b.了解下vuex的五個屬性。(這個基本很少用到)demo的演示:在項目的src目錄創建一個store目錄,並創建一個index.js文件:該js文件,引入一個vue實例,和一個vuex實例,將
  • 用 Vue 做一個酷炫的 menu
    形式,誰讓我是vue的死灰粉呢,如果這都不算愛😔。/vue-bloom-menu,clone項目到本地a.(由於整個項目布局比較簡單,所以這裡主要講解邏輯和動畫的實現)第一步:計算menu展開後橫坐標和縱坐標。下面的x,y分別表示item在頁面的位置,以x為例。x:原始的位置x2最後展開的位置x1中間的過渡位置(主要是造成一個「拉回」的效果) 以下是圖片解釋,為了解釋簡單明了,我放大了radius倍數以及增加了動畫的執行時間。
  • 使用vue-cli3創建的項目如何引入less全局變量
    前言:本demo是基於腳手架3創建的vue項目,主要演示的是如何使用vw實現移動端適配;並且在項目中如何引入自定義的less全局變量。一.postcss-cssnextpostcss-import postcss-url cssnano-preset-advanced--save-dev安裝完可以看下package.json文件,看是否安裝齊全:2.創建 .postcssrc.js
  • 用Vue 和Bootstrap 4 來構建Web前端界面
    首先我們安裝Vue Cli安裝Vue Cli由於npm安裝較慢,甚至會失敗,需要,先安裝國內鏡像,可以使用cnpm或者npm別稱:然後用cnpm安裝vue.jscnpm install -g @vue.js
  • (實戰)Vue + Koa從零打造一個H5頁面可視化編輯器——Quark-h5
    angular,react,vue三選一,這裡選擇了vue。閱讀前準備1、了解vue技術棧開發2、了解koa3、了解mongodb工程搭建基於vue-cli3環境搭建如何規劃好我們項目的目錄結構?首先我們需要有一個目錄作為前端項目,一個目錄作為後端項目。