日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue的 v-for 循环中图片加载路径问题

發布時間:2024/4/15 vue 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue的 v-for 循环中图片加载路径问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

  產品要求圖片和它的名稱一一對應,本來是非常簡單的需求,后臺直接返回圖片路徑和名稱,前臺直接讀取就可以了,但是我們沒有存儲圖片的服務器,再加上是一個實驗性的需求,圖片需要存放到前臺。當時我想,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>

?

轉載于:https://www.cnblogs.com/SamWeb/p/8519735.html

總結

以上是生活随笔為你收集整理的vue的 v-for 循环中图片加载路径问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中国特级黄色大片 | 亚洲精品乱码久久久久久9色 | av毛片观看| 深爱综合网 | 屁屁影院一区二区三区 | a级网站在线观看 | 在线观看亚洲一区 | 欧美激情一区二区三区蜜桃视频 | 中文字幕日韩无 | 色中文网| 欧美午夜寂寞影院 | 国产成人精品999在线观看 | 黄色高清网站 | 亚洲网站免费 | 欧美成人一区二区三区四区 | 悠悠av| 日本午夜视频在线观看 | 大伊人久久 | 成人激情电影在线观看 | 理论片第一页 | 大桥未久av在线播放 | 亚洲一区二区三区成人 | 日本中文字幕不卡 | 国产精品不卡在线观看 | 黑人操白妞 | 毛片你懂的 | www夜片内射视频日韩精品成人 | 在线国产视频一区 | 国产精品成人网站 | 手机看片在线观看 | 国产精品福利电影 | 国产精品视频一区二区三区 | 丝袜视频一区 | 久久只有精品 | 亚洲欧美一区二区三区在线观看 | 亚洲精品视频三区 | 男人天堂999 | 91老女人 | 国产淫语对白 | 免费av网站在线看 | 无码人妻丰满熟妇啪啪欧美 | 日韩高清在线播放 | 一区二区三区爱爱 | 一区不卡在线观看 | 久久久久亚洲AV成人无在 | 国产草逼视频 | 中文字幕在线网址 | 久久久久性色av无码一区二区 | 麻豆国产在线 | 北岛玲av| 久久久免费在线观看 | 精品视频免费在线 | 中文字幕第66页 | 日韩福利视频在线观看 | 欧美做爰全过程免费看 | 无码国产精品96久久久久 | 大桥未久av在线 | 91av视频 | 精品国产第一页 | 日韩国产成人无码av毛片 | 噼里啪啦免费看 | 黑人黄色一级片 | 99热这里只有精品久久 | 美国黄色片网站 | 亚洲国产精品成人av | 在线视频福利 | 国产激情精品一区二区三区 | 精品欧美乱码久久久久久1区2区 | 九色91popny蝌蚪 | 欧美日韩在线视频免费播放 | 欧美黑人一区二区 | 日本美女黄网站 | 一本久久久 | 中文字幕亚洲色图 | 加勒比日韩| 成人一区二区视频 | 欧美日韩成人一区二区三区 | 最新成人在线 | 啦啦啦av | 成人日韩在线观看 | 69视频入口| 邵氏电影《金莲外传2》免费观看 | 欧美色88 | 午夜国产在线观看 | 久久久久久婷 | 欧美黄大片 | 久久婷婷成人综合色 | av在线天天 | 操亚洲美女 | 国产绿帽刺激高潮对白 | 亚洲成人免费av | 国产精品国产一区二区三区四区 | 激情av在线播放 | 国产色a| 青草青草久热 | 国产精品毛片一区视频播 | 久久成人网18网站 | 免费黄网站在线看 | 日韩在线观看免费高清 |