重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這篇文章將為大家詳細講解有關Vue項目中實用組件有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創新互聯是專業的孝義網站建設公司,孝義接單;提供網站建設、成都網站設計,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行孝義網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
vue 路由中的懶加載
你真的用好了路由的懶加載嗎?
在 2.x 的文檔中、cli 的初始化項目中都會默認生成一個路由文件,大致如下:
{ path: '/about', name: 'about', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ './views/About.vue') }
通過路由懶加載的組件會在 webpack 打包之后生成名為 about 的 dist/js/about.39d4f7ae.js 文件。
但是在 react 中,react-loadable 可以使路由在懶加載之前先加載一個其他的組件(一般是 loading )過度這個加載的過程。
A higher order component for loading components with promises.
其實這也就是 react 的高階組件 (HOC),那么根據 HOC 的思想,我們能否在 vue 中也實現這樣一個 HOC 呢?答案是 YES
讓我們看一下官方的介紹:
const AsyncComponent = () => ({ // The component to load (should be a Promise) component: import('./MyComponent.vue'), // A component to use while the async component is loading loading: LoadingComponent, // A component to use if the load fails error: ErrorComponent, // Delay before showing the loading component. Default: 200ms. delay: 200, // The error component will be displayed if a timeout is // provided and exceeded. Default: Infinity. timeout: 3000 })
這個 2.3+ 新增的功能,使我們的開始有了可能,我們創建一個 loadable.ts 的高階組件,利用 render 函數生成組件并返回。
import LoadingComponent from './loading.vue'; export default (component: any) => { const asyncComponent = () => ({ component: component(), loading: LoadingComponent, delay: 200, timeout: 3000 }); return { render(h: any) { return h(asyncComponent, {}); } }; };
在 routes 中使用該組件
import loadable from './loadable'; const routes = [ { path: '/about', name: 'about', // component: () => import(/* webpackChunkName: "about" */ './views/About.vue') component: loadable( () => import(/* webpackChunkName: "about" */ './views/About.vue') } ]
看起來貌似已經成功了,但是在這當中還存在問題。
關于 vue-router ,不可避免的會涉及到路由的鉤子函數,但是在以上用法中路由鉤子是失效的,why ?
路由鉤子只直接生效于注冊在路由上的組件。
那么通過 loadable 生成渲染的組件中 About 組件已經是一個子組件,所以拿不到路由鉤子。
組件必須保證使用上的健壯性,我們換一種方案,直接返回這個組件。
const asyncComponent = importFunc => () => ({ component: importFunc(), loading: LoadingComponent, delay: 200, timeout: 3000 });
我們重新更換 routes :
const routes = [ { path: '/about', name: 'about', // component: () => import(/* webpackChunkName: "about" */ './views/About.vue') component: asyncComponent( () => import(/* webpackChunkName: "about" */ './views/About.vue') } ]
上述用法已經解決了路由鉤子的問題,但是仍然有兩點值得注意:
asyncComponent 接受的參數是一個 function , 如果直接寫成 import(/* webpackChunkName: "about" */ './views/About.vue'), 則 LoadingComponent 無法生效。
AsyncComponent 還可以添加一個 error 的組件,形成邏輯閉環。
SVG 、Iconfont 在 vue 項目中最優雅的用法
能用 svg 的地方盡量不使用圖片 筆者在使用 svg 的時候一開始是使用vue-svg-loader, 具體用法,請自行查看。
但是在寫 sidebar 時,筆者想將 svg 通過配置文件的形式寫入,讓 sidebar 形成多層的自動渲染。
顯然 vue-svg-loader 的用法不合適。我們先了解 svg 的用法,我們可以看一篇乃夫的介紹:SVG 圖標簡介。
SVG symbol ,Symbols let you define an SVG image once, and reuse it in multiple places.
和雪碧圖原理類似,可以將多個 svg 合成一個,但是這里用 id 來語意化定位圖標
// 定義 // 使用
正好有這么一個 svg 雪碧圖的 webpack loader,svg-sprite-loader,下面是代碼
首先根據官網修改配置:
// vue.config.js const svgRule = config.module.rule('svg'); // 清除已有的所有 loader。 // 如果你不這樣做,接下來的 loader 會附加在該規則現有的 loader 之后。 svgRule.uses.clear(); svgRule.exclude.add(/node_modules/); // 添加要替換的 loader // svgRule.use('vue-svg-loader').loader('vue-svg-loader'); svgRule .test(/\.svg$/) .pre() .include.add(/\/src\/icons/) .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]' }); const imagesRule = config.module.rule('images'); imagesRule.exclude.add(resolve('src/icons')); config.module.rule('images').test(/\.(png|jpe?g|gif|svg)(\?.*)?$/);
創建 ICON 文件夾,然后在文件夾中創建 svgIcon.vue 組件。
在當前目錄下創建 index.ts
import Vue from 'vue'; import SvgIcon from './svgIcon.vue'; // svg組件 // 注冊到全局 Vue.component('svg-icon', SvgIcon); const requireAll = (requireContext: any) => requireContext.keys().map(requireContext); const req = require.context('./svg', false, /\.svg$/); requireAll(req);
在當前目錄下新建 svg 文件夾,用于存放需要的 svg 靜態文件。
? icons [1.1.0] ? tree -L 2 . ├── index.ts ├── svg │ └── loading.svg └── svgIcon.vue
使用:
我們來看一下原理和值得注意的幾點:
svg-sprite-loader 處理完通過 import 的 svg 文件后將其生成類似于雪碧圖的形式,也就是 symbol, 通過配置中的 .options({ symbolId: 'icon-[name]' });可以使用 直接使用這個 svg
添加完 svg-sprite-loader 后,由于 cli 默認對 svg 有處理,所以需要 exclude 指定文件夾的 svg。
使用時由于 svgIcon 組件的處理,只需要將 name 指定為文件名即可。
那么,我們使用 iconfont 和 svg 有什么關系呢?
iconfont 的使用方法有很多種,完全看個人喜好,但是其中一種使用方法,也是用到了 svg symbol 的原理,一般 iconfont 會默認導出這些文件。
? iconfont [1.1.0] ? tree -L 2 . ├── iconfont.css ├── iconfont.eot ├── iconfont.js ├── iconfont.svg ├── iconfont.ttf ├── iconfont.woff └── iconfont.woff2
我們關注于其中的 js 文件, 打開文件,可以看出這個 js 文件將所有的 svg 已經處理為了 svg symbol,并動態插入到了 dom 節點當中。
而 iconfont 生成的 symbolId 也符合我們 svg-icon 的 name 命名規則 所以我們在項目的入口文件中引入這個 js 之后可以直接使用。
back-to-up
首先為什么會寫這個組件呢,本項目中使用的組件庫是 elementUI ,而 UI 庫中自帶 el-backtop,但是我能說不好用嗎? 或者說我太蠢了,在經過一番努力的情況下我還是沒能使用成功,所以自己寫了一個。
直接上代碼:
使用:
custom-style 可以自行定義,返回的圖標也可以自由替換。
注意,在 safari 中動畫中動畫表現不一致,使用 requestAnimationFrame 之后仍然不一致。希望同學們有時間可以自由發揮一下。
關于“Vue項目中實用組件有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。