首頁  >  文章  >  web前端  >  在React、Vue專案中如何使用SVG

在React、Vue專案中如何使用SVG

亚连
亚连原創
2018-06-06 15:24:092092瀏覽

本篇文章主要介紹了在 React、Vue專案中使用SVG的方法,現在分享給大家,也為大家做個參考。

在一些現代的扁平化設計網站,特別是行動端網站,經常包含許多簡單而清晰的小圖標,例如網站圖標、用戶的預設頭像、行動裝置網頁首頁底部固定的切換欄等,這些小圖示一般都是美工做好,可能會放到精靈圖上,前端再進行裁切展示。

而實際上,這些簡單的小圖示完全沒必要讓美工來做,前端完全可以透過svg使用程式碼把這些簡單的圖示畫出來,並且,因為這些圖標是用程式碼描述出來的,所以如果想要修改這些圖標,例如改變圖標的顏色、圖標的形狀、大小等,都只是改變幾行程式碼的事情,非常簡單,根本不需要美工返工重做。

本文不是闡述如何利用 svg 來進行畫圖的,不了解 svg的可以前往 這裡查看, 本文主要說一下如何在網站中使用 svg。

SVG在一般網頁中的使用

svg使用XML 格式定義圖片,你也可以把它看做是一般的HTML標籤,鑲嵌在網頁中呈現出某種效果,在網頁中使用svg的基本範例如下:

<body>
  <svg width="100" height="100" version="1.1" xmlns="http://www.w3.org/2000/svg">
    <rect width="100%" height="100%" style="fill:pink;stroke-width:1;stroke:rgb(0,0,0)"/>
  </svg></body>

效果如下:

可以看到,在普通網頁中使用svg是很簡單的,只要你能把svg圖示畫出來,在網頁中的呈現完全不是問題。

在Vue中使用Svg

你完全可以像在普通網頁中使用svg那樣在Vue中使用,不過,既然已經是選擇vue來組件化開發項目了,那麼在一堆組件中,穿插一大段的svg畢竟有點不太好看。

一種解決方法是,利用svg的use標籤,不直接在主頁面中編寫繪製svg圖示的程式碼,而是把這一大段的程式碼放到另外的檔案中,然後使用use引用這段繪製圖示的程式碼即可(好像餓了麼移動端就是這麼乾的)。

例如,將所有繪製svg的程式碼放到svg-icon.vue檔案中,所有圖示的繪製程式碼使用symbol標籤分隔開並單獨命名,避免錯亂,然後將這個檔案當作一個元件匯出,在主頁面中引入此元件,接著,在需要使用svg圖示的地方,透過use標籤將其引入。

svg-draw.vue程式碼範例如下:

