• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    解決vue的 v-for 循環中圖片加載路徑問題

    來源:懂視網 責編:小采 時間:2020-11-27 22:08:37
    文檔

    解決vue的 v-for 循環中圖片加載路徑問題

    解決vue的 v-for 循環中圖片加載路徑問題:先看一下產品需求,如下圖所示, 產品要求圖片和它的名稱一一對應,本來是非常簡單的需求,后臺直接返回圖片路徑和名稱,前臺直接讀取就可以了,但是我們沒有存儲圖片的服務器,再加上是一個實驗性的需求,圖片需要存放到前臺。當時我想,vue 中的img 的s
    推薦度:
    導讀解決vue的 v-for 循環中圖片加載路徑問題:先看一下產品需求,如下圖所示, 產品要求圖片和它的名稱一一對應,本來是非常簡單的需求,后臺直接返回圖片路徑和名稱,前臺直接讀取就可以了,但是我們沒有存儲圖片的服務器,再加上是一個實驗性的需求,圖片需要存放到前臺。當時我想,vue 中的img 的s

    先看一下產品需求,如下圖所示,

    產品要求圖片和它的名稱一一對應,本來是非常簡單的需求,后臺直接返回圖片路徑和名稱,前臺直接讀取就可以了,但是我們沒有存儲圖片的服務器,再加上是一個實驗性的需求,圖片需要存放到前臺。當時我想,vue 中的img 的src 可以動態綁定到一個變量上, 很簡單嗎,就沒有考慮太多,直接開始做了。

    首先和后臺商量一下數據結構,因為圖片要和名稱一一對應,所以后臺要返回中英文的名稱的映射,我把前臺的圖片名稱直接設置給后臺給的英文名稱,從而讀取圖片,圖片和中文名稱就一一對應了。數據結構如下:映射關系用對象表示,多個圖片,所以放到一個數組中

    [
     {
     CnName:'荷花',
     EnName: 'lotus'
     },
     {
     CnName:'康乃馨',
     EnName: 'carnations'
     },
     {
     CnName:'牡丹',
     EnName: 'peony'
     }
     ]

    現在前臺用vue-cli, 后臺用express 來模擬一下當時的開發場景,也可以還原一下錯誤和業務的迭代過程。新建一個文件夾,就叫vue-img吧,然后再在該文件夾中新建兩個文件夾,client, server, client 表示客戶端代碼,server 表示服務端代碼。 在client 文件夾中,打開命令窗口,執行 vue init webpack-simple . 命令,后面的點表示當前文件夾,為了簡單,這里使用了simple 模版. server 文件夾,打開命令窗口,先執行npm init 初始化為node 項目,然后npm install express cors --save, 安裝依賴,cors 是解決跨域的。

    先來寫前端代碼,把app.vue 中的template和script中的內容清空,保留它的css 樣式內容,我們就不用寫樣式了。前端頁面,有兩個部分,一個是button, 點擊按鈕來發送請求,一個是圖片展示區域,它用的就是v-for 循環, template 內容如下

    <div id="app">
     <button @click='getFlower'>點擊加載請求</button>
     <!-- 由于當時想當然地以為,src 就是綁定一個變量,所以就設置了一個默認變量,這是出錯的過程 -->
     <ul>
     <li v-for ="item in flowers" :key="item">
     <img :src="defaultImg" alt="flowers">
     <p>{{item}}</p>
     </li>
     </ul>
    </div>
    </template>

    由于template中用到了方法 getFlower, 變量defaultImg 和 flowers, 所以要在script中進行聲明。defaultImg 是一個圖片,所以還要引入進來, 在src 目錄中新建一個img文件夾,放幾張圖片。flowers是一個數組,我先預寫了一個['荷花', '康乃馨'],getFlower,因為沒有后臺,所以先沒有寫, 注意如果數據量大的,交互復雜,是要寫mock 數據的,這里比較簡單就沒有寫。這也是出錯的原因。代碼如下

    import defaultImg from './img/lotus.jpg'; // import 引入圖片
    
    export default {
     data() {
     return {
     flowers: ['荷花', '康乃馨'],
     defaultImg: defaultImg
     };
     },
     methods: {
     getFlower() {}
     }
    };
    

    整個頁面顯示如下,我以為沒有問題了。

    現在再來寫后臺代碼, 用express 寫一個后臺接口,還是非常簡單的。在server 文件夾中,建一個文件server.js 來寫后臺代碼

    var express = require('express');
    var cors = require('cors'); // 引入cors 中間件,解決跨域
    
    var app = express();
    app.use(cors());
    
    // 前端發送的是get請求,接口是flowers. 返回的數據code 表示成功或失敗,obj 表示數據
    // 數據中Cn 表示中文名稱,En表示中文名稱
    app.get('/flowers', (req, res) => {
     res.json({
     code: 0,
     obj: [
     {
     CnName:'荷花',
     EnName: 'lotus'
     },
     {
     CnName:'康乃馨',
     EnName: 'carnations'
     },
     {
     CnName:'牡丹',
     EnName: 'peony'
     }
     ]
     })
    })
    app.listen(3000, () => {
     console.log('server start at 3000');
    })
    

    現在用nodemon server.js 啟動服務,在瀏覽器地址輸入http://localhost:3000/flowers, 可以看到返回的數據表示接口ok.

    現在再重新寫一下前端代碼,進行前后端聯調。由于要發送請求,還要安裝axios 依賴。首先要根據后臺接口改一下template 內容的li

    <ul>
     <li v-for ="item in flowers" :key="item.EnName">
     <img :src="item.EnName" alt="flowers">
     <p>{{item.CnName}}</p>
     </li>
     </ul>

    然后,在script中引入 axios, flowers 數組清空,default img 刪除 , 引入后臺數據所需要的三張圖片, 同時getFlower 方法發送請求

    // 引入axios,用于發送請求,defaults 設置后臺請求地址
    import axios from 'axios';
    axios.defaults.baseURL = "http://localhost:3000"
    
    // 引入相關的圖片, 命名要和后臺保持一致
    import lotus from './img/lotus.jpg';
    import carnations from './img/carnations.jpg';
    import peony from './img/peony.jpg';
    
    export default {
     data() {
     return {
     flowers: [], 
     lotus,
     carnations,
     peony
     };
     },
     methods: {
     getFlower() {
     axios.get('/flowers')
     .then(res => {
     if(res.status === 200 && res.data.code === 0) {
     this.flowers = res.data.obj;
     }
     })
     }
     }
    };
    

    我以為成功了,點擊按鈕發送請求,但是看到的如下畫面,沒有圖片

    當時想不通,img 的src 綁定的是變量,它和defaultImg 不應該是一樣嗎?打開瀏覽器控制臺,看到如下內容,img 的src 已經是一個字符串,它不是我們想要的變量了。

    我想這里可能是它對item.EnName進行了一次解析變成了字符串,就完事了,綁定變量,就是解析一次。而對于defalutImg 來說,它本來就是變量,無法再進行分割解析,所以它會去data 里面去找,如果找不到,才報錯。

    那么我們現在要做的就是把item.EnName 變成圖片的地址,這樣進行一次解析的時候,直接去讀取圖片。要怎么做到呢?當時 我也不是很清楚,就百度了一下,有人提到了require 方法, require 一個圖片路徑,我想require 什么,以前沒有聽說過require 這個關鍵字啊。想了一段時間,突然就明白了,require 是一個commonJs 規范的關鍵字,當我們在寫node 代碼的時候,都是有require 去讀取資源的。在前端js 中,一直使用import,直接忘記了,不知道怎么用了。webpack 把img 當做一種資源,所以使用時要先引進。引進方式有兩種,一種是import , 一種是require, 因為webpack 同時支持ES6 module 和 commonJs 規范. import 是個語句,只能在js 代碼頂部使用, 而require 不一樣,它是一個表達式,可以進行賦值操作。我們試一下,用require 引入圖片是怎么樣的效果,在 script 標簽時,寫下

    var img = require('./img/lotus.jpg');
    console.log(img);

    刷新瀏覽器,在控制臺上可以看到如下輸出

    正好是圖片的路徑,也正是我們想要的內容,剛才也說了,require是一個表達式,它可以用到任何js 表達式能用到的地方。我這時就想,把后臺返回的代碼進行重新組裝,EnName 直接是圖片路徑。getFlower 方法修改如下

    getFlower() {
     axios.get('/flowers')
     .then(res => {
     if(res.status === 200 && res.data.code === 0) {
     this.flowers = res.data.obj.map(item => {
     return {
     CnName: item.CnName,
     EnName: require(`./img/${item.EnName}.jpg`) // 利用require 引入圖片,獲得圖片路徑
     }
     })
     }
     })
     }

    這時刷新瀏覽器,點擊按鈕發送請求,可以看到圖片了并且一一對應, 成功了。

    這時又一想,既然require 是一個表達式,在template模版中是直接可以解析js 表達式,那么直接把img 的src 綁定到require 表達式就可以了,把getFlower 方法,回退到上一次代碼,然后template 代碼如下

    <ul>
     <li v-for ="item in flowers" :key="item.EnName">
     <img :src="require(`./img/${item.EnName}.jpg`)" alt="flowers">
     <p>{{item.CnName}}</p>
     </li>
     </ul>

    同樣也成功了。

    最后寫代碼的時候發現,如果讀取的圖片不存在,上面的方法就會報錯,并且沒有辦法處理。這時還要回到js 的代碼處理。我又把html代碼回到以前,然后在getFlower方法中進行錯誤處理,既然讀取報錯,我們讀取的代碼就放到try中, 如果有報錯,就在catch 看處理,提供一個默認圖片,try catch 處理讀取異常。 try catch 的邏輯

     try {
     img = require(`./img/${item.EnName}.jpg`);
     } catch (err) {
     img = require('./img/lotus.jpg');
     }

    整個app.vue

    <template>
    <div id="app">
     <button @click='getFlower'>點擊加載請求</button>
     <ul>
     <li v-for ="item in flowers" :key="item.EnName">
     <img :src="item.EnName" alt="flowers">
     <p>{{item.CnName}}</p>
     </li>
     </ul>
    </div>
    </template>
    
    <script>
    // 引入axios,用于發送請求,defaults 設置后臺請求地址
    import axios from 'axios';
    axios.defaults.baseURL = "http://localhost:3000";
    
    export default {
     data() {
     return {
     flowers: []
     };
     },
     methods: {
     getFlower() {
     axios.get('/flowers')
     .then(res => {
     if(res.status === 200 && res.data.code === 0) {
     this.flowers = res.data.obj.map(item => {
     var img = null;
     try {
     img = require(`./img/${item.EnName}.jpg`);
     } catch (err) {
     img = require('./img/lotus.jpg');
     }
    
     return {
     CnName: item.CnName,
     EnName: img
     }
     })
     }
     })
     }
     }
    };
    </script>
    

    以上這篇解決vue的 v-for 循環中圖片加載路徑問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    解決vue的 v-for 循環中圖片加載路徑問題

    解決vue的 v-for 循環中圖片加載路徑問題:先看一下產品需求,如下圖所示, 產品要求圖片和它的名稱一一對應,本來是非常簡單的需求,后臺直接返回圖片路徑和名稱,前臺直接讀取就可以了,但是我們沒有存儲圖片的服務器,再加上是一個實驗性的需求,圖片需要存放到前臺。當時我想,vue 中的img 的s
    推薦度:
    標簽: 圖片 的圖片 加載
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久精品国产亚洲Aⅴ香蕉 | 欧美+亚洲+精品+三区| 国产精品亚洲专区无码WEB| 精品麻豆丝袜高跟鞋AV| 亚洲精品无码你懂的网站| 国产高清在线精品一区二区| aaa级精品久久久国产片| 无码人妻精品一区二区三区久久 | 国产AV午夜精品一区二区三区| 中文字幕精品久久| 免费精品视频在线| 国产精品福利电影一区二区三区四区欧美白嫩精品| 国产精品免费AV片在线观看| 亚洲精品宾馆在线精品酒店| 久久精品国产亚洲5555| 精品欧美一区二区三区久久久| 93精91精品国产综合久久香蕉| 97久久精品人妻人人搡人人玩| 久久久久人妻精品一区| 日韩精品内射视频免费观看| 中文字幕日韩精品无码内射 | 香港三级精品三级在线专区| 精品日本一区二区三区在线观看| 中文字幕亚洲精品资源网| 青草青草久热精品视频在线网站| freesexvideos精品老师毛多| 精品国产福利在线观看| 国产午夜福利精品久久2021| 精品亚洲成a人片在线观看 | 成人国产精品日本在线观看| 午夜精品美女写真福利| 久久精品中文闷骚内射| 国产精品九九久久免费视频| 亚洲精品成人av在线| 一区二区精品在线| 91精品国产高清久久久久久91 | 国产精品hd免费观看| 日韩精品国产自在久久现线拍| 97在线精品视频| 影音先锋国产精品国语对白| 国产精品福利在线观看免费不卡 |