<template>
 <svg
  xmlns="http://www.w3.org/2000/svg"
  xmlnsXlink="http://www.w3.org/1999/xlink"
  style={{position:&#39;absolute&#39;,width:0,height:0}}>
  <defs>
   <symbol viewBox="0 0 26 31" id="location">
    <path xmlns="http://www.w3.org/2000/svg" d="M512.571517 65.907059c-204.736964 0-370.715183 165.979242-370.715183 370.724393 0 94.440929 35.320437 180.625824 93.462648 246.083651 1.572822 2.690272 3.50994 5.225001 5.817496 7.531534l240.297878 251.597225c1.279133 1.864464 2.736321 3.64297 4.393054 5.298679 2.111081 2.111081 4.418636 3.90596 6.856152 5.402033 14.458293 10.06524 34.491559 8.658194 47.393403-4.242627 3.26537-3.263323 5.78782-6.987135 7.582699-10.960633L783.610536 690.24766c1.867534-1.866511 3.489474-3.88447 4.876054-6.010901 58.951647-65.640999 94.819552-152.431691 94.819552-247.604284C883.305119 231.886301 717.325877 65.907059 512.571517 65.907059zM512.390391 588.611865c-82.734306 0-149.814074-67.087954-149.814074-149.842727 0-82.753749 67.079768-149.833517 149.814074-149.833517 82.772168 0 149.851936 67.079768 149.851936 149.833517C662.242328 521.523911 595.161536 588.611865 512.390391 588.611865z" fill="#d81e06"/>
   </symbol>
  </defs>
 </svg></template>

整個vue元件匯出一個大的svg,此svg包含了許多小的圖標,類似於精靈圖,每個圖示使用symbol分隔,並單獨命名以方便引用。

使用範例如下:

// index.vue
...<svg class="location-icon">
 <use xlink:href="#location" rel="external nofollow" ></use></svg>...

然後,就可以看到網頁中順利出現對應的svg圖示了:

不過,還有個問題,如果目前網站需要用到的svg圖標很多,勢必就造成svg-icon.vue這個文件體積逐漸變大,當前網頁命名只需要用到其中一個svg圖標,結果你把幾百個圖標的svg程式碼,全部加載了進來,明顯不太友好,最好是能夠按需加載,當前網頁需要哪些圖標就加載哪些,甚至一些可能出現可能不出現的圖標,也在該出現時再加載,如果沒有機會出現,那麼永遠不加載。

Github上有很多這類的插件,我介紹一個我覺得很好用的插件:vue-svg-icon,簡單易用、快速上手。

首先,安裝此插件,就不多說了,安裝完成後,在專案的入口檔案中註冊此外掛程式以方便全域呼叫:

import Icon from &#39;vue-svg-icon/Icon.vue&#39;Vue.component(&#39;icon&#39;, Icon)

然後在根目錄的/src目錄下新建一個svg目錄(目前這個路徑只能是這樣,不可配置為其他路徑和目錄),然後再這個目錄中放入你想要使用的svg圖示的svg檔案即可。

例如一個微信圖示的svg如下:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1502683891821" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2885" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16">
<defs>
<style type="text/css"></style>
</defs>
<path d="M282.6 363.8c-23.7 0-47-15.7-47-38.9 0-23.7 23.3-38.9 46.5-38.9 23.7 0 38.9 15.2 38.9 38.9 0.5 23.2-15.1 38.9-38.4 38.9zM500.4 286c23.7 0 38.9 15.2 38.9 38.9 0 23.3-15.2 38.9-38.9 38.9-23.3 0-47-15.7-47-38.9 0-23.7 23.7-38.9 47-38.9z m167.7 84.5c9.8 0 19.7 0.5 30 1.8-27.3-125.6-161.4-218.7-314.4-218.7C212.4 153.6 72 270.3 72 418.3c0 85.9 46.5 155.6 124.8 210.2l-31.3 93.9 109.1-54.6c38.9 7.6 70.2 15.7 109.1 15.7 9.4 0 19.2-0.5 29.1-1.3-6.3-20.6-9.8-42.9-9.8-65.3-0.1-136 116.6-246.4 265.1-246.4z" p-id="2886"></path><path d="M772.7 573.9c-15.2 0-30.9-15.2-30.9-30.9 0.5-15.7 15.7-31.3 30.9-31.3 23.7 0 39.4 15.7 39.4 31.3-0.1 15.7-15.7 30.9-39.4 30.9z m-171.3 0c-15.2 0-30.9-15.2-30.9-30.9s15.7-31.3 30.9-31.3c23.7 0 38.9 15.7 38.9 31.3 0.5 15.7-15.2 30.9-38.9 30.9zM952 613.3C952 488.5 827.2 387 687.3 387c-148 0-264.7 101.5-264.7 226.3 0 124.8 116.7 225.8 264.7 225.8 31.3 0 62.6-8.1 93.5-15.7l85.9 47-23.7-77.8c62.5-47 109-109.1 109-179.3z" p-id="2887">
</path>
</svg>

將上述程式碼儲存到一個.svg的檔案中,例如wx.svg,放到/src/svg目錄中,這樣就完成了準備工作。

接著,想要使用的話,很簡單,直接在vue元件中這麼寫:

<template>
  <icon class="wx-icon" name="wx"></icon></template>

刷新頁面時,打開控制台,可以看到頁面中載入了這個wx.svg文件,這樣,就實現了svg文件的按需引入。

在React中使用Svg

在React中使用Svg和vue一樣,同樣存在3種方案,一種是直接在react的reader方法中寫入svg程式碼,第二種則是將所有svg繪製程式碼放到一個檔案中,然後將這個檔案一次載入,使用use標籤引用回應的svg圖案,第三種則是使用外掛程式按需引入。

第一种直接在 渲染方法中写入 svg的方法就不多说了,第二种也很简单 ,和 vue一样,只不过写法上需要注意一下。

render() {
  return (
   <svg
    xmlns="http://www.w3.org/2000/svg"
    xmlnsXlink="http://www.w3.org/1999/xlink"
    style={{position:&#39;absolute&#39;,width:0,height:0}}>
    <defs>
     <symbol viewBox="0 0 26 31" id="location">
      <path fill="#FFF" fillRule="evenodd" d="M22.116 22.601c-2.329 2.804-7.669 7.827-7.669 7.827-.799.762-2.094.763-2.897-.008 0 0-5.26-4.97-7.643-7.796C1.524 19.8 0 16.89 0 13.194 0 5.908 5.82 0 13 0s13 5.907 13 13.195c0 3.682-1.554 6.602-3.884 9.406zM18 13a5 5 0 1 0-10 0 5 5 0 0 0 10 0z"></path>
     </symbol>
     <symbol viewBox="0 0 14 8" id="arrow">
      <path fill="#FFF" fillRule="evenodd" d="M5.588 6.588c.78.78 2.04.784 2.824 0l5.176-5.176c.78-.78.517-1.412-.582-1.412H.994C-.107 0-.372.628.412 1.412l5.176 5.176z"></path>
     </symbol>
    </svg>
   )
}

主要是需要注意,因为 react使用 jsx语法,不允许出现 - 连字符,所以像 fill-rule这样的属性,就必须写成 fillRule,引用的时候同样如此。

// 引用的时候需要将 `xlink:href` 改写成 xlinkHref<svg className="arrow-left">
  <use xlinkhref="#arrow-left" rel="external nofollow" ></use>
 </svg>

第三种按需引入,只加载当前需要的 svg形状,同样是将每一个 svg图片作为一个单独的文件保存,然后再需要使用的地方进行引用。 Github上有个项目 react-svg,这个项目内部其实是对 SVGInjector的包装,

安装 react-svg之后,就可以像下面这样使用了:

import ReactSVG from &#39;react-svg&#39;

ReactDOM.render(
 <ReactSVG
  path="atomic.svg"
  callback={svg => console.log(svg)}
  className="example"
 />,
 document.querySelector(&#39;.Root&#39;)
)

一般都只是在使用小图标的时候才考虑 svg,而这些小图标一般都比较简约,绘制起来也没什么难度,不过大部分情况下没有必要自己来画,很多网站都提供svg的图标下载,例如阿里的 iconfont,图标数量众多,基本可以满足绝大部分的需求,另外,类似的网站还有 easyicon 、 icomoon等。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

有关在Vue中使用Compass的具体方法?

如何关闭Vue计算属性自带的缓存功能,具体步骤有哪些?

如何解决vue 更改计算属性后select选中值不更改的问题,具体操作如下

以上是在React、Vue專案中如何使用SVG的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